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