最終更新: 2026年6月
MACDのシグナルは大きく3種類ある。①MACDラインとシグナルラインのクロス、②ヒストグラムの方向転換、そして③0ラインクロスだ。このうち0ラインクロスは「トレンドの方向転換が確定した後のシグナル」として機能するため、ダマシが少なくEA化しやすい性質を持つ。本稿ではMQL4でMACDヒストグラムの0ラインクロスを使ったEAを実装し、その特性と落とし穴を整理する。
MACDヒストグラムと0ラインの意味
まず基礎を整理する。
MACDライン = 短期EMA(通常12)- 長期EMA(通常26) シグナルライン = MACDラインの移動平均(通常9) ヒストグラム = MACDライン-シグナルライン
ヒストグラムが0ラインより上にある = MACDラインがシグナルラインより上 = 上昇モメンタム ヒストグラムが0ラインより下にある = MACDラインがシグナルラインより下 = 下降モメンタム
0ラインクロスとは、ヒストグラムがマイナス圏からプラス圏に転換する(またはその逆)瞬間だ。この転換はMACDラインとシグナルラインがクロスする瞬間と完全に一致する。
なぜ0ラインクロスをEA化するのか
MACDのヒストグラムを使ったトレードアプローチは複数あるが、0ラインクロスは以下の理由でEA実装に向いている。
- 条件が一意に決まる — ヒストグラムが0以下から0以上に変化(または逆)という明確な閾値判定が可能
- ダマシが比較的少ない — MACDラインとシグナルラインの微細なクロスではなく、確定的な転換を捉える
- テクニカル的な一貫性 — 多くのトレーダーが意識するレベルなので自己実現的な側面もある
MQL4実装コード
iMACD()関数のMQL4での書式は以下の通り。
double iMACD(
string symbol,
int timeframe,
int fast_ema_period, // 通常12
int slow_ema_period, // 通常26
int signal_period, // 通常9
int applied_price, // 適用価格(PRICE_CLOSE=0)
int mode, // 0=MACDライン, 1=シグナルライン
int shift // バー番号
)
重要なのはmodeパラメータだ。MT4ではMQL4のiMACD関数のmode=0がMACDライン(MACDヒストグラムではない)を返す点に注意が必要だ。ヒストグラムの値はMACDライン-シグナルラインを手動で計算する必要がある。
// ヒストグラムの取得方法
double histCurrent = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, 0, 0)
- iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, 1, 0);
double histPrev = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, 0, 1)
- iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, 1, 1);
以下が完全な0ラインクロスEAのコードだ。
//+------------------------------------------------------------------+
//| MACD Histogram Zero-Line Cross EA |
//| ヒストグラムが0ラインをクロスしたときに売買 |
//+------------------------------------------------------------------+
#property strict
input int FastPeriod = 12;
input int SlowPeriod = 26;
input int SignalPeriod= 9;
input double LotSize = 0.1;
input int StopLoss = 60;
input int TakeProfit = 120;
input int MagicNumber = 20260007;
void OnTick()
{
// 足確定チェック
static datetime lastBar = 0;
if(Time[0] == lastBar) return;
lastBar = Time[0];
// MACDライン取得
double macdCurr = iMACD(NULL, 0, FastPeriod, SlowPeriod, SignalPeriod,
PRICE_CLOSE, MODE_MAIN, 0);
double macdPrev = iMACD(NULL, 0, FastPeriod, SlowPeriod, SignalPeriod,
PRICE_CLOSE, MODE_MAIN, 1);
double sigCurr = iMACD(NULL, 0, FastPeriod, SlowPeriod, SignalPeriod,
PRICE_CLOSE, MODE_SIGNAL, 0);
double sigPrev = iMACD(NULL, 0, FastPeriod, SlowPeriod, SignalPeriod,
PRICE_CLOSE, MODE_SIGNAL, 1);
// ヒストグラム計算
double histCurr = macdCurr - sigCurr;
double histPrev = macdPrev - sigPrev;
// 0ラインクロス判定
bool zeroCrossUp = (histPrev < 0) && (histCurr >= 0); // マイナス→プラス
bool zeroCrossDown = (histPrev > 0) && (histCurr <= 0); // プラス→マイナス
// ポジション確認
bool hasPos = false;
int posType = -1;
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == MagicNumber)
{
hasPos = true;
posType = OrderType();
break;
}
}
double pt = MarketInfo(Symbol(), MODE_POINT);
int dg = (int)MarketInfo(Symbol(), MODE_DIGITS);
double mul = (dg == 3 || dg == 5) ? 10.0 : 1.0;
// BUYエントリー(0ラインを上抜け)
if(zeroCrossUp && !hasPos)
{
double sl = Ask - StopLoss * pt * mul;
double tp = Ask + TakeProfit * pt * mul;
OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp,
"MACD Zero Cross EA", MagicNumber, 0, clrBlue);
}
// SELLエントリー(0ラインを下抜け)
if(zeroCrossDown && !hasPos)
{
double sl = Bid + StopLoss * pt * mul;
double tp = Bid - TakeProfit * pt * mul;
OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp,
"MACD Zero Cross EA", MagicNumber, 0, clrRed);
}
// 既存ポジションの逆クロスによる決済(オプション)
if(hasPos)
{
if(posType == OP_BUY && zeroCrossDown)
CloseAllOrders();
if(posType == OP_SELL && zeroCrossUp)
CloseAllOrders();
}
}
void CloseAllOrders()
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == MagicNumber)
{
double price = (OrderType() == OP_BUY) ? Bid : Ask;
OrderClose(OrderTicket(), OrderLots(), price, 3, clrOrange);
}
}
}
0ラインクロスの特性と使い分け
MACDクロス vs 0ラインクロス——どちらが先か
MACDラインとシグナルラインのクロス(いわゆる「MACDゴールデンクロス」)は、0ラインクロスより必ず先に発生する。
MACDとシグナルのクロス → ヒストグラムが0 → 0ラインクロス確定
つまり0ラインクロスシグナルは遅行する分、ダマシが少ない代わりにエントリーが遅れる。遅いシグナルをどう評価するかは戦略によって異なる。
- スキャルピング・短期トレード: MACDクロス(早いシグナル、ダマシ多い)
- スイングトレード・日足以上: 0ラインクロス(遅いシグナル、ダマシ少ない)
方向性フィルターとしての活用
0ラインクロスを「エントリーシグナル」ではなく「方向性フィルター」として使う発想も有効だ。
「ヒストグラムがプラス圏にある間のみBUYシグナルを有効にする」という使い方で、他のインジケーター(RSIのオーバーソールド等)との組み合わせフィルターになる。
Claudeと会話しながらインジケータが作れるhedgrow-fxでは、MACD条件とRSIフィルターを組み合わせたカスタムEAの設計をAIとの対話で整理できる。
バックテスト上の注意点
MACD設定の過最適化
MACD期間(12/26/9)はデフォルトのまま使う場合が多いが、バックテストで期間を変えると結果が大きく変わることがある。特に0ラインクロス系EAは、期間を微調整することで特定の相場期間だけに最適化された「見かけ上良い結果」が出やすい。
バックテストの黄金律: テスト期間に含まれていない直近データでウォークフォワードテストを必ず行う。
ヒストグラムの「ひげ」問題
ヒストグラムが0ラインをほんの少しだけ超えてすぐ戻るケースが発生することがある。これは誤シグナルになりやすい。条件を厳しくするには「連続して2本以上のバーがプラス圏に入った場合のみエントリー」という確認フィルターを追加する方法が使われる。
// 2本連続してプラス圏確認
double hist2Prev = iMACD(NULL, 0, FastPeriod, SlowPeriod, SignalPeriod,
PRICE_CLOSE, MODE_MAIN, 2)
- iMACD(NULL, 0, FastPeriod, SlowPeriod, SignalPeriod,
PRICE_CLOSE, MODE_SIGNAL, 2);
bool confirmedCrossUp = (hist2Prev < 0) && (histPrev >= 0) && (histCurr >= 0);
EMAクロスEAとの比較——どちらを選ぶか
| 比較軸 | EMAクロスEA | MACDヒストグラム0クロスEA | |---|---|---| | シグナルのタイミング | 比較的早い | やや遅め | | コード実装の難易度 | 低い | 中程度(ヒストグラム手動計算が必要)| | 適した時間足 | 1時間〜4時間足 | 4時間〜日足 | | ダマシの多さ | 多い(特にレンジ) | 少ない | | 単体使用のPF | 1.0〜1.3程度(典型) | 同程度(ただし取引回数が少ない)|
よくある質問(FAQ)
Q: MT4のMACDインジケーターのヒストグラムとiMACD関数の値は同じですか? A: MT4のデフォルトMACDインジケーターは視覚的には「ヒストグラム」を表示しますが、実際にはMACDライン(2本の移動平均の差)をヒストグラムとして描画しており、一般的なMACDの「MACDライン-シグナルライン」とは異なります。iMACD関数のMODE_MAIN(0)はMACDラインを返し、ヒストグラムを得るには別途計算が必要です。
Q: MACDの0ラインクロスシグナルだけで実際に利益を出せますか? A: 0ラインクロス単体は遅行するシグナルであり、エントリーが相場の変化から遅れる傾向があります。単体使用のPFは1.0〜1.3程度が典型的で、スプレッドを加味すると損益分岐ギリギリのケースもあります。ADXやRSIとの組み合わせで安定性が向上するケースが多いです。
Q: iMACD()のMODE_MAINとMODE_SIGNALの値は何ですか?
A: MQL4ではMODE_MAIN=0(MACDライン)、MODE_SIGNAL=1(シグナルライン)です。ヒストグラムはiMACD(..., 0, shift) - iMACD(..., 1, shift)で算出します。
Q: デフォルトの12/26/9以外の期間を使うべきですか? A: デフォルト値(12/26/9)は多くのトレーダーが使うため「市場参加者が意識するレベル」という側面があります。バックテストで別の期間が良い結果を出しても、それが過最適化である可能性を常に疑ってください。
免責事項: 本記事のコードはサンプルであり、実際の取引での利益を保証するものではありません。FX取引には元本割れを含む損失リスクがあります。実運用前にデモ口座での十分な検証を行ってください。
