EasyLanguage研究所

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

WebBrowserクラスを発見したので自作ブラウザをワークスペース上に表示させてみました

トレードステーションに初期搭載されているトレーディングアプリの中に「ブラウザ」があります。URLを入力するとそのページがワークスペース内で表示されるだけなので、正直これだけなら別でブラウザ開いていた方が良いです(笑)

しかし、オブジェクト指向EasyLanguageを調べてみると、WebBrowserクラスを発見しました。おそらく「ブラウザ」アプリもこれを使っているのだと思います。プロパティやメソッドやイベントも、.NET Frameworkと同じ感じですね。

以下、フォーム上のテキストボックスにURLを入力して「実行」ボタンを押すとページが表示される、単純なアプリです。(入力チェックや細かい例外処理は省いています)

フォーム設定

コントロール 名前
フォーム frmMain
テキストボックス txtUrl
ボタン btnButton
ブラウザ wbrMain


コード

using elsystem;

method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) 
begin
	Try
		txtUrl.Text = "http://eltraders.hatenablog.com/";
		frmMain.Show();
		
	Catch (Exception ex)
		Print( "Error: ", string.format("{0} | {1}[StackTrace]{2}", ex.Source, ex.Message, ex.StackTrace) );
	End;
end;

method void btnRun_Click( elsystem.Object sender, elsystem.EventArgs args ) 
begin
	Try
		wbrMain.Navigate(txtUrl.Text.Trim());
		
	Catch (Exception ex)
		Print( "Error: ", string.format("{0} | {1}[StackTrace]{2}", ex.Source, ex.Message, ex.StackTrace) );
	End;
end;

動作イメージ
f:id:eltraders:20170701125138p:plain

これだけだとあまりメリットが無さそうですが、WebBrowserクラスのプロパティ・メソッド・イベントを活用する事で・・

  • ログインが必要なWebページへ自動ログインする
  • 表示したWebページから情報を読み出す(Webスクレイピング
  • 自作した他アプリと外部Webページの連携

などもできる・・はず!

WebBrowserクラス、さらに詳しく調べてみようと思います。

TrendLineクラスでEasyLanguageからトレンドラインを引く(マニュアル掲載コードの修正版あり)

オブジェクト指向EasyLanguageのTrendLineクラスを使うと、EasyLanguage上から自動でトレンドラインを引く事ができます。

トレンドラインは、通常のEasyLanguageでもTL_Newで引く事ができますが、TrenLineクラスの方は開始位置と終了位置を「現在の足から●個前の足」といった感じで指定できますし、トレンドラインの描画スタイルなどもクラスとしてまとめて設定できるので、何かと便利だと思います。

で、このTrendLineクラスなんですが、トレードステーション付属マニュアルに掲載されているサンプルコードを実際に動かしてみると上手く動きませんでした・・。どうもコードが間違っているような気がします。

以下、マニュアル掲載のコードです。(CloseをHighにするなど、一部改変しています)

using elsystem.drawingobjects;

Vars:
	TrendLine varTrendLine1(null),
	BNPoint varBNPoint1(null),
	BNPoint varBNPoint2(null);

If LastBarOnChart then Once Begin
	varBNPoint1 = BNPoint.Create( BarNumber - 20, High[20] );
	varBNPoint2 = BNPoint.Create( BarNumber, High );
	
	varTrendLine1 = TrendLine.Create( varBNPoint1, varBNPoint2 );
	varTrendLine1.Persist = True;
	varTrendLine1.Style = 2;
	DrawingObjects.Add( varTrendLine1 );
End;


コードのコメントを見ると、「20個前の足から現在の足までの価格を繋いだトレンドラインを描画する」事が目的のコードなんですが、これを日足チャートに適用してみると、以下のようになりました。(最終日の足が2017/6/23、分析に用いる足の最大本数「MaxBarsBack」は、50としています)

f:id:eltraders:20170624124816p:plain

・・あさっての方向にトレンドラインが引かれていますね。笑

現在の足が2017/6/23なので、

・開始位置:2017/5/26 8,965円
・終了位置:2017/6/23 9,242円

でトレンドラインが引かれるはずなんですが、トレンドラインをクリックして情報確認すると・・

・開始位置:2017/3/14 8,965円
・終了位置:2017/4/12 9,242円

となっていました。

価格はあっているので、これは開始位置&終了位置を定義するBNPointの設定に問題があるのでは?と思い調べてみると、案の定BNPointクラスのマニュアルに掲載されているコードでは、現在の足番号に「MaxBarsBack-1」を加えていました。BarNumberはCurrentBarと同じくMaxBarsBackを除いた最初の足を1として番号が振られるのですが、BNPointによる指定はMaxBarsBackも含めた番号を指定してあげる必要があるようです。

最後に「-1」となっているのは、BarNumberやCurrentBarは1から始まるのに対して、BNPointで指定する足番号は0から始まるためです。

以下、修正してみたコード。9行目と10行目以外は元と同じです。

using elsystem.drawingobjects;

Vars:
	TrendLine varTrendLine1(null),
	BNPoint varBNPoint1(null),
	BNPoint varBNPoint2(null);

If LastBarOnChart then Once Begin
	varBNPoint1 = BNPoint.Create( MaxBarsBack + BarNumber - 21, High[20] );
	varBNPoint2 = BNPoint.Create( MaxBarsBack + BarNumber - 1, High );
	
	varTrendLine1 = TrendLine.Create( varBNPoint1, varBNPoint2 );
	varTrendLine1.Persist = True;
	varTrendLine1.Style = 2;
	DrawingObjects.Add( varTrendLine1 );
End;


これで、以下のように 2017/5/26 から 2017/6/23 まで、正しくトレンドラインが自動描画されました。

f:id:eltraders:20170624124752p:plain

上のコードは分析テクニックやストラテジーでも使えるので、トレンドラインを利用した売買戦略の開発にも活用できそうです。ぜひ使ってみてください。

※ マニュアル掲載のコードについては、英語版TradeStationのマニュアルを見ても同じだったので、翻訳時のミスというわけではなさそうですが、また何か分かったら追記したいと思います。

関数の引数やクラスのプロパティの型(クラス)が分からない→そうだGetTypeを使おう

トレードステーション標準のマニュアルって、関数の引数やクラスのプロパティの型が「Object」になっている事、多いです。

Objectはあらゆるクラスの基底クラスなので、「実際の型(クラス)は何なの?」と調べたい時は、ObjectクラスのメソッドであるGetTypeを使いましょう。

ちょうどPriceSeriesProviderを使っている時に、「Data」や「Open」といったプロパティが何の型(クラス)なのか?という情報が必要だったので、以下のようにGetTypeの結果を印刷ログウィンドウへ出力してみました。

vars:
    PriceSeriesProvider oPsp;

//
// PriceSeriesProviderで
// 価格情報を取得する命令をごにょごにょ書く
//

Print(oPsp.Data.GetType().ToString());
Print(oPsp.Open.GetType().ToString());

<出力結果>
tsdata.marketdata.PriceSeries
tsdata.marketdata.DoubleSeries

このように、今回はPriceSeriesProvider関連で用意されているクラスである事が判明しました。

僕もすべてのクラスを把握しているわけではないので、よく分からない時はこのようにGetTypeで型をチェックするようにしています。

新たな処理の記述に使えるのはもちろん、そもそも知らなかったクラスの発見にもなるので、一石二鳥です。

GetType、ぜひ使ってみてください。