前回の「相場は重力に縛られるのか?S/Rオシレータを作ってみた。」で作ったS/Rオシレータですが効果がありそうでなさそうなよくわかりません。
そこで、検証を目でわかりやすく確認する為、100/0に張り付いている期間をチャート上に帯で表示するようにしてみましょう。
いつぞか書いた「MT4のチャート上に矢印を表示する。」を参考にシグナルが出ている期間を帯上に表示したいと思います。
まず、矩形を描画する為の関数を作成します。
//オブジェクト名 #define WSRO_OBJECT_NAME "WSRO" //------------------------------------------------------------------ //売買シグナルを矩形で描画する。 bool CreateRectangleObject( datetime time, //表示時間(横軸) color backColor //背景色 ) { //オブジェクトを作成する。 long chartId = ChartID(); int period = PeriodSeconds(PERIOD_CURRENT); string name = WSRO_OBJECT_NAME + TimeToStr(time); //チャート縦幅いっぱいに表示する。 double min = 0; double max = ChartGetDouble(chartId, CHART_PRICE_MAX) * 4; if( !ObjectCreate(chartId, name, OBJ_RECTANGLE, 0, time, max, time + period, min) ) { return false; } ObjectSetInteger(chartId, name, OBJPROP_COLOR, backColor); return true; }
前回の記事では、最新のバーにシグナルを一個だけ表示していましたが、今回は、シグナルが出るたびにチャートに表示したいと思います。
そこで、WSRO_OBJECT_NAMEという定数値と描画する時間足の時間を元に名前を生成しました。
ObjectCreateの第3引数にはOBJ_RECTANGLEを指定しています。これは矩形を表しています。
矩形を描画する場合は、第5引数以降に、左上の時間、左上価格、右下時間、右下価格の4つを指定します。
今回、左上の座標として、シグナル発生時間、現在の価格の4倍としています。チャートの縦幅いっぱいに帯を表示する為、十分大きな値として現在価格の4倍を指定しました。
右下の座標は、シグナル発生時間+表示チャートの時間足、0としています。
オブジェクトを作成した後、ObjectSetInteger(chartId, name, OBJPROP_COLOR, backColor);で背景色を設定しています。背景色は関数の外部から渡せるようにしています。
次に、オブジェクトを削除する関数も作成しておきます。
これは最新の値を表示する場合、現在価格によってシグナルが発生したりしなかったりすることを考慮して、現在チャートに表示している帯を消せるようにする為です。
//------------------------------------------------------------------ //オブジェクトを削除する。 bool DeleteRectangleObject( datetime time //表示時間(横軸) ) { //オブジェクトを作成する。 long chartId = ChartID(); string name = WSRO_OBJECT_NAME + TimeToStr(time); if( ObjectDelete(chartId, name) ) { #ifdef DEBUG Print("Ojbect Deleted " + name); #endif } return true; }
こちらの方も、名前を時間から生成して、オブジェクトを削除しています。すでに存在しないObjectを削除しようとした場合、ObjectDelete関数がfalseを返してきます。あらかじめOjbectFindで調べてから消してもいいかな?とも思ったのですが、どうせObjectDelete内で同じことやっているんだろうなと思い、あらかじめ調べるコードは省略しました。
さて、この2関数で表示する準備は完了です。
次回の記事で、これを実際にS/Rオシレータに組み込み表示したいと思います。