EAの「最初のロード時だけ動かす」「終了時だけ動かす」「Tickが更新されるたびに動かす」処理について、MT4とMT5での実行結果を比較しながら解説します。
MT4→init/start/deinit MT5→Oninit/OnTick/OnDeinit
EAを作る際、基本の記述方式になる以下の関数がMQL4,MQL5で変わっています。
MT4 | MT5 | 特徴 |
init(OnInit) | OnInit | EAをロードした時、1回だけ動く |
start(OnStart) | OnTick | レートのティックが更新されるたびに動く |
deinit(OnDeinit) | OnDeinit | EAを取り外した時など、終了時に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に変えるとうまくかもしれないよ、という話でした。
コメント / Comments