MQL4MQL5 EA(エキスパートアドバイザー) 売買サイン・相場の判定
MACD とシグナルのクロスを判定したい
結論:MACD のメインライン(バッファ 0)とシグナルライン(バッファ 1)を2本分取得し、上下の入れ替わりを比べます。
考え方
MACD のメインラインがシグナルラインを下から上に抜けたら買い、上から下に抜けたら売り、とするのが代表的な使い方です。ここでは確定足でクロスを判定し、アラートを出す EA を例にしています。
- メインラインとシグナルラインの値を、1本前と2本前の2本分取得する
- 2本前と1本前で上下関係が入れ替わったかを比べる
- ゼロラインより下での上抜けだけを買いにするなど、条件を追加して絞り込む
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
// MACD がシグナルラインとクロスしたらアラートを出す EA(MT4)
input int InpFastEma = 12; // 短期 EMA
input int InpSlowEma = 26; // 長期 EMA
input int InpSignal = 9; // シグナル
datetime lastBar = 0;
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnTick()
{
datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
if(t == lastBar) return;
lastBar = t;
double m1 = iMACD(_Symbol, 0, InpFastEma, InpSlowEma, InpSignal, PRICE_CLOSE, MODE_MAIN, 1);
double m2 = iMACD(_Symbol, 0, InpFastEma, InpSlowEma, InpSignal, PRICE_CLOSE, MODE_MAIN, 2);
double s1 = iMACD(_Symbol, 0, InpFastEma, InpSlowEma, InpSignal, PRICE_CLOSE, MODE_SIGNAL, 1);
double s2 = iMACD(_Symbol, 0, InpFastEma, InpSlowEma, InpSignal, PRICE_CLOSE, MODE_SIGNAL, 2);
if(m2 <= s2 && m1 > s1) Alert(_Symbol, " MACD 上抜け(買い)", m1 < 0 ? " ゼロライン下" : "");
if(m2 >= s2 && m1 < s1) Alert(_Symbol, " MACD 下抜け(売り)", m1 > 0 ? " ゼロライン上" : "");
}MQL5(MT5)
// MACD がシグナルラインとクロスしたらアラートを出す EA(MT5)
input int InpFastEma = 12; // 短期 EMA
input int InpSlowEma = 26; // 長期 EMA
input int InpSignal = 9; // シグナル
int hMacd = INVALID_HANDLE;
datetime lastBar = 0;
int OnInit()
{
hMacd = iMACD(_Symbol, PERIOD_CURRENT, InpFastEma, InpSlowEma, InpSignal, PRICE_CLOSE);
return hMacd == INVALID_HANDLE ? INIT_FAILED : INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
IndicatorRelease(hMacd);
}
void OnTick()
{
datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
if(t == lastBar) return;
double m[], s[];
ArraySetAsSeries(m, true);
ArraySetAsSeries(s, true);
if(CopyBuffer(hMacd, MAIN_LINE, 1, 2, m) < 2 || CopyBuffer(hMacd, SIGNAL_LINE, 1, 2, s) < 2) return;
lastBar = t;
if(m[1] <= s[1] && m[0] > s[0]) Alert(_Symbol, " MACD 上抜け(買い)", m[0] < 0 ? " ゼロライン下" : "");
if(m[1] >= s[1] && m[0] < s[0]) Alert(_Symbol, " MACD 下抜け(売り)", m[0] > 0 ? " ゼロライン上" : "");
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- MT の標準の MACD は、メインラインがヒストグラム(棒)、シグナルラインが線で表示されます。チャートの見た目と値の対応に注意します。












