このページでは、オブジェクトを使ってアローの勝敗結果を表示する方法について解説します。
エントリー時のアロー表示については、インジケーターバッファを使って表示させました。
勝敗についても同様にインジケーターバッファを使って表示してもいいのですが、せっかくならオブジェクトを使って表示する方法についても紹介したいと思います。
インジケーターバッファとの違い
実は、私の自作したシグナルツールはインジケーターバッファを使わずにオブジェクトを使って表示しています。
初めはインジケーターバッファを使用していたのですが、アローの位置を出せるようになったものの、時間足を変更するとアローが消えたり、変更先の時間足の条件に従ってアローの位置が変わってしまいます。
自分の作ったロジックを1分足で確認しアローを表示させた際に、5分足だとどんなチャート上でアローが出ているのかな?と思っても、せっかくのアローが消えてしまうので不便に感じていました。
そんな時にオブジェクトで作成すると消えずに残すことが出来ることを知り、そこからはオブジェクトで作る方が良いなと感じ、ほとんどがオブジェクトを採用しています。
バックテストを取るだけのコードであれば、インジケーターバッファで作る方が簡単なので、その場合はインジケーターバッファを使っています。
全体の流れのおさらい
全体の流れは以下の通りでした。
- エントリー時間と判定時間を求める
- エントリー中は別のエントリーを行わない
- 判定時刻を迎えたらエントリーと判定時の価格を比較する
- 比較結果から勝敗を決める
- 勝敗結果を出力する
このページでは⑤の部分に該当します。
勝敗結果の出力自体はprintf()関数を使って表現できていますが、せっかくならチャート上に表示できた方が良いので作っていきたいと思います。
以前のページをまだ見てない方は先に見ておくことをお勧めします。
アロー位置の時間を記録する変数の追加
前回までは、エントリー時間と判定時間を計算してそれぞれ変数に代入しておきました。
実際のアロー位置を記録する変数は用意していなかったので、そちらを追加します。
グローバル変数を用意して「time[i]」を代入しているだけです。
これにより判定時刻を迎えて勝敗が確認出来たタイミングに、この変数を使えば表現できるようになります。
オブジェクトを表示する時間と価格を決める
オブジェクトを作る際に使用する関数が「ObjectCreate()」関数です。
この関数には、オブジェクトを作る際に引数として、表示する位置に該当する時間と価格の値が必要になります。
時間は既に取得できているので、価格を求める必要があります。
int Arrow_Shift = iBarShift(NULL,NULL,LowArrowTime); double Arrow_Position = iHigh(NULL,NULL,Arrow_Shift) + 20 * Point;
アローが表示されている時間のシフト値を求めて、そのシフト値から高値を求めています。
アロー自体は高値から10ポイント上にずらしたところに表示されているので、勝敗結果のオブジェクトは20ポイント上にずらしたところに表示されるようにします。
20ポイントずらすには「+ 20 * Point」で表現します。
オブジェクトを生成する
オブジェクトを生成するためには、オブジェクトの名前を決める必要があります。
オブジェクト名はそれぞれ固有の名前を付けなければなりませんが、、アローは複数表示されていて、それぞれの勝敗結果となると、それらのオブジェクトそれぞれに固有の名前を付けなければなりません。
そういったことも考慮した形でオブジェクトを生成します。
コードは勝敗をカウントしているところの後ろに以下のように追加します。
string JudgeArrowName = "LowArrow_" + TimeToStr(LowArrowTime,TIME_DATE | TIME_MINUTES); ObjectCreate(JudgeArrowName,OBJ_ARROW,0,LowArrowTime,Arrow_Position); ObjectSet(JudgeArrowName, OBJPROP_WIDTH, 2); ObjectSet(JudgeArrowName, OBJPROP_ARROWCODE, 161); ObjectSet(JudgeArrowName, OBJPROP_COLOR, clrWhite); ObjectSet(JudgeArrowName, OBJPROP_SELECTABLE, false); ObjectSet(JudgeArrowName, OBJPROP_ANCHOR,ANCHOR_BOTTOM);
「string JudgeArrowName」で「名前 + アロー位置の時間」となるように指定しています。これにより複数のオブジェクト名が被らないように調整しています。
「ObjectCreate()」関数でオブジェクトを生成し、「ObjectSet()」関数で生成したオブジェクトに詳細情報を設定しています。
「OBJPROP_ARROWCODE」に「161」と指定してますが、「〇」に該当するコードとなります。
負けている方のオブジェクトには「120」をしていて「×」に該当するコードを指定してみてください。
「ObjectSet()」関数は他にもいろいろな情報を設定できますので、詳細は調べてみてください。
MT4上で確認
コードが完成したら、デバッグのスタートボタンを押して実行してみましょう。
アローの上下に勝敗結果が表示されるようになりました。すごくわかりやすいですね。
チャート上で右クリックして、「表示中のライン等」を選択します。
オブジェクトが表示されているのがわかります。
オブジェクトは直接選んで削除することもできます。
【YouTube動画公開】アロー(矢印)の出し方
【2023/08/16追記】アローの出し方について動画にしてみました。バックテストもしていますのでご覧ください。
コメント
コメント一覧 (1件)
zlq2md