【MQL5】 MT5のEA作成の勉強 その5 Ontick() / Processing() はどんな処理? 1/2

【MQL5】 MT5のEA作成の勉強 その5 Ontick() / Processing() はどんな処理? 1/2

まえがき

 前回の投稿で省略した、自動作成したEAOntickメソッドの中身を詳細に学び、取引条件を記述する場所を突き止めたいと思います。前回の投稿はこちらをご覧ください。
https://tedukapm.tech/?p=307

Ontickメソッドについて

 前回の振り返りになりますが、 Ontickメソッドは「価格が更新されるたびに実行されるメソッド」です。当然、更新された価格を取得し、設定したテクニカル指標に基づいて取引を行う処理が入るはずです。しかし、自動作成したEAOntickメソッドは僅か一行しかなく、本命の定義は「Expert.mql」という別ファイルに書かれており、 Expertオブジェクト のメソッドとして使用されています。さらにそれを追うと、エラー判定の後、 Processingという長いメソッドが呼ばれています。この中に、取引を行う処理が書かれているかを、これから確認してゆきたいと思います。

Processingメソッドについて - ポジションクローズ –

  ProcessingメソッドはOntickメソッド の本体とも呼べるメソッドです。これまでの例にもれず、コードの掲載は自粛しますので、MQL5をお手元で開きながら見て頂けるとより分かりやすいかと思います。以下、ざっくりとした処理の流れです。

  1. シグナルの方向を計算する。
    いきなりですが、ちょっとよくわからない部分です。というのも、この処理の説明が公式リファレンスに乗っていないためです。ちなみに、定義は「Expert.mql」にincludeされた「ExpertSignal.mqh」に書かれています。見る限り、価格変化の符号付きの値(Direction)を設定するメソッドのようです。(以下の公式リファレンスでは「荷重」と訳されていますが・・・。)
    CExpertSignal
    Direction

  2. ポジションの有無を判定する。
    こちらは公式リファレンスにサンプルソースがありますので、そちらを見つつ記事を読んでいただければと思います。
    SelectPosition

 ちなみに、上記ソース中の「 ACCOUNT_MARGIN_MODE_RETAIL_HEDGING 」は口座プロパティの一つで、一つのシンボルに対して複数ポジションを保有できることを意味するようです。
 つまり、複数ポジションを保有できる場合には、区別するためにマジックナンバー付きで、そうでなければシンボルごとにポジションを選択する、という処理になっています。選択に成功すればTrue、失敗すればFalseを返しているようです。

  1. ポジションを保有していた場合、反転または決済の判定を行う。
     先ほどポジションの選択に成功した場合、つまり、ポジションを保有していた場合、以下の3つの処理を行っています。
    CheckReverse
    CheckClose
    CheckTrailingStop
     CheckReverseメソッドはポジションの反転の判定と実行を行っているようです。ちょっとややこしいのですが、longポジションを保有している場合、内部でCheckReverseLongメソッドを呼び出し、さらにその中で、Signal オブジェクトCheckReverseLongメソッドを呼び出しています。まるで、マトリョーシカのような構造です。Signal オブジェクトCheckReverseLongメソッドの定義は「ExpertSignal.mqh」ファイルに書かれています。ざっくり言うと、longポジションを決済、shortポジションを保有、始値と終値の差がスプレットを超えているという3条件を満たす場合にTrueを返しているようです。shortポジションの場合も一部の符号が逆転するだけで同じ処理です。そして、Signal オブジェクトから帰ってきた判定結果を基に、ExpertオブジェクトCheckReverseメソッド内でポジションの反転処理が呼び出されています。
     次にCheckCloseメソッドですが、こちらはさらにややこしいです。始めに、MoneyオブジェクトCheckCloseメソッドを呼び出し、未決済ポジションを決済する条件をチェックしています。処理の定義は「ExpertMoney.mqh」にあります。次に、longポジションを保有している場合、CheckReverseメソッドと同じように、Signal オブジェクトCheckCloseLongメソッドを呼び出しています。ちなみに、Signal オブジェクトCheckCloseLongメソッドはCheckReverseLongメソッド内でも使われています。先に設定したDirectionが事前に設定した閾値を超えていればポジションクローズとなるようです。勿論、先ほど同様、shortポジションの場合も一部の符号が逆転するだけで同じ処理です。
     最後のCheckTrailingStopメソッドですが、こちらは読んで字のごとく、トレーリングストップの条件を満たすかの判定を行います。この処理は、先の二つの判定の両方に引っかからなかった場合のみ実行されます処理の流れも上記の二つと大体同じです。今回はTrailingオブジェクトを使用し、処理の定義は「ExpertTrailing.mqh」にあります。
     代表してCheckCloseメソッドの流れを図示してみました。3つのファイルを行き来しており、ややこしいことこの上ないです。(分かりやすさの為に一部省略しています。)

まとめ

 きりがよいので一旦ここまででしめたいと思います。Processingメソッドの前半は決済に関する判定が行われていることが分かりました。しかし、未だにどこで決済条件を決めればよいのか、ちょっとよくわからない感じです。プリセットのライブラリを書き換えるわけにはいかないので、自作のソースコードにある、OnTickメソッドを実行する条件を書き込むか、判定で使用されている Signal オブジェクト 閾値変数の指定方法などを変えるような感じでしょうか。今後、何かわかったら再度更新したいと思います。
 取りあえず、次回は、 Processingメソッドの後半のポジション保有判定について学んだ行きたいと思います。