イベントハンドラの役割

MT4プログラミング

1. EA用テンプレ

//+------------------------------------------------------------------+
//| Expert Advisor テンプレート |
//+------------------------------------------------------------------+
#property strict

//--- グローバル変数
int counter = 0;

//+------------------------------------------------------------------+
//| 初期化関数 (EAがチャートにセットされた時に1回だけ実行) |
//+------------------------------------------------------------------+
int OnInit()
{
Print("EAを読み込みました");
counter = 0;
EventSetTimer(1); // 1秒ごとにOnTimerを呼び出す設定
return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| ティック受信時 (価格が更新されるたびに実行) |
//+------------------------------------------------------------------+
void OnTick()
{
// ここに売買ロジックを書く
Print("新しいティックを受信しました");
}

//+------------------------------------------------------------------+
//| タイマーイベント (指定秒ごとに実行) |
//+------------------------------------------------------------------+
void OnTimer()
{
counter++;
Print("タイマー実行: ", counter, "回目");
}

//+------------------------------------------------------------------+
//| 終了処理 (EAがチャートから削除された時に1回だけ実行) |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer(); // タイマー停止
Print("EAを削除しました");
}

2. インジケーター用テンプレ

mql4コピーする編集する//+------------------------------------------------------------------+
//| インジケーター テンプレート                                     |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window // チャート上に表示
#property indicator_buffers 1     // バッファ数
#property indicator_color1 Red    // 描画色

//--- バッファ配列
double Buffer1[];

//+------------------------------------------------------------------+
//| 初期化 (インジケーターをセット時に1回だけ実行)                   |
//+------------------------------------------------------------------+
int OnInit()
{
    Print("インジケーターを読み込みました");

    // バッファ設定
    SetIndexBuffer(0, Buffer1);
    SetIndexStyle(0, DRAW_LINE);
    SetIndexLabel(0, "サンプルライン");

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 計算 (価格更新や新バー生成で実行される)                           |
//+------------------------------------------------------------------+
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[],
                const long &volume[],
                const int &spread[])
{
    // 単純に終値をコピー
    for(int i = 0; i < rates_total; i++)
    {
        Buffer1[i] = close[i];
    }
    return(rates_total);
}

//+------------------------------------------------------------------+
//| 終了処理 (インジケーター削除時に1回だけ実行)                      |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    ObjectsDeleteAll(0, 0, -1); // 作ったオブジェクト削除
    Print("インジケーターを削除しました");
}

特徴

  • 両方とも OnInit() で初期化処理を行います。
  • EAは OnTick()OnTimer() が中心、
    インジケーターは OnCalculate() が中心。
  • OnDeinit() で終了処理(タイマー停止やオブジェクト削除)をするので、
    チャートをきれいに保てます。

1. OnInit() の目的

  • インジケーターやEAが読み込まれたときに最初に一度だけ実行されます。
  • 初期設定や変数の初期化、描画オブジェクトの準備などを行う場所です。

例:

mql4コピーする編集するint OnInit()
{
    // 初期化処理
    Print("インジケーターを読み込みました");
    return(INIT_SUCCEEDED); // 成功を返す
}

2. その他の主なイベントハンドラ関数

関数名呼ばれるタイミング主な用途
OnInit()読み込み時(1回だけ)初期化、設定読み込み、オブジェクト作成
OnDeinit(const int reason)削除時(1回だけ)後片付け、描画消去、メモリ解放
OnTick()新しいティックが到着したとき(EAのみ)売買ロジック、リアルタイム処理
OnCalculate(...)新しいバーやティックでインジケーターを再計算する時インジケーターの計算処理
OnTimer()タイマー間隔ごとに実行(EA/インジ両方)定期処理(1秒ごとなど)
OnChartEvent(...)チャートでイベント発生時(クリック、キー入力等)ボタンクリック、マウス操作の処理

3. 役割のイメージ

  • OnInit() → 「開始時の準備係」
  • OnDeinit() → 「終了時の片付け係」
  • OnTick() → 「ティックごとの監視係」
  • OnCalculate() → 「インジケーターの計算係」
  • OnTimer() → 「定期実行の係」
  • OnChartEvent() → 「ユーザー操作の受付係」

コメント

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