【MQL5】 MT5のEA作成の勉強 その15 サインツールの作り方・売買サインの可視化方法

【MQL5】 MT5のEA作成の勉強 その15 サインツールの作り方・売買サインの可視化方法

まえがき

 前回の投稿で、次回から注文条件を検討すると書きました。その言葉通り、いくつかの条件を検討したのですが、その際、いくつかのインジケーターを組み合わせていると、テスターにうまく表示されないという問題がありました。これでは、ちゃんと狙ったタイミングで注文できているのかが分かりません。
 そこで、一旦、注文条件を可視化するサインツールの作製を目指して勉強を始めたいと思います。

コメント・入力変数・グローバル変数の作製

 まず始めに、コメントとグローバル変数と入力変数を定義します。この辺りはEAを作成する場合と同じです。
入力変数を定義する場合は、「input {型} {変数名}」の様に、変数の型宣言の前に「input」を付けるのを忘れないようにします。

プロパティの設定

 EAではプロパティはユーザーに見えるコメント程度の意味しかありませんでした。しかし、インジケーターにおいては極めて重要な意味を持ちます。プロパティで定義する値を以下に示します。なお、プロパティの定義は全て「#property」から書き始めます。ここではよく使われるものを書きますが、指標プロパティと関数との関係をご覧ください。

  • indicator_separate_window 
     インジケーターが価格チャートと別のウィンドウに描画されます。オシレーター系のインジケーターのような表示になります。
  • indicator_chart_window
     インジケーターが価格チャート内に表示されます。トレンド系のインジケーターのような表示になります。
  • indicator_buffers
     インジケーター内で使用する値を格納するバッファ配列の要素数を指定します。計算に使うだけで表示しない値を取得することもでき、下記のindicator_plotsと要素数を合わせる必要はありません。
  • indicator_plots
     インジケーターに表示する値の数を指定します。例えば、二本の線を引きたい場合、indicator_plotsは2となります。
  • indicator_type
     指標スタイルの例から、指標の表記方法を選択します。例えば、DRAW_LINEを選択すれば、線を引くように表現されます。選んだスタイルによって、値を格納するバッファのサイズが違うので注意が必要です。なお、indicator_plotsが2以上の場合、変数名の後に1始まりの数字を付けることで、どのプロットに適用するかを指定します。
  • indicator_style
     ENUM_LINE_STYLEのいずれかを選択し、線のスタイルをしていします。なお、indicator_plotsが2以上の場合、変数名の後に1始まりの数字を付けることで、どのプロットに適用するかを指定します。
  • indicator_color
     線の色を指定します。色を指定する文字列の一覧を見つけられなかったのですが、「clrRed」や「clrBlue」のように、「clr」+色でひょうげんできるようです。また、DRAW_COLOR_LINEで紹介されているように、複数の色を配列として与えることもできるようです。なお、indicator_plotsが2以上の場合、変数名の後に1始まりの数字を付けることで、どのプロットに適用するかを指定します。
  • indicator_label
     線に表示されるラベル(凡例)を設定します。なお、indicator_plotsが2以上の場合、変数名の後に1始まりの数字を付けることで、どのプロットに適用するかを指定します。

Oninit()について

 サインツール起動時に一度だけ呼び出される関数です。今後使っていく変数を定義してゆきます。
カスタム指標に示されている、以下の関数が良く使われているようです。

  • SetIndexBuffer
     double型を格納する1次元動的配列を定義します。多くのインジケーターでは表示位置は数値で示されることになります。よって、double型の値として、このメソッドで作製した配列にインジケーターの現在値を格納してゆくことになります。インジケーターの値以外にも、カスタム指標プロパティの、ENUM_INDEXBUFFER_TYPEに含まれるもの(値、色、中間バッファ)を格納することができます。
  • IndicatorSetString
     ENUM_CUSTOMIND_PROPERTY_STRINGに含まれる、指標の短縮名もしくはレベルの値を文字列型で入力できます。ここで設定した値が、指標の名称としてチャートに表示されるようです。
  • PlotIndexSetString
     保留
  • PlotIndexSetDouble
     対応する指示線の対応するプロパティの値を設定します。上記のPlotIndexSetStringとの違いは、指標プロパティの値が double 型でなければならないという点です。
  • IndicatorSetInteger
     この関数は、対応する指標プロパティの値を設定します。指標プロパティとは、 ENUM_CUSTOMIND_PROPERTY_INTEGER のいずれかで、指標の小数点以下の桁数や線の太さなどを設定できます。
  • {指標銘}Handle
     サインツール作成時には、テクニカル指標に含まれるメソッドを自由に呼び出すことができます。使い方はリンク先に書いてありますが、ざっくり説明すると、指標を選択するためのハンドラ(int型)と、値を格納するための配列の二つを用意する必要があります。これはそのハンドラにあたる変数です。
     

OnCalculate()について

 Calculateイベントが発生したとき、インジケーターで呼び出されます。 Calculateイベント は価格が変化したとき、インジケーターで呼び出されます。要するに、EAにおける OnTick() と同じタイミングで動作すると考えて良さそうです。ここで行われる処理はインジケーターによって千差万別なのですが、共通と思われる部分だけ書いておきます。

  • 「rates_total」の判定
     「rates_total」はOnCalculate()の引数の一つで、price配列のサイズを表します。つまり、開始から現在のティックまでのバーの数です。例えば、移動平均の様に現在のバーにおける値を計算するために過去のバーの価格情報が必要な場合、開始直後は過去のバーの値が存在しないためエラーとなってしまいます。それを防ぐために、最低限必要な数のバー(時間)が経過するまでは指標を算出しないようにします。
  • 指標の計算とバッファへの格納
     任意の方法で指標を計算し、それを、Oninit()で、ENUM_INDEXBUFFER_TYPEをINDICATOR_DATAとしたバッファに格納します。すると、プロパティの設定に従って自動的に描画してくれます。
  • 「rates_total」の返却
     OnCalculate()の戻り値として「rates_total」を返します。こうすることで、計算を実施するごとに、rates_totalが加算されてゆきます。

まとめ

 何とか基本的なインジケーターの作り方は把握できましたが、思いの外難しいです。(EAの前段階くらいのイメージでいたのですが・・・)特にpropertyの記述は最初何をどうして良いか全くわかりませんでした。
 次回ですが、一旦先に進む前に知識を整理したいと思います。テーマはEA・インジケーターにMQL5既定のインジケーターを導入する方法です。複数個所にいろいろ記述する必要があり、なかなかに面倒なので、頭に入っているうちに残しておきたいと思います。