MQL4MQL5 EA(エキスパートアドバイザー) 売買サイン・相場の判定
新しい足ができたときだけ処理したい
結論:今の足の開始時刻 iTime(_Symbol, PERIOD_CURRENT, 0) を前回の値と比べ、変わったら新しい足と判定します。
考え方
OnTick() はティックごとに呼ばれますが、売買の判定は「足が確定したとき(新しい足ができたとき)に1回だけ」行うことが多くあります。今の足の開始時刻を保存しておき、変わったら新しい足と判定するのが最も確実な方法です。
- 前回の足の開始時刻を入れる変数を用意する
- OnTick() の最初で、今の足の開始時刻 iTime(…, 0) を取得する
- 前回と同じなら return し、違えば保存し直して処理を続ける
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4・MQL5 共通
#property strict
// 新しい足ができたときだけ処理する EA のひな形
datetime lastBar = 0;
// 新しい足ができた最初のティックで true を返す
bool IsNewBar()
{
datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
if(t == 0 || t == lastBar)
return false;
lastBar = t;
return true;
}
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnTick()
{
if(!IsNewBar())
return;
// ここに「足が確定したときにする処理」を書く
double c1 = iClose(_Symbol, PERIOD_CURRENT, 1); // 確定した1本前の終値
Print("新しい足:", TimeToString(lastBar), " 1本前の終値=", DoubleToString(c1, _Digits));
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- 別の時間足(例:1時間足)の新しい足を判定したいときは、PERIOD_CURRENT を PERIOD_H1 に変えます。
- 起動した直後の足では処理したくない場合は、OnInit() で lastBar = iTime(_Symbol, PERIOD_CURRENT, 0); を入れておきます。
注意点
- Volume(ティック数)が 1 かどうかで判定する方法もありますが、ティックを取りこぼすと判定できないため、時刻で比べる方法がおすすめです。












