So-net無料ブログ作成

日中足で現在値の水平線(オブジェクトの作成について) [Indicator]

坂本さんの質問をもとに、5分足で水平線描画ができるようになるまでの試行錯誤を説明しておきます。
他のオブジェクト利用する際にも参考になると思うのですが。
EasyLanguageでラインを引くコードを書いたことはないのでヘルプで検索します。
ヘルプは起動と検索が重く、しかも検索で目的の予約後がヒットしづらい印象があり加えて専門用語や意味不明な日本語訳も多々あるため使いづらいのですが、一番利用価値があると思っています。
*日本語訳といえば、開発環境の下方のアウトプットに「線」とあるのはひどすぎます。
日本語にする必要はないし、せめて行(番号)でしょ。「銘柄名」は意味不明。
また、行番号も正確でないので困ったものです。


さて、ヘルプで「line」を検索してみると、10番目にHorizontalLineが出てきました。
中には「チャートの現在のバーの Close に基づいて水平ラインを追加する方法」が記載されており、ドーロイングオブジェクトについてのヘルプを参考にせよとあります。

VisualStudio等のオブジェクト指向プログラミングを多少理解している方であれば、ドーロイングオブジェクトについてのヘルプを読むだけで水平線の描画コードをかけると思いますが、老婆心ながら自分の解釈を説明しておきます。

「ドローイングオブジェクトについて」のヘルプを見てください。
中段の「EasyLanguageコードへのドローイングオブジェクトの追加」以下の説明です。

まず、水平線はHorizontalLineというオブジェクトとして定義されており、「elsystem.drawingobjects」に分類されています。
一般的に、オブジェクトを利用するには、(1)変数として宣言し(2)初期化(インスタンスの作成)が必要になります。
ヘルプによると、ラインのオブジェクトに関しては、(3)DrawingObjectsに作成したインスタンスを追加しなければならないようで、これで初めて線が描かれるようです。

ヘルプには、さらにイベントハンドラの追加が説明されていますが、これは描画された線をマウス操作などで移動するなど特殊な操作をする場合に必要になりますが、線の描画だけでは必要ありません。
また、ヘルプの例では同時に2点(BNPoint)を通るトレンドラインのような線も同時に描画していますので、これを省きます。

vars: elsystem.drawingobjects.HorizontalLine myHorizLine1(null);	//(1)変数宣言
myHorizLine1 = new elsystem.drawingobjects.HorizontalLine();	//(2)初期化(インスタンス作成)
DrawingObjects.Add(myHorizLine1);	//(3)これでラインが描画される
myHorizLine1.Price = Close;	//newで初期化した場合には線の位置情報を代入する
{
(1)以降はこれでもOK
myHorizLine1 = elsystem.drawingobjects.HorizontalLine.Create(Close);	//位置情報を代入して作成
DrawingObjects.Add(myHorizLine1);
}

これでチャートにインジケーターとして挿入します。
スクリーンショット (79).png
意図に反して複数の水平線が表示されて訳が分かりません。
これは、足ごとに終値の水平線を描いているためです。

変数についての記事を確認してほしいのですが、インジケーターなどの場合チャートの古い時系列から足ごとに同じコードを繰り返して実行しており、変数(数値、文字列、bool)は前の足の値を保持して渡されるようです。
オブジェクトに関しては不明ですが、おそらくインスタンスのポインタアドレスが渡されるのではないかと想像していました。

*上のコードで、CloseをLastに変更すると1本の水平線だけが表示されるので良さそうに思えますが、上の例から考えてみると、同じ位置に繰り返しラインを書いているだけで1本に見えるだけと思われます。
これは自分の想像ですが、メモリも余計に消費したりオブジェクトアドレスが番地不明になってメモリリークになってもおかしくないように思います。
**ちなみに、Lastは現在時刻の最終値を取得するのに対して、Closeは各足([n]:n本前)の終値です。


上の結果を見る限りにおいては、オブジェクト変数は「myHorizLine1」の一つを繰り返し宣言して初期化しているのでオブジェクトは上書きされそうなものですが、DrawingObjectsに繰り返し追加しているため複数の水平線オブジェクトが作成追加されているようです。


トレステのオブジェクトの構造とメモリに関しては全くブラックボックスでわかりませんが、変数の初期化を繰り返すのは問題ないとしてもインスタンスをオブジェクトに繰り返し挿入するのはメモリリーク等の原因にならないのかと不安になります。
一本のラインを表示したいのだから、一つのラインオブジェクトを作成しこれを使いまわして必要なくなればnull代入でオブジェクトを破棄できるのが望ましいと思っています。

*EasyLanguageでオブジェクトの破棄についてはわかりません。null代入は自分が勝手に思い込んでいるだけです。
もしかすると、利用しなくなったオブジェクトは自動的にすべてクリーンアップされるのかもしれません。
ご存知の方いれば教えてください。
**個人的には多少メモリーリークあろうともウィンドウズの再起動でクリアされると思うので、アマチュアのプログラミングでは仕方ないと考えています。
ただし、これが蓄積して実メモリを圧迫してスワッピングが起こるようであればトレード環境としては致命的と思われますので、この危険性を享受できない方にはEasyLanguageでの個人的プログラミングはお勧めできません。


話を戻し、1本のラインだけを描画するためには、各足で繰り返し実行しても1つのオブジェクトを使いまわすコードが必要と考えます。

そこで、最終足だけでオブジェクトを作成追加するために、以下の様に変更してみます。

vars: elsystem.drawingobjects.HorizontalLine myHorizLine1(null);	//(1)変数宣言
If LastBarOnChart then
Begin
	myHorizLine1 = new elsystem.drawingobjects.HorizontalLine();	//(2)初期化(インスタンス作成)
	DrawingObjects.Add(myHorizLine1);	//(3)これでラインが描画される
	myHorizLine1.Price = Close;
End;

LastBarOnChartの場合だけ,ラインオブジェクトのインスタンスを作成して追加しています。
いくら、LastBarOnChartでくくったとしてもティックごとに繰り返し実行しているのは変わりがないはずなので、オブジェクトは複数作成されるような気もしますが、1本のラインがティックごとに上下しているのを見るとティックごとのコードが実行してもオブジェクトは追加作成されるのではなく、使いまわしていると考えられます。
オブジェクトは、アドレスを単に参照しているだけではないような気もしています(よくわからん)。


しかし、このコードでも新たに足が追加されたときにラインが増えてしまいます。
スクリーンショット (77).png


確実にオブジェクトを1個だけ作成するためには、特定のBarNumberを指定して1回のみ初期化と追加を実行するか「Once」で囲んで最初のBarだけで実行します。
あとは、このオブジェクトのプロパティを変更して外見を変えていくという方法です。

vars: elsystem.drawingobjects.HorizontalLine myHorizLine1(null);	//(1)変数宣言
Once
Begin
	myHorizLine1 = new elsystem.drawingobjects.HorizontalLine();	//(2)初期化(インスタンス作成)
	DrawingObjects.Add(myHorizLine1);	//(3)これでラインが描画される
End;
If LastBarOnChart then
Begin
	myHorizLine1.Price = Close;
End;

CloseはLastでもOKです。
スクリーンショット (78).png

LastBarOnChartの中を以下のコードに変更すると、切り上げ型で色を変更することもできます。

	myHorizLine1.Price = Close;
	If High > High[1] and Low > Low[1] then
		myHorizLine1.Color = elsystem.drawing.Color.Red
	Else if High < High[1] and Low < Low[1] then
		myHorizLine1.Color = elsystem.drawing.Color.Green
	Else
		myHorizLine1.Color = elsystem.drawing.Color.Yellow;

チャートの下の余白が増えるようですが、これをなくすにはチャートの「分析テクニックの設定」で追加したインジケータを選択して「設定」ボタンを押して出現する下のプロパティで「スケーリング」「サブグラフ」を非表示にすると良さそうです。
スクリーンショット 2017-01-13 22.22.36.png
スクリーンショット 2017-01-13 22.23.11.png

この他にも、1本前の高値安値で線を引くとか、日付が変更されるたびに終値を変数に保持して前日終値線を引くことも可能と思います(この場合は、BNPointの2点で線を引くことになると思います ヘルプを見てチャレンジしてみてはどうでしょうか)。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。