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()
→ 「ユーザー操作の受付係」
コメント