EventSetMillisecondTimer関数の役割・働き
EventSetMillisecondTimer関数はEventSetTimer関数と同様に、特定の間隔ごとにタイマーイベントを生成するようMetaTrader5クライアント端末に指示する関数です。
ただ、EventSetTimer関数が秒単位でタイマーイベントの指定をするのに対し、EventSetMillisecondTimer関数はミリ秒、すなわち1/1000秒単位(=0.001秒)でタイマーイベントの指定をします。
したがって、より高速でタイマーイベントを処理する必要があるエキスパートアドバイザーやインジケータに適しています。
※EventSetTimer関数についての詳細は↓の記事をご参照ください
EventSetMillisecondTimer関数の引数について
EventSetMillisecondTimer関数はint型の引数を1つ指定します。
bool EventSetMillisecondTimer(
int milliseconds // ミリ秒数
);
この引数はタイマーイベントの発生頻度をミリ秒単位で指定します。
例えば「100」と記述すると100ミリ秒(0.1秒)間隔でタイマーイベントを発生させるよう指示している事を意味します。
EventSetMillisecondTimer関数の戻り値について
EventSetMillisecondTimer関数は成功した場合にtrue
を、失敗した場合にはfalse
を返します。
エラーが発生した場合、GetLastError関数を使用してエラーコードを取得できます。
※GetLastError関数についての詳細は↓の記事をご参照ください
EventSetMillisecondTimer関数を使う際の注意事項
EventSetMillisecondTimer関数は通常、OnInit関数またはクラスのコンストラクタ内で呼び出されます。
EventSetMillisecondTimer関数が通常、OnInit関数またはクラスのコンストラクタ内で呼び出される理由
EventSetMillisecondTimer関数が通常、OnInit関数またはクラスのコンストラクタ内で呼び出される理由は、これらの部分がプログラムの初期化段階で実行されるためです。
OnInit関数はエキスパートアドバイザーやカスタムインジケ-タがチャートに読み込まれたとき、またはMT5が起動する時に自動的に呼び出されます。
OnInit関数内でEventSetMillisecondTimer関数を呼び出すことで、必要なタイマーイベントがプログラムの生存期間全体で活動することが保証されます。
タイマーイベントを設定することは、定期的な操作や監視を自動化する基本的なステップであり、これを最初に設定することはプログラムの構造上、理にかなっているという訳です。
※OnInit関数についての詳細は↓の記事をご参照ください
また、クラスのコンストラクタはインスタンスが生成される時に自動的に実行されるため、タイマーイベントを設定することが適切です。
これにより、そのインスタンスが活動を開始すると同時に必要なタイマーイベントも設定されます。
※コンストラクタについての詳細は↓の記事をご参照ください
※インスタンスについての詳細は↓の記事をご参照ください
また、タイマーイベントの間隔が非常に短い場合、ハードウェアの限界により実際の間隔が指定した値よりも長くなる可能性があります。
なお、MQL5プログラムでは、一度に一つのタイマーイベントしか実行できません。
つまり、あるプログラムで一つのタイマーイベントが既に動作している場合、別のタイマーイベントを同時に動かすことはできないということです。
各MQL5アプリケーションやチャートは、イベントが保管される「イベントキュー」と呼ばれる場所を持っています。これは、イベントが順番に処理される待ち行列のようなものです。
もしタイマーイベントがすでにキューに存在しているか、処理中の場合、新しいタイマーイベントはキューに追加されません。
これは、同じタイプのイベントが重複してキューに入るのを防ぐためです。
簡単に言えば、プログラムがすでに何かを一定の間隔で行うように設定されている場合、その設定を変える前に現在のタイマーイベントを停止する必要がある、ということです。
EventSetMillisecondTimer関数を使ったサンプルコード
// OnInit関数でタイマーを0.1秒間隔で設定します
int OnInit() {
Comment(""); // コメントをクリア
EventSetMillisecondTimer(100); // 100ミリ秒ごとにタイマーイベントを生成
return(INIT_SUCCEEDED);
}
// OnTimer関数でタイマーイベントが発生するたびに呼ばれます
void OnTimer() {
datetime serverTime = TimeCurrent(); // サーバーの現在時刻を取得
// サーバー時刻をコンソールに出力
Print("サーバーの現在時刻: ", TimeToString(serverTime, TIME_DATE|TIME_MINUTES));
}
// ファイルがチャートから削除される時に実行される関数
void OnDeinit(const int reason) {
EventKillTimer(); // タイマーを停止します
// チャートから削除されたことをユーザーに通知
if (reason == REASON_REMOVE) {
Comment("このエキスパートアドバイザーはチャートから削除されました。");
}
}
上記のは、EventSetMillisecondTimer関数を使用したサンプルコードです。OnInit関数でタイマーイベントを設定し、OnTimer関数で現在のサーバー時刻を計算し表示する方法を示しています。この例では0.1秒ごとにタイマーイベントが発生します。
サンプルコードに使われた関数や文法要素の解説
- OnInit関数: エキスパートアドバイザーが初期化されるときに呼び出される関数です。
- EventSetMillisecondTimer関数:今回解説した、 指定されたミリ秒数ごとにタイマーイベントを生成するよう設定する関数です
- OnTimer
関数
: タイマーイベントが発生するたびに自動的に呼び出されるイベントハンドラーです。 - TimeCurrent関数: サーバーの最後に知られている時刻を取得します。
※TimeCurrent関数についての詳細は↓の記事をご参照ください
- TimeToString関数: dateTime型の時刻を文字列に変換します(タイプキャスト)
※TimeToString関数についての詳細は↓の記事をご参照ください
- OnDeinit関数:エキスパートアドバイザーやインジケータがチャートから削除されるとき、またはMetaTrader5が閉じるときに呼び出されます。
※OnDeinit関数についての詳細は↓の記事をご参照ください
・EventKillTimer関数:タイマーイベントを停止する関数です。
※EventKillTimer関数に関する詳細は↓の記事をご参照ください
・Comment関数:チャートの左上にテキストを表示するために使用します。この例では、エキスパートアドバイザーがチャートから削除されたときにメッセージを表示しています。
※Comment関数についての詳細は↓の記事をご参照ください
<参照>
OnTimer関数/GetLastError関数/OnInit関数/コンストラクタ/EventSetTimer関数EventKillTimer関数/TimeCurrent関数/OnDeinit関数
※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。
コメント