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としています)

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

現在の足が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 まで、正しくトレンドラインが自動描画されました。

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

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

「株式投資 x IT」の
オンラインコミュニティに参加しませんか?

2019年5月頃から、トレステやEasyLanguageを中心とした株式投資に役立つ最新ツールやITスキルに関する情報が手に入るオンラインコミュニティを運営しています。

トレステやEasyLanguageの豊富な小ネタやサンプルコードが手に入り
チャットツール(Slack)でいつでもトレステやEasyLanguageの質問ができ
毎月開催している勉強会の収録動画がすべて視聴できて
トレステ以外にも株式投資に役立つ最新のツールやITスキルを学べる

オンライン動画講座
時系列分析用サンプルプログラム
OOELサンプルプログラム
Slackでいつでも質問可能

このように、「コンテンツ見放題」「チャット交流」という構成で、僕がが運営しているコミュニティになります。

最近トレステやEasyLanguageを始めたという方から、経験豊富な投資家・プログラマーの方まで、様々な人が集う場となっております。興味のある方はぜひ、ご参加ください。

トレードテック・オンラインの詳細を見る

3 件のコメント

  1. いつも実用的な記事をご提供いただき感謝しております。

    現在は、自動売買用のストラテジーを作成しては、最適化、バックテスト、フォワードテストを実行しているのですが、作成した複数のアプリを自動で連続的に実行することは可能なのでしょうか?
    例えば、各マーケット毎の最適化のアプリを作成しそれらを自動的に順番に実行させたいのですが、現在はその方法がわからないので、逐一ひとつづつアプリを手動で実行しています。
    複数アプリの自動実行が可能ならば、その方法をご教授願えないでしょうか?

    宜しくお願いします。

    1. お世話になります。

      アプリを自動で連続実行・・というのは残念ながらできないですね。

      複数アプリのコードを1つにまとめるしかないかなと思います。よろしくお願い致します。

    2. 追記です。あの後ちょっと考えていたのですが、GlobalValueやGlobalDictionaryなどアプリ間で値を共有できるクラスを使うと、場合によっては連続実行が可能かもしれません。

      例えばアプリAの処理が完了したタイミングでGlobalDictionaryの値を0から1に変更し、アプリBではGlobalDictionaryのイベントItemChanged等を捕捉する事でGlobalDictionaryの内容が変わったタイミングで処理を開始する・・という流れです。

      少し制御がややこしいかもしれませんが、参考にしてみてください。

コメントを残す

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