EasyLanguage研究所

マネックス証券が提供する株式トレードツール「TradeStation」専用のプログラミング言語である、EasyLanguageについて。特にオブジェクト指向型EasyLanguage(OOEL)の情報を中心に。

複数の銘柄コードをEasyLanguageで扱う方法(3)カスタムシンボルリストのファイルを読み込み

前々回と前回で、EasyLanguageで複数の銘柄コードを扱う方法について2つご紹介しました。

eltraders.hatenablog.com

eltraders.hatenablog.com

今回は最終回という事で、固定のカスタムシンボルリストをEasyLanguage上から直接読み込んで、銘柄コード一覧を取得する方法を紹介します。

この方法を使うと、フォームを利用しないアプリでもカスタムシンボルリストが扱えるので、自分専用の分析アプリやバッチ系処理アプリを作る時なんかに便利かと思います。

方法3:カスタムシンボルリストのテキストファイルを直接読み込む

色々調べてみたんですが、シンボルリスト名を指定すれば銘柄コード一覧が取得できる関数・・といったものは残念ながら用意されていないようです。

で、どうにか出来ないかなーと思っていたんですが、ふとトレードステーションのファイル構成を調べている時に「カスタムシンボルリスト」が保管されているフォルダを発見しました。(TradeStationがインストールされているフォルダの「Custom Symbol Lists」フォルダ)

これを見ると、カスタムシンボルリストは拡張子が「.csl」のファイルとして保管されているんですが、ファイルの中身を見ると単純にCSV形式のテキストファイルなんですね。

↓こんな感じのファイル
f:id:eltraders:20170612172153p:plain

オブジェクト指向EasyLanguageでは、PC内のファイルを読み込む事ができるStreamReaderクラス(名前空間:elsystem.io)が用意されています。

という事はつまり、利用したいカスタムシンボルリストのファイルをStreamReaderクラスで読み込んで必要な情報のみ取り出せば、銘柄コード一覧が取り出せる・・?

という事で、書いてみたのが以下のコードです。フォーム上に3つのコントロールを配置しています。

TextBox txtSymbolListName カスタムシンボルリスト名を入力(デフォルトで「ブログテスト用」を設定)
Button btnRun 実行ボタン
TextBox(MultiLine) txtResult 取得した銘柄コード一覧を表示
using elsystem;
using elsystem.io;
using elsystem.windows.forms;

method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) 
begin
	txtSymbolListName.Text = "ブログテスト用";
	frmMain.Show();
end;

method void btnRun_Click( elsystem.Object sender, elsystem.EventArgs args )
var:
	StreamReader myFile,
	string lineText,
	string strResult;

begin
	txtResult.Text = "";
	
	myFile = StreamReader.Create("C:/Program Files (x86)/TradeStation 9.5/Custom Symbol Lists/"+txtSymbolListName.Text+".csl"); //ここのパスはインストール場所により変わります
	
	strResult = "";
	While myFile.EndOfStream = false Begin
		lineText = myFile.ReadLine();
		If lineText.Trim() <> "" and
		   Not lineText.StartsWith(";") then Begin
			strResult = strResult + lineText.Split(",")[0].toString().Replace(DoubleQuote,"") + NewLine;
		End;
	End;
	txtResult.Text = strResult;
	
	myFile.Close();
end;

メリット

  • カスタムシンボルリスト名だけで取得できるので、ダイアログが不要。
  • EasyLanguage上でカスタムシンボルリスト名も指定すれば、フォームも不要で取得可能。(全自動化)

デメリット

  • 「TradeStation銘柄リスト」や「マネックス銘柄リスト」は取得できない。
  • パス指定になるので、将来的にファイルやディレクトリの構成が変わったら修正が必要。

「TradeStation銘柄リスト」や「マネックス銘柄リスト」が扱えないのが残念ですが、同様のものをカスタムシンボルリストとして用意しておけば対応はできるかなと思います。

何より、ダイアログやフォーム不要で全自動化できますし、コードをいじらずに銘柄コードの追加削除が行なえるのが嬉しい点です。

さらに例えば「スキャナー」などはスキャン結果をカスタムシンボルリストとして自動生成してくれるので、他アプリと連携もしやすくなると思います。

以上、EasyLanguage上で複数の銘柄コードを扱う3つの方法をご紹介してきました。

どれがベストの方法なのかは状況によって異なると思います。ぜひ色々試して、使い分けてみてください。

ではでは。

複数の銘柄コードをEasyLanguageで扱う方法(2)シンボルリスト選択ダイアログの利用

前回の続き。前回は配列で直接定義することで、複数の銘柄コードを扱う方法をご紹介しました。

eltraders.hatenablog.com

今回は『シンボルリスト』選択ダイアログを利用する方法についてご紹介します。

方法2:『シンボルリスト』選択ダイアログを利用

トレードステーションには『シンボルリスト』という機能があり、銘柄コードをまとめてグループ化しておくことができます。標準で「TradeStation銘柄リスト」「マネックス銘柄リスト」などがいくつか用意されていますし、カスタムシンボルリストでは独自の銘柄コードグループを作成する事もできます。

で、レーダースクリーンなどでは、シンボルリストを選択することで登録されている銘柄コードを一括挿入されるような機能がありますが、この時表示される選択ダイアログをオブジェクト指向EasyLanguageでは扱う事が可能なんです。

↓コレ
f:id:eltraders:20170612164931p:plain

クラス名は「SymbolListDialog」です。名前空間「elsystem.windows.forms」内にあります。このクラスを使う事で、フォーム上でシンボルリストの選択ダイアログを表示し、選択された銘柄コードに対して何か処理を実行するようなアプリを作ることが可能になります。

以下例として、起動するとシンボルリスト選択ダイアログが表示され、選択すると印刷ログに選択したシンボルリスト内の全銘柄コードが出力されるEasyLanguageコードになります。

using elsystem;
using elsystem.windows.forms;

vars:
	SymbolListDialog sld(null);
	
method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) 
begin
	sld = SymbolListDialog.Create();
	sld.StatusChanged += OnSymbolListUpdate;
	sld.show();
end;

method void OnSymbolListUpdate( elsystem.Object sender, elsystem.windows.forms.DialogStatusChangedEventArgs args )
begin
	For Value0 = 0 to sld.Count - 1 Begin
		Print( sld.Symbols[Value0] );
	End;
end;

SymbolListDialogクラスのStatusChangeイベントは、シンボルリストが選択してダイアログが閉じた時に発生するので、このイベントを拾ってやれば選択されているシンボルリストの銘柄コード一覧が取得できます。

メリット

  • ユーザーが自由に銘柄を選択できるアプリが作れる。
  • 「TradeStation銘柄リスト」や「マネックス銘柄リスト」など、事前に用意されているシンボルリストも扱う事が可能。
  • 「カスタムシンボルリスト」も扱えるので、アプリ専用のカスタムシンボルリストを用意して管理する事も可能。

デメリット

  • ダイアログ表示と選択が必要になるので、バッチ系など全処理を自動化させたい場合は不向き。

ユーザーが自由にシンボルリストを選べるようにするなら、他のトレーディングアプリでも利用されているこの選択ダイアログを使うのが一番よいかと思います。

ただ、自分だけが使う分析用アプリなどを作りたい場合は、アプリ専用に用意したカスタムシンボルリストだけを毎回利用するといった事もあるでしょう。この場合、毎回ダイアログが表示されて選択しなければいけないのは、ちょっと操作が面倒です・・。

パス指定してファイルを読み込む時のように、カスタムシンボル名を指定すれば自動で銘柄コード一覧が取得できる方法がないものか?色々調べてみたんですが、1つ方法があったので次回ご紹介します。

複数の銘柄コードをEasyLanguageで扱う方法(1)配列で直接定義

トレーディングアプリ開発をしていると、EasyLanguage上で複数の銘柄コードを扱いたい場合が出てきます。

  • 複数の銘柄コードに対して、株価情報などの取得を一括で行ないたい
  • ドロップダウンリストで銘柄コード一覧を表示させ、フォーム上で銘柄コードを選択できるようにしたい

この時、複数の銘柄コードをどのように管理するのか?が問題になってきます。EasyLanguageでは3つの方法で管理できそうなので、それぞれメリットとデメリットを挙げてみます。

方法1:配列で直接定義

最もベタなやり方は、配列を利用して直接記述する方法でしょうか。利用したい銘柄コードだけを配列に格納する感じですね。

配列の定義は変数と似た感じですが、変数が「Vars:」などの予約語で定義するのに対し、配列は「Array:」になります。変数と配列て定義を分けなければいけないので、他のプログラミング言語に慣れている方は少しご注意を。

Array:
	string arSymbol[224]("");

arSymbol[0] = "1332";
arSymbol[1] = "1333";
//以下続く・・

メリット

  • 記述がシンプルです。
  • 直接記述なので、処理速度としても多分一番速いと思います。
  • アプリで利用する銘柄コードたちが固定で決まっている場合は、これが一番ラクです。

デメリット

  • 銘柄コードごとに1行記述する必要があるので、追加や削除が面倒です。
  • 銘柄コードの追加削除があると、配列の要素数も変更する必要があります。
  • 銘柄コードの追加削除があると、EasyLanguageを再検証しなければなりません。

アプリを起動しながら銘柄コードの追加削除をしたい場合や、対象の銘柄コードが頻繁に変わる場合は向いていませんが、そうでない場合は一番シンプルな方法です。

僕も、自分だけが使う分析用アプリを作る時はこのやり方で済ませる事が多いです。

銘柄コードをアプリのフォーム上で選択させたい場合や、対象の銘柄コードが頻繁に変わる場合は、『シンボルリスト』をうまく使うと良いです。これについては次回・・。