EasyLanguageでTradeStationとExcelの連携

# はじめに  
EasyLanguageとはマネックス証券提供の株式取引ツールTradeStationで使われている独自言語です。
EasyLanguageを使って、TradeStationとエクセルの連携する方法をまとめました。

## 目次
・流れ
・Workbookクラス
・おまけ　EasyLanguageのコンポーネントを使って楽をする
・発展

##流れ
- 読み込む(書き込む)Excelワークブックかスプレッドシートを用意します。
- TradeStationからEasyLanguage開発環境を開きます。
- 新規インジケーターを開きます。
- 作成したインジケーターをチャートに挿入します。
<br>(TradeStationでEasyLangageのプログラムを利用するにはチャートやレーダースクリーンにインジケーターを挿入する必要があります。)


## Workbook クラス
Workbookを使用すると、指定したExcelワークブックやスプレッドシートのセルに対する値を読み取って<br>TradeStation上で使用出来たり、TradeStation上の値を書き込んだりすることが可能になります。

###読み込み
読み込むExcelには日経平均先物売買高上位のABNアムロクリアの日経先物手口の日次データが入っています。
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528794/a509181e-4b3e-bb82-4871-be19345111fb.png)
"日通し"(2～4列目,4行目)のデータを取得します。

```
using elsystem.office.excel;

Vars:
    Workbook ElWbRead(NULL),
    String iFileName1("C:\TradeStation\WbRead.xlsx"), 　 //準備したエクセルの保存フォルダと、ファイル名
    int cnt(0);

Once begin
    ElWbRead = new Workbook;
    ElWbRead.FileName = iFileName1;
    ElWbRead.Load = true;                        　　　　　　　     //おまけで説明しています
    ElWbRead.SaveOnClose = True;
End;

For cnt = 0 to 29 begin
    Plot1[cnt]((ElWbRead.sheets[1].CellsAsInt[2,cnt+4]),"買い ");　　//2列目4行目の値を取得
    Plot2[cnt](-(ElWbRead.sheets[1].CellsAsInt[3,cnt+4]),"売り ");
    Plot3[cnt]((ElWbRead.sheets[1].CellsAsInt[4,cnt+4]),"差し引き ");
end;
```
日経平均先物の日足チャートに挿入してみました。
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528794/bc67adaa-0576-412a-4d62-bf655886004f.png)
30営業日分しかデータを用意できなかったので、わかりにくいですね...


###書き込み
TradeStation上のチャートに表示されている4本値と出来高をExcelに書き込みます。
![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528794/e13eb024-c5f6-9ea9-9551-e89a2b4b19d1.png)


```
using elsystem.office.excel;

Vars:
    Workbook ElWbWrite(NULL),
    String iFileName2("C:\TradeStation\WbWrite.xlsx"),
    int cnt(0);
    
Once begin
    ElWbWrite = new Workbook;
    ElWbWrite.FileName = iFileName2;
    ElWbWrite.Load = true;
    ElWbWrite.SaveOnClose = True;
End;

for cnt = 0 to 90 begin
    ElWbWrite.sheets[1].CellsAsInt[1,cnt+2] = Date[cnt] ;      //予約語 Date：足の日付を取得
    ElWbWrite.sheets[1].CellsAsInt[2,cnt+2] = Open[cnt] ;      //予約語 Open：足の始値を取得
    ElWbWrite.sheets[1].CellsAsInt[3,cnt+2] = High[cnt] ;      //予約語 High：足の高値を取得
    ElWbWrite.sheets[1].CellsAsInt[4,cnt+2] = Low[cnt] ;       //予約語 Low：足の安値を取得
    ElWbWrite.sheets[1].CellsAsInt[5,cnt+2] = Close[cnt] ;     //予約語 Close：足の終値を取得
    ElWbWrite.sheets[1].CellsAsInt[6,cnt+2] = Volume[cnt] ;     //予約語 Volume：足の出来高を取得
end;
```
日経平均先物の日足チャートに挿入してみました。
Excelはこうなりました。(EasyLanguage独特の日付表記で、「1191203」先頭の数字1が西暦2000を表しています。)
![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528794/6942e1dc-1466-1bc7-86f0-948f79fd0a24.png)


# おまけ　EasyLanguageのコンポーネントを使って楽をする
EasyLanguage でより簡単にオブジェクトの追加と使用ができるように、一部のオブジェクト クラスはコンポーネントとして設計されています。
オブジェクトを EasyLanguage ドキュメントへドラッグ & ドロップして特別なエディターを使用するだけで、コードを記述せずにオブジェクトのプロパティを変更できます。

コンポーネントオブジェクトが EasyLanguage ドキュメントに追加されると、プロパティエディターで各オブジェクトを使用できるように設定することができます。

あとは、予約語や関数を参照するように、各オブジェクトのプロパティとメソッドにアクセスする独自の EasyLanguage ステートメントを記述するだけです。

### コンポーネントオブジェクトの挿入
1. TradeStation開発環境の左側にある [ツールボックス] タブをクリックして [ツールボックス] パネルを開きます。<br>追加したいコンポーネントをクリックして現在のEasyLanguageドキュメントに追加します。
![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528794/327d3712-00bf-f3e0-c988-52036fb392ba.png)
2. 挿入すると、コンポーネントのアイコンがエディターウインドウの下にあるコンポーネントトレイに表示されます。
![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528794/56c5d69f-8dc8-2f47-1ad8-a6f94814e347.png)
3. TradeStation開発環境
の右側にある [プロパティ] タブをクリックして、[プロパティ] エディターを開きます。<br>このエディターでは、コンポーネント値、入力値、イベントを管理・変更できます。
![スクリーンショット (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528794/a9fb07e5-98f8-8673-cec4-fc9340dae01d.png)

<コンポーネントのプロパティ名と値>

|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|タ&nbsp;&nbsp;イ&nbsp;&nbsp;プ|説&nbsp;明|
|:--------------------:|:------|:----------------------------------------------------------------------------------------------:|
|  ActiveSheet         |integer|アクティブなワークシートのインデックス番号を取得または設定する                                　    |
|  FileName            |string |コンピューター上の Excel(スプレッドシート)の<br>パスおよびファイル名を指定する                      |
|  Load                |boolean|真の場合、リアルタイムでExcel(スプレッドシート)を更新する                                          |
|  SaveOnClose         |boolean|真の場合、接続を閉じたときに<br>Excel(スプレッドシート)に加えた変更を保存する                       |
|  Shared              |boolean|真の場合、複数のWorkbookオブジェクトで<br>1つのExcel(スプレッドシート)を共有する              　|
|  SheetCount          |integer|ワークブック内のシート数を指定する                                                                 |
|  Sheets<br>[index]   |object |使用可能なシートのインデックスに基づき<br>Sheetを取得する                                   　      |
|Sheets<br>[sSheetName]|object |指定したシート名文字列に基づき<br>Sheetを取得する                                     　           |
|  Visible             |boolean|真の場合は接続時にExcel(スプレッドシート)を表示する|

### コンポーネントを使った場合のコードは下記の分だけで済みます。
読み込み

```
Vars:
    int cnt(0);

For cnt = 0 to 29 begin
    Plot1[cnt]((ElWbRead.sheets[1].CellsAsInt[2,cnt+4]),"買い ");
    Plot2[cnt](-(ElWbRead.sheets[1].CellsAsInt[3,cnt+4]),"売り ");
    Plot3[cnt]((ElWbRead.sheets[1].CellsAsInt[4,cnt+4]),"差し引き ");
end;
```
書き込み

```
Vars:
    int cnt(0);

for cnt = 0 to 90 begin
    ElWbWrite.sheets[1].CellsAsInt[1,cnt+2] = Date[cnt] ;      //予約語 Date：足の日付を取得
    ElWbWrite.sheets[1].CellsAsInt[2,cnt+2] = Open[cnt] ;      //予約語 Open：足の始値を取得
    ElWbWrite.sheets[1].CellsAsInt[3,cnt+2] = High[cnt] ;      //予約語 High：足の高値を取得
    ElWbWrite.sheets[1].CellsAsInt[4,cnt+2] = Low[cnt] ;       //予約語 Low：足の安値を取得
    ElWbWrite.sheets[1].CellsAsInt[5,cnt+2] = Close[cnt] ;     //予約語 Close：足の終値を取得
    ElWbWrite.sheets[1].CellsAsInt[6,cnt+2] = Volume[cnt] ;     //予約語 Volume：足の出来高を取得
end;
```

# 発展
EasyLanguageでは、長期投資でも短期トレードでも使えるテクニカルデータやファンダメンタルズデータが
予約語としてそろえられています。

私が２年以上使ってきて足りないなと思ったのは浮動株数(比率)や投資部門別売買状況、先物の手口情報ぐらいです。(普通どこの証券会社のツールでも表示していませんが)

Workbookクラス(コンポーネント)を使えば、楽に、さまざまな情報をチャート上に表示したり、データを使って自動売買システムを作れます。

岡三RSSと連携させれば、TradeStationでは対応していない先物でも、自動売買することができるようになります。