概要
MQLの仕様が良く解っていない私が自動売買のシステムを作成するにあたって、
OnTimerで複数処理を呼び出したいと思い検証した内容を記す
理由として、MQL5のリファレンスに下記が記載されていた
通常、この関数は OnInit() 関数またはクラスコンストラクタで呼ばれるべきです。タイマーからくるイベントを処理するために,エキスパートアドバイザーはOnTimer() 関数を持つべきです。
エキスパートアドバイザーならびに指標は、全て独自のタイマーで動作しそこからのみイベントを受けとります。作成されたタイマーは EventKillTimer() 関数で無効にされていない限り MQL5 プログラムの操作の終了時に強制的に破壊されます。
プログラムでは複数のタイマーを実行することは出来ません。各MQL5アプリケーションとチャートは、新たに到着したイベントが配置されるイベントの独自のキューを持っています。タイマーイベントがキューに存在するまたは処理中の場合、新しいタイマーイベントは MQL5 プログラムのキューに加えられません。
一つのソースからは単一のイベントしか起動出来ない、、、、
という事は、複数のチャートへそれぞれEAを動かした場合どうなるのだろうと思い試した内容を記す。
結果
結果としては、複数のチャート画面にそれぞれEAを設定さえすれば複数の時間起動システムを実行する事は可能だった。
試験方法
①15秒置きにログが出力されるEAを作成
②適当なチャート2つにそれぞれEAを設定する。
試験判定方法
ログ出力画面に15秒より短い頻度でコメントが出力されるかを判定
使用したEAのソース
出す程の物では無いが一応
int OnInit()
{
//--- create timer
EventSetTimer(15); ①15秒毎にonTimerを実行
//---
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer(); ③EA終了時にTimerイベントを終了
}
void OnTimer()
{
//---
printf("hahaha"); ②時間が来たら適当に笑え
}