サンプルコード 一覧へ戻る

MQL5サンプルコード

【サンプルコード】基本関数:MQL4(init/start/deinit),MQL5(Oninit/OnTick/OnDeinit)

EAの「最初のロード時だけ動かす」「終了時だけ動かす」「Tickが更新されるたびに動かす」処理について、MT4とMT5での実行結果を比較しながら解説します。

スポンサーリンク

MT4→init/start/deinit MT5→Oninit/OnTick/OnDeinit

EAを作る際、基本の記述方式になる以下の関数がMQL4,MQL5で変わっています。

MT4MT5特徴
init(OnInit)OnInitEAをロードした時、1回だけ動く
start(OnStart)OnTickレートのティックが更新されるたびに動く
deinit(OnDeinit)OnDeinitEAを取り外した時など、終了時に1回だけ動く

MT4も、build600以降は括弧内のOn〇〇という型が基本形になっているので、その場合は移行が楽です。

一方、initなどの昔からの型を使い続けている場合は、そのままMQL5に移植する事はできません。(やってみたら、startはコンパイルエラーになりました。init/deinitはコンパイルはできるみたいなのですが、ストラテジーテスターでinit/deinitの部分が実行されてなさそうでした)

MQL4とMQL5の比較は以下の通りです。

MT4(MQL4)のサンプルコード

void init()  //最初に1回だけ動く
{
   Print("init");
   return;
}

void start()  //レートのティックが更新されるたびに動く
{
   Print("start");
   return;
}

void deinit()  //EAが終了する時に1回だけ動く
{
   Print("deinit");
   return;
}

MT4結果

init
start
start
start
start
:
(中略)
:
start
start
deinit

MT5(MQL5)のサンプルコード


void OnInit()  //最初に1回だけ動く
{
   Print("init");
   return;
}

void OnTick()  //レートのティックが更新される毎に動く
{
   Print("ontick");
   return;
}

void OnDeinit(const int reason)  //EAが終了する時にに1回だけ動く
{
   Print("deinit");
   Print("const int reason = ",reason);
   return;
}

MT5結果

init
ontick
ontick
:
(中略)
:
ontick
ontick
deinit
const int reason = 1

(補足)MQL5のOnStartとOnTickの違い

あれこれコードを書いていて気付いたのですが、MT5はEAにOnTickが使えてもOnStartは使えない(?)ようです。

MT5(MQL5)のEAでOnStartを使おうとすると・・・

少し実験をしてみます。

_mt4-mt5-samplecodeというEAを作ります。(「_mt4-mt5-samplecode.mq5」というファイルを作って「\MetaQuotes\Terminal\xxxxxxxxxxxxxxxxx\MQL5\experts\Advisors」ディレクトリに突っ込めばOK。「 xxxxxxxxxxxxxxxxx 」は各ターミナルによって違う)

この時点で、MT5を再起動(もしくはナビゲータのエキスパートアドバイザー(EA)を更新)すると、EAアイコンはこんな感じ↓

この状態で↓のコードを書き込んでコンパイルします。OnStart関数を使っています。

void OnInit()
{
   Print("init");
   return;
}

void OnStart()
{
   Print("start");
   return;
}

void OnDeinit(const int reason)
{
   Print("deinit");
   Print("const int reason = ",reason);
   return;
}

すると、アイコンが変わります。先ほどまでEAのアイコンだったのに、スクリプト(?)のアイコンに変わってしまいました。

この状態でストラテジーテスターを無理やりスタートさせると、エラーで終わってしまいます。

解決策:OnStart→OnTickに変える

今度はOnStartをOnTickに変えてみます。コードは↓です。この状態でコンパイル&MT5再起動。(なぜか、MT5ターミナルを再起動しないと色々うまくセットされないんですよね・・・)

void OnInit()
{
   Print("init");
   return;
}

void OnTick()
{
   Print("ontick");
   return;
}

void OnDeinit(const int reason)
{
   Print("deinit");
   Print("const int reason = ",reason);
   return;
}

すると、アイコンが元に戻りました。

ストラテジーテスターも動きます。

MT4はStartでもTickでもEAに使用できたのですが、MT5になってOnStartはスクリプト用、OnTickはEA用、と厳密に分けられてしまったのかもしれません。

・・・とか言って、MT4時代から元々そうだった!という事かもしれません。汗

が、EAでOnStartを使おうとしてうまくいかない、という場合はOnTickに変えるとうまくかもしれないよ、という話でした。

コメント

タイトルとURLをコピーしました