EA(エキスパートアドバイザー)のプログラム内で、決まったシグネチャ(関数名やパラメーター構成)で関数を定義しておくと、特定のイベント発生時に自動的にその関数を呼び出してくれるようになります。
EA では次のようなイベントハンドラーを定義することができます。
OnInit 関数
int OnInit(void);
EA の OnInit() 関数は、Init イベントが発生したときに呼び出されます。
戻り値が void
のバージョンもありますが、互換性のために残されているだけなので、int
を返すバージョンを使ってください。
OnDeinit 関数
void OnDeinit(const int reason);
EA の OnDeinit()
関数は、Deinit イベントが発生したときに呼び出されます。
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
);
EA の OnCalculate() 関数は、Calculate イベントが発生したとき(最新の価格が変化したとき)に呼び出されます。 EA を最初にチャートにアタッチしたときにも呼び出されます。
OnTimer 関数
void OnTimer(void);
EA の 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
);
EA の OnChartEvent()
関数は、ChartEvent イベントが発生したときに呼び出されます。
EventChartCustom()
関数を使うと、独自の ChartEvent イベントを発生させることができます。
OnBookEvent 関数
void OnBookEvent(const string& symbol);
EA の OnBookEvent()
関数は、BookEvent イベントが発生したときに呼び出されます。
OnTick 関数
void OnTick(void);
EA の OnTick()
関数は、NewTick イベントが発生したときに呼び出されます。
OnTick()
は EA 専用のイベントハンドラです(インジケーターやスクリプトでは使用できません)。
NewTick イベントを OnTick()
関数で処理している最中に次の NewTick イベントが発生した場合、そのイベントはイベントキューに積まれないことに注意してください。
OnTick()
内の処理は短時間で終える必要があるため、Sleep()
関数や MessageBox()
関数の呼び出しは禁止されています。
EA による自動売買が許可されていない場合でも、OnTick()
関数は呼び出されます。
OnTrade 関数
void OnTrade(void);
EA の OnTrade()
関数は、Trade イベントが発生したときに呼び出されます。
OnTrade()
は EA 専用のイベントハンドラです(インジケーターやスクリプトでは使用できません)。
OnTester 関数
double OnTester(void);
EA の OnTester()
関数は、Tester イベントが発生したときに呼び出されます。
OnTester()
は EA 専用のイベントハンドラです(インジケーターやスクリプトでは使用できません)。
関連記事
- MetaTrader/MQL: アプリの種類ごとに扱えるイベントハンドラーの一覧
- MetaTrader/MQL: スクリプトで使用できるイベント
- MetaTrader/MQL: インジケーターの実装例 - 大きなシンボル名を表示する
- MetaTrader/MQL: テキストを出力する方法まとめ (Alert, Comment, Print, MessageBox)
- MetaTrader/MQL: デバッグ用のマクロを定義する (#define)
- MetaTrader/MQL: 価格情報を取得する (SymbolInfoTick, CopyRates)
- MetaTrader/MQL: 描画オブジェクトの基本 (ObjectCreate, ObjectDelete, ObjectSetXxx)