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

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

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

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

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

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

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

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

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

↓こんな感じのファイル

オブジェクト指向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つの方法をご紹介してきました。

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

ではでは。

9 件のコメント

  1. 初めまして、こちらのサイトを見てOOELを勉強させていただいているものなのです、コメント失礼いたします。プログラミングの知識がないのでオブジェクト指向でつまづいるところをこちらのサイトのおかげで
    日々勉強させていただいております。

    質問なのですが、複数銘柄のバックテストをしたくてOptimization APIをこちらを見て作らせていただいたのですが、銘柄の入力を1つづつ入力するのが大変なので自動で入力できる方法がないか探していたのですがこのページで公開されている方法と組み合わせることなどは可能なのでしょうか?
    もしくわ何か他の方法があればご教授いただけると幸いです。

    これからもこちらで勉強させていただきます、素晴らしいサイトを作っていただきありがとうございます。

    1. YIさん、コメントありがとうございます!
      またサイトご活用いただきありがとうございます(^^)

      はい、配列やカスタムシンボルリストをOptimizationAPIと組み合わせて
      複数銘柄のバックテストを行なう事は可能です。

      手順としては例えば以下のようになります。

      (1) 配列やVectorなどで銘柄を保管する場所を用意
      (2) その配列にバックテストしたい銘柄をすべてセット
      (3) OptimizationAPIにおいて、Forで配列を回しながらJobを生成

      OptimizationAPIのマニュアルで言えば、
      DefineJobメソッド内で銘柄を設定してから
      optimizer.StartJob(job) でバックテストを実施していると思いますので、
      このjobを銘柄ごとに用意してあげれば動作するはずです。
      (別途、jobを保管するための配列も必要です)

      コードが複雑になるので断片的にしかお答えできませんが、
      一度上の手順を参考にコードを考えてみてください。

      よろしくお願い致します。

      1. お返事ありがとうございます。
        またプログラム作成のヒントをありがとうございます。
        自分にはまだ勉強不足でちんぷんかんぷんなのでこれから勉強したいと考えております。
        もし宜しければ、これからOOELを学びたいプログランミング知識皆無の人が学ぶべきことを教えていただけますでしょうか?
        なんとなくC言語なるものを学ぶのが良いような気がするのですが。
        どうぞよろしくお願い致します。

        1. すみません、こちらのコメント見落としておりました。

          確かにプログラミングを本格的に学ぶのであればC言語という選択は良いと思いますが、OOELの概念にある「オブジェクト指向」ではないので、かえって混乱してしまう可能性があるかもしれません。

          ExcelのVBA(マクロ)は実は共通する事も多いので知っておくとよいと思います。また最近人気のPythonも面白いと思います。

          また僕の方でもOOELの講座やセミナーなどを開催していこうと思っていますので、その際はぜひご参加ください。よろしくお願い致します。

  2. 公開していただだいたプログラムをコピーしてAPIを作ってみたいと思いをペーストして検証ボタンを押したところ txtSymbolListName の部分が不明な識別子としてエラーになるのですが原因はお分かりになりますででしょうか?
    ご教授くださいませ。

    1. こちらのご質問についてですが、
      「フォーム」の作成はされていますか?

      txtSymbolListNameは
      フォーム上に配置したテキストボックスの名前になりますので、
      そちらを設定すると上手く動作するかと思います。

      よろしくお願い致します。

  3. はじめまして、最近、色々と拝見させて頂き新たなスクリプトの発見をさせて頂いております。
    トレステは、スキャナーからヒットした銘柄に対して、自動的にストラテジを適用できない事を知り、かなり落胆していました。
    この記事を見て、ふと思ったのですが、シンボルリストにある銘柄を全て自動的にストラテジを適用させる方法はありますでしょうか?

    1. コメントありがとうございます!

      そうですね、スキャナー設定でスキャン結果をシンボルリストとして保存する事ができるので、それを本記事にあるように読み込んで、全ての銘柄をバックテストさせるようなプログラムは作成可能です。(ファイル名の指定などが必要なので完全自動化というわけではないのですが)

      複数銘柄によるバックテストについては、資料が少ない&一部英語表記ではありますが、以下の公式PDFが参考になると思います。

      https://info.monex.co.jp/ts-support-info/files/pdf/EL_OptAPI_guide.pdf

      サンプルコードもありますので参考にしてみてください、よろしくお願い致します。

      1. お返事ありがとうございます。また興味深い資料もお伝え頂きありがとうございました。
        シンボルリストに対する複数銘柄へのバックテストを試してみたいと思います。

ひで へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です