まくまく投資ノート
更新: / 作成:

カスタムインジケーターのプログラム内で、決まったシグネチャ(関数名やパラメーター構成)で関数を定義しておくと、特定のイベント発生時に自動的にその関数を呼び出してくれるようになります。

カスタムインジケーターでは次のようなイベントハンドラーを定義することができます。

OnInit 関数

int OnInit(void);

インジケーターの OnInit() 関数は、Init イベントが発生したときに呼び出されます。 Init イベントは次のようなタイミングで発生します。

  • インジケーターが最初にチャートにアタッチされたとき
  • チャートのシンボル(USDJPY など)やタイムフレーム(時間足)が変更されたとき
  • MetaEditor 上でインジケーターが再コンパイルされたとき
  • インジケーターの入力パラメータがダイアログから変更されたとき

このハンドラー関数内では、描画用バッファーの初期化などを行います。 戻り値が void のバージョンもありますが、互換性のために残されているだけなので、int を返すバージョンを使ってください。

OnDeinit 関数

void OnDeinit(const int reason);

インジケーターの OnDeinit 関数は、次のようなタイミングで呼び出されます(参考: Uninitialization Reason Codes)。 パラメータ部分の const を省略して int reason と記述したりすると、ちゃんと呼び出されないので注意してください。

説明定数
チャートからインジケーターをデタッチしたときREASON_REMOVE (1)
MetaEditor 上でインジケーターが再コンパイルされたときREASON_RECOMPILE (2)
チャートのシンボル(USDJPY など)やタイムフレーム(時間足)が変更されたときREASON_CHARTCHANGE (3)
チャートを閉じたときREASON_CHARTCLOSE (4)
インジケーターの入力パラメータがダイアログから変更されたときREASON_PARAMETERS (5)
別のアカウントで接続されたときREASON_ACCOUNT (6)
テンプレートが適用されて、インジケーターが設定されたチャートが開くときREASON_TEMPLATE (7)
OnInit() 処理が失敗して 0 以外の値を返したときREASON_INITFAILED (8)
ターミナル (MetaTrader) を閉じたときREASON_CLOSE (9)

OnCalculate 関数

int  OnCalculate(
   const int rates_total,      // price[] array size
   const int prev_calculated,  // number of handled bars at the previous call
   const int begin,            // index number in the price[] array meaningful data starts from
   const double& price[]       // array of values for calculation
);

int OnCalculate(
    const int rates_total,      // size of input time series
    const int prev_calculated,  // bars handled in previous call
    const datetime& time[],     // Time
    const double& open[],       // Open
    const double& high[],       // High
    const double& low[],        // Low
    const double& close[],      // Close
    const long& tick_volume[],  // Tick Volume
    const long& volume[],       // Real Volume
    const int& spread[]         // Spread
);

インジケーターの OnCalculate() 関数は、Calculate イベントが発生したとき(最新の価格が変化したとき)に呼び出されます。 インジケーターを最初にチャートにアタッチしたときにも呼び出されます。

OnTimer 関数

void OnTimer(void);

インジケーターの OnTimer() 関数は、Timer イベントが発生したときに呼び出されます。 EventSetTimer() 関数でセットした秒数ごとに Timer イベントが発生します。タイマーのセットは、通常 OnInit() 関数で行います。

OnChartEvent 関数

void OnChartEvent()
    const int id,          // event ID
    const long& lparam,    // long type event parameter
    const double& dparam,  // double type event parameter
    const string& sparam   // string type event parameter
);

インジケーターの OnChartEvent() 関数は、ChartEvent イベントが発生したときに呼び出されます。 EventChartCustom() 関数を使うと、独自の ChartEvent イベントを発生させることができます。

OnBookEvent 関数

void OnBookEvent(const string& symbol);

インジケーターの OnBookEvent() 関数は、BookEvent イベントが発生したときに呼び出されます。

(おまけ)インジケーターのイベントをすべて表示するインジケーター

関連記事

まくまく投資ノート
サイトマップまくへのメッセージ