MQL4でもOnTradeが使いたい!

概要

 MQL5にはOnTradeという関数があるのをご存知でしょうか? OnTradeはエントリー・決済などの注文系のイベントが発生した場合に実行される関数です。取引時に処理を実行したい場面って結構あるので、非常に便利な関数です。しかしOnTradeはMQL4では使用できません。コード内にOnTrade関数を書いてもエラーにならないのですが、取引が発生しても関数が実行されないのです(だったら初めからエラー吐いてくれよ)。
 そこでOnTradeの動きを再現したのがTradeManagerモジュールです。

準備

GithubからTradeManager.mqhをダウンロードしてください。MQL-OrderDataモジュールにも依存してますので、OrderData.mqhをお持ちでない方はOrderData.mqhもダウンロードしてください。

ダウンロードしたファイルは、Include/mql4_modules/TradeManager/TradeManager.mqhとして保存します。
OrderData.mqhの場合はInclude/mql4_modules/OrderData/OrderData.mqhとして保存します。
私のモジュールは基本的にこの形式で保存します。

mql4のコード内でTradeManager.mqhをincludeしたら準備完了です。

#include <mql4_modules/TradeManager/TradeManager.mqh>

使い方

OnInit関数内にInitメソッドを追加してください。これにより機能の初期化が完了します。

int OnInit()
{
   TradeManager::Init();

   // 中略...

   return(INIT_SUCCEEDED);
}

続いてOnTick関数内にRunメソッドを追加してください。こちらは検知処理を実行するために必要です。追加する場所はOnTick内であれば最初でも最後でも途中でも大丈夫ですが、Runメソッドが実行されないとOnTradeも実行されないことに注意してください。後ろの方に追加してて、その前にreturnなどがあるとOnTradeも実行されないこととなってしまいます。もし不安な方は、OnTick内の一番上に追加するのが確実です。

void OnTick()
{
   TradeManager::Run();

   // 以下省略...
}

最後にOnTrade関数を追加します。

void OnTrade()
{
   // 取引が発生したときに実行したい処理
}

以上が使い方になります。OnTick関数内のRunメソッドにより取引を検知して、OnTrade関数を実行します。
ちなみにTradeManager.mqh単体だとエラーが出ています。これはOnTrade関数がTradeManager.mqhの中に書かれていないからです。実際に使用する場面ではOnTrade関数が書かれているので、EAをコンパイルするときにはエラーが消えます。

後書き

 今更ですが、TradeManagerという名称は分かりにくいかな〜と感じてます。名称をMQL4-OnTradeに変更することも検討中です。
 他にも追加したい機能がありますので、修正が完了したらまた記事にしたいと思います。

arrow_upward