【MQL5】 MT5のEA作成の勉強 その7 MACD Sample の書き換え 1/2

【MQL5】 MT5のEA作成の勉強 その7 MACD Sample の書き換え 1/2

まえがき

 前回の投稿の最後に、「実際にコードを書き換えつつ」と書きましたが、実際に書き換えようとすると、今まで使用してきたソースでは不可能なことが分かりました。なぜなら、取引条件はデフォルトで用意されているライブラリを使用して定義する必要があるからです。
 もう少し細かく説明します。まず、EA自動作成で複数のインジケーターを選択します。すると、本投稿シリーズの第3回で学んだ、OnInitメソッドの「Creating filter CSignalSAR」と「Set filter parameters」の部分に「filter○○」(○○は番号)が増えていきます。即ち、この 「filter○○」 に任意の条件を付ければ任意の取引条件を作成することができるわけです。ところが、この変数の型は、 デフォルトで用意されているライブラリで定期ざれたものになっている為、書き換えることができないのです。(適当なライブラリをコピペして、取引条件の部分だけ書き換えれば可能かもしれませんが、困難なうえに予期せぬ事態を招く恐れがあります。)
 そこで、方針を変更して公式サイトのコードベースを参考に、MT5に標準搭載されているMACD Sampleを題材に、ライブラリ化されていないソースの書き方を学んでいこうと思います。

EA プロパティ

 公式サイトの MACD Sampleを 見ると、EAプロパティの説明は1.1~1.4に分かれています。 しかし、この部分は公式サイトの説明が完璧なので、特に補足はありません。しいて言えば、includeで指定しているmqlファイルに書かれた処理をこの先のコード内で使っていくという点くらいでしょうか。C言語やFortranの知識がある方には余計なお世話と言われそうですが。

イベントハンドラ関数

 イベントハンドラとは、ある出来事(イベント)が発生した時に実行する処理のことです。 公式サイトの MACD Sampleを 見ると、 イベントハンドラ関数の説明は2.1~2.3に分かれています。それぞれの項目で、 OnInit() 関数(起動時)、OnTick() 関数(価格更新時)、OnDeInit()関数(終了時)の実行タイミングを説明してくれているのですが、横文字の多さに若干戸惑ったので、図としてまとめておきたいと思います。

  この図を見ると、取引条件を設定したい場合は OnTick() 関数 に書き込めばよいように思えますが、実際に取引を行うメソッドはこの処理の上部で定義されている、ExtExpertクラスに定義されています。 ExtExpert というのは、これから学ぶ CSampleExpertクラス型の変数です。

CSampleExpert クラス

 公式サイトの MACD Sampleを 見ると、EAプロパティの説明は3.1~3.13に分かれています。かなりの長丁場です。 ややこしい分、公式サイトの説明も丁寧なので、ここでは、処理を変更するために書き換える部分に着目して勉強し行きたいと思います。
  まず、3.1のCSampleExpert クラス部分で注目するのは、CSampleExpert 変数の部分です。 CSampleExpert 変数のうち、以下の4種類の変数を書き換えることで使用するインジケータを変更することができます。

  • m_handle_macd
  • m_buff_MACD_main
  • m_macd_current
  • m_macd_previous

 次に、変数を書き換えるために、3.2のCSampleExpert Class Constructorを書き換えます。ちなみに、ここで変更のは変数名であり、実際に中身を変更するのはまた別の部分です。上記変数の名前の「macd」を、使用したいインジケータの名前に変更します。今回は「Paraboric SAR」を使用するため、以下のように書き換えます。

  • m_handle_sar
  • m_buff_SAR
  • m_sar_current
  • m_sar_previous

また、「m_macd_open_level」等はMACDでの判定に使う閾値なので、今回は削除します。他の変数も同様です。合わせて、  公式サイトの1.3 インプットと1.4 グローバル変数に存在する同名の変数も書き換えます。
 3.3は何もないので飛ばします。
 3.4も先ほど削除した変数の定義を行っている部分を削除するだけでOKです。
 3.5のCSampleExpert の InitCheckParametersは、トレーリングストップ等の設定を行う重要な部分ですが、今回はインジケーターについての変更しか行わないので、ここも変更なしです。
 一方、3.6の CSampleExpert の InitIndicators()は書き換える部分がそれなりにあります。なぜなら、ここがインジケーターをEAに導入する処理だからです。まず、先ほど上げた変数名の変更と、削除した変数を使った判定を取り除きます。つぎに、MACDの値を取得する、iMACDメソッドを Paraboric SAR の値を取得するiSARメソッドに変更し、引数も iSARメソッド の要求項目に合わせます。
 ここからはいよいよ取引条件を決めて行きます。まずは、3.7のCSampleExpert の LongClosed()です。ここでは、if文の中身を書き換えることで、ロングポジションをクローズする条件を指定することができます。取りあえず今回は、 「Paraboric SAR の値が価格を上抜いたら(=前回の時間足において、 Paraboric SAR の値は価格より下にあり、現在の足においては上にある )」という条件を設定します。m_sar_currentm_sar_previousを使って書いてゆきます。
 次の、3.8のCSampleExpert の ShortClosed()は逆に、 「Paraboric SAR の値が価格を下抜いたら(=前回の時間足において、 Paraboric SAR の値は価格より上にあり、現在の足においては下にある )」 という条件を設定します。
 3.9の CSampleExpert の LongModified()と3.10のCSampleExpert の ShortModified は3.5で設定したトレーリングストップの運用を行うメソッドです。特に変更は必要ありません。
 3.11のCSampleExpert の LongOpened()は、3.7と同様、 if文の中身を書き換えることで、ロングポジションをオープンする条件を指定することができます。 今回は、「Paraboric SAR の値が価格を下抜いたら 」という条件を設定します。
 3.12のCSampleExpert の ShortOpenedも3.11と同じように、 「Paraboric SAR の値が価格を上抜いたら 」という条件を設定します。
 最後に、3.13のCSampleExpert の Processing()は3.2で定義した変数に実際に値を格納します。3.2で行った変数の改名と削除に合わせて、メソッド内の変数名を変更・削除してゆきます。今回は不要ですが、もし、二つ前のインジケータの値を参照するような処理を含む場合、BarsCalculatedで調べるデータ数や、CopyBufferで取得するデータ数は2ではなく3になるので、こちらも変更が必要となります。また、各変数の関係が少し覚えにくいので、図としてメモしておきたいと思います。

結果

 取りあえず、エラー無く動くものを作ることができました。しかし、何故か注文が一度も行われず、今のところ原因不明です。デバッグモードで変数の値を確認しましたが、狙い通りの変数が入っています。原因の考察については一旦次回に回したいと思います。