MQL4でEAやインジケーターを作成するには、イベント関数の理解が不可欠です。
OnTick、OnStart、OnInit、OnDeinitなどのイベント関数は、それぞれ特定のタイミングで自動的に呼び出され、プログラムの挙動を制御します。
この記事では、各イベント関数がどのような場面で使われるのか、どういう処理を書くべきかを具体的なコード例を交えて丁寧に解説します。
OnTickによる取引処理、OnTimerによる定期実行、OnChartEventによるユーザー操作への反応など、EAの自動化を高度化するための基礎と応用を網羅しています。
読み終えるころには、イベント関数を自在に使いこなし、自作EAの構築がスムーズに進められるようになるでしょう。
イベント関数とは?
イベント関数とは、特定の事象や状態変化が発生した際に自動的に呼び出される関数のことです。
イベント関数なら、事象や状態変化があったときの処理を実施することができます。
主なイベント関数
ここでは主なイベント関数とその役割について紹介します。
OnStart
OnStart
関数は、MQL4スクリプトの開始時に1回だけ呼び出される関数です。
スクリプトが実行されたときの初期動作や計算をここに記述します。
void OnStart()
{
// ここに処理を記載
}
OnInit
OnInit
関数は、エキスパートアドバイザーやカスタムインジケーターがチャートにロードされる際に呼び出される関数です。
初期化の作業や設定の読み込みなど、起動時の処理をこの関数内で行います。
int OnInit()
{
// ここに処理を記載
// 処理結果
return(INIT_SUCCEEDED);
}
OnDeinit
OnDeinit
関数は、エキスパートアドバイザーやインジケーターがチャートから削除される時、またはターミナルを閉じる時に実行されます。
この関数内では、リソースの解放や終了時の作業を行います。
void OnDeinit(const int reason)
{
// ここに処理を記載
}
OnTick
OnTick
関数は、新しい価格データ(ティック)が受信されるたびに呼び出されます。
価格の変動に基づく動作や計算、取引のロジックなどをこの関数内で記述します。
void OnTick()
{
// ここに処理を記載
}
OnTimer
OnTimer
関数は、EventSetTimer
関数で指定した時間間隔で呼び出される関数です。
定期的な動作や処理を実行する際に使用します。
int OnInit()
{
EventSetTimer(60);
return(INIT_SUCCEEDED);
}
void OnTimer()
{
// ここに処理を記載
}
OnTester
OnTester
関数は、戦略テスターがエキスパートアドバイザーのテストを完了したときに呼び出されます。
テストの結果や最終的な評価値を返すために使用します。
double OnTester()
{
// ここに処理を記載
}
OnChartEvent
OnChartEvent
関数は、チャート上で発生するさまざまなイベント(マウスのクリックやキーボードの操作など)を処理するための関数です。
ユーザーのイベントに応じた動作を関数に書きます。
void OnChartEvent(
const int id, // イベントID
const long& lparam, // long型イベント
const double& dparam, // double型イベント
const string& sparam // string型イベント)
{
// ここに処理を記載
}
OnCalculate
OnCalculate
関数は、カスタムインジケーターの価値を計算するために使用されます。
新しいバーのデータや価格が更新される度に呼び出される関数で、インジケーターのロジックや計算をここで行います。
int OnCalculate(const int rates_total, // 入力された時系列のバー数
const int prev_calculated, // 計算済み(前回呼び出し時)のバー数
const datetime &time[], // 時間
const double &open[], // 始値
const double &high[], // 高値
const double &low[], // 安値
const double &close[], // 終値
const long &tick_volume[], // Tick出来高
const long &volume[], // Real出来高
const int &spread[]) // スプレッド
{
// ここに処理を記載
}
MQL4のイベント関数の応用例
これまでに、MQL4のイベント関数の基本的な概要と主要な関数について触れました。
説明だけだとイマイチピンとこない方もいらっしゃる思うので、ここでは、関数の詳細な特性や、実際の取引の中での応用例をいくつか紹介します。
OnInit()の活用例
OnInit()
は、特に初期のパラメータ設定やリソースの読み込みに役立ちます。
例えば、外部のCSVファイルからのパラメータの読み込みや、初期の取引戦略の設定などがここで行われることが多いです。
int OnInit()
{
// パラメータの読み込みや初期設定
return(INIT_SUCCEEDED);
}
OnDeinit()の活用例
OnDeinit()
では、一般的にオブジェクトの解放やログの保存など、終了に関連するタスクを実行します。
void OnDeinit(const int reason)
{
// オブジェクトの解放やログの保存
}
OnTick()の活用例
OnTick()
関数は、新しい価格情報が到着するたびに動作するので、EAで取引をする主要な処理はこの中に記載します。
void OnTick()
{
double currentPrice = Close[0];
// 価格が特定の条件を満たす場合に取引を実行
if(currentPrice > SOME_THRESHOLD)
{
// ロングポジションをオープン
}
}
OnTimer()の活用例
OnTimer()
関数は、特定の時間間隔で動作するように設計されています。
例えば、1時間ごとに何らかのアクションをトリガーしたい場合に役立ちます。
void OnTimer()
{
// 1時間ごとに特定のアクションを実行
}
OnChartEvent()の活用例
ユーザーのインタラクションやチャート上のイベントをトリガーとして、特定の処理を行いたい場合にはOnChartEvent()
が役立ちます。
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
// ユーザーのアクションに応じた処理
}
まとめ
イベント関数はMQL4プログラミングにおいて中心的な役割を果たします。
特定の事象や条件に基づいて、アクションを実行するための仕組みを提供することで、高度なカスタマイズや自動化が可能となります。
この機能を最大限に活用することで、効率的なトレーディングツールやストラテジーの実装が実現できます。