【MQL5】 MT5のEA作成の勉強 その4 自動作成したEAはどんな処理?

【MQL5】 MT5のEA作成の勉強 その4 自動作成したEAはどんな処理?

まえがき

 前回の投稿で、自動作成したEAOnInit()メソッドの中身はまぁ何となく理解できました。次は、OnDeinit()処理について学んでいきたいと思います。前回までの投稿は以下をご覧ください。
各処理の実行タイミングについてはこちら
https://tedukapm.tech/?p=291
OnInit()についてはこちら
https://tedukapm.tech/?p=302

OnDeinit()について

 OnDeinit()はわずか一行しかありません。前回までの投稿でも触れましたが、この一行の処理の定義は「Expert.mql」という別ファイルに書かれています。詳細は以下の公式リファレンスをご覧ください。
https://www.mql5.com/ja/docs/event_handlers/ondeinit
 実際に中身を見てみると、処理部分はわずか5行しかありませんでした。例によって、MQL5が提供しているコードなので勝手に掲載するのは自粛しますが、ざっくり言うと、以下のような処理のようです。

Oninit()で作成したCExpertの引数「m_trade」「m_signal」「m_trailing」「m_money」「m_indicators」の初期化を行う。

ただし、上記処理の際、「m_on_tick_process」という変数がエラー判定に利用されています。これは、プロセスチェック用のフラグなので、もしうまく行かない場合はデバッグモードでこの変数の値を確認するのも解決の一助となりそうです。

OnTick()について

 この処理も、 OnDeinit()と同様に、一行しかありません。例によって、 「Expert.mql」という別ファイルを確認します。詳細は以下の公式リファレンスをご覧ください。
https://www.mql5.com/ja/docs/event_handlers/ontick
 中身を見てみると、初めに、先ほどの 「m_on_tick_process」 変数によるプロセス判定が行われています。
次に、「TimeToStruct」メソッドによる現在時刻取得が行われているようです。
https://www.mql5.com/ja/docs/dateandtime/timetostruct

厄介なのが、その後、「Processing」メソッドによる処理実行です。ソースなしで細かく言及するとかえってややこしくなりそうなので、ざっくりまとめます。 詳細は以下の公式リファレンスをご覧ください。
https://www.mql5.com/ja/docs/standardlibrary/expertclasses/expertbaseclasses/cexpert/cexpertprocessing

オープンポジションのクローズ判定、未決済注文(指値・逆指値)の継続または破棄の判定、新規ポジションのオープン判定を実行する。

上記公式リファレンスでリンクが張られている、「CheckOO」という処理付近で、最も肝心な、注文条件や決済条件を指定できます。しかし、今回は処理の流れを掴むことがテーマですので、詳細は後日としたいと思います。

OnTrade()について

 例のごとく、この処理も、一行しかなく、定義は 「Expert.mql」 に記載されています。 詳細は以下の公式リファレンスをご覧ください。
https://www.mql5.com/ja/docs/event_handlers/ontrade
 中身を見てみると、これまた例のごとく 「m_on_tick_process」 変数によるプロセス判定が行われています。 その後、「CheckTradeState」メソッドが呼ばれています。中々に冗長な処理なので、詳細は以下の公式リファレンスをご覧頂くとして、ここではざっくりとまとめたいと思います。
https://www.mql5.com/ja/docs/standardlibrary/expertclasses/expertbaseclasses/cexpert/cexpertchecktradestate

オープンポジション、 未決済注文(指値・逆指値) 、注文履歴、の変更を確認し、変更があった場合、対応する仮想イベントハンドラを返す。

OnTimer()について

 最後のこの処理も、やはり一行しかなく、変数の確認のみで、includeファイルに定義されている処理もありません。 詳細は以下の公式リファレンスをご覧ください。
https://www.mql5.com/ja/docs/event_handlers/ontimer
 中で行っているのは、

m_on_timer_process」変数の確認

のみです。ただし、今回作成したEAは時間に関するイベントを全く含んでいないので、「特定の時刻に未決済注文をすべて決済する」というようなイベントを含んだEAでは何かしらコードが追記されるのではないかと思います。後日確認したいと思います。

まとめ

OnDeinit()OnTick()OnTrade()OnTimer()の4つの処理の概要を学びました。なんとなく処理の概観は掴めたような気がしますが、肝心のトレード条件の設定に関しては未だどこで行っているのか明らかになっていません。次回以降は各処理を掘り下げつつ、取引条件を記載する場所を探ってゆきたいと思います。