最終更新: 2026年06月
「MACDのゴールデンクロスでトレードするEAを作りたい」という相談は多い。実装自体は単純だ。問題はその後にある——単純なゴールデンクロスEAが長期バックテストでほぼ利益を出さないという現実だ。
本記事では、MACDゴールデンクロスの計算原理からMQL5での実装、そして「なぜ単純なクロスだけでは不十分か」という設計上の問題点を整理する。
MACDとは何か——計算原理の整理
MACD(Moving Average Convergence Divergence)は、短期EMAと長期EMAの「差」を可視化したトレンド系指標だ。価格の「勢い」と「方向性」を同時に把握できるため、トレーダーの間で長年にわたって使われ続けている。
MACDライン = EMA(12) - EMA(26)
シグナルライン = MACDラインのEMA(9)
ヒストグラム = MACDライン - シグナルライン
標準設定は12/26/9だ。この数字はRSIの14と同様、多くのトレーダーが同じ設定を使うことで「共通の目線」を生む効果がある。
MACDがゼロより上にある状態は「短期EMAが長期EMAを上回っている=上昇モメンタムが優勢」を意味し、ゼロより下は逆の状態を示す。ヒストグラムの拡大・縮小でモメンタムの強さの変化も読み取れる。
ゴールデンクロスとデッドクロスの定義
ストキャスティクスや移動平均線でも使われる「ゴールデンクロス・デッドクロス」という言葉だが、MACDの文脈では以下の2種類がある。
| クロスの種類 | 定義 | |---|---| | MACDライン × シグナルライン | MACDがシグナルを上抜け(ゴールデンクロス)→買い / 下抜け(デッドクロス)→売り | | MACDライン × ゼロライン | MACDがゼロを上抜け→上昇確認 / 下抜け→下降確認 |
どちらを「ゴールデンクロス」と呼ぶかは文脈によって異なる。EAを設計するときは、どちらのクロスを使うのかを仕様として明確に定義しておく必要がある。
MACDを構成する3要素の役割
MACDラインはトレンド方向とモメンタムを示す。シグナルラインはMACDラインの平滑化であり、「ノイズを減らしたMACDの方向性」を示す。ヒストグラムは両者の差で、モメンタムの加速・減速を最もリアルタイムに反映する。
EA設計上の実用的なポイントとして、「ヒストグラムが縮小してきたらシグナルが弱くなってきた」というフィルターとして使えることが挙げられる。
バックテスト上の現実——単純クロスEAの限界
正直に言う。MACDのシグナルクロスだけをトリガーにした単純EAのバックテスト成績は、長期間で検証するとプロフィットファクターが1.00前後に収束しやすい。
20年分のバックテストを実施した独立検証では、シンプルなゴールデンクロス/デッドクロスEAは勝率36%・敗率63%で最終損益がほぼトントンになった(出典: gplustuts.com の独立検証)。これは取引コスト(スプレッド・スリッページ)を考慮すると実質的にマイナスを意味する。
なぜか。理由は2つある。
- ダマシの多さ: 低ボラティリティ環境ではクロスが頻発し、ほとんどが小さな損失で終わる
- 遅行性: MACDはEMAの差分であり、計算上必ず価格変動に遅れる。クロスが発生した時点でトレンドの初動を過ぎているケースが多い
レンジ相場でのパフォーマンス悪化
MACDのような遅行系指標は、トレンド相場では機能するが、レンジ相場では致命的に機能しない。価格が横ばいの状態でもクロスは発生し、そのたびに損失を積み重ねる。EURUSDの2022〜2023年のレンジ相場期間を対象にした検証では、単純MACDクロスEAの月次損益が7ヶ月連続でマイナスになったケースがある。
設計改善:4つのフィルター追加で精度を上げる
単純クロスEAをまともに機能させるには、最低限以下のフィルターが必要だ。
フィルター1: ゼロライン確認
MACDとシグナルのクロスを「ゼロライン以下でのゴールデンクロス(買いシグナル)」「ゼロライン以上でのデッドクロス(売りシグナル)」に限定する。
ゼロライン以上でゴールデンクロスが発生する場合、すでにトレンドが進行中であることが多く、エントリーが遅い。ゼロライン以下でのクロスはトレンド初動に近い。
このフィルターを追加するだけで、シグナルの質が大幅に向上する。バックテストでの検証でも、ゼロラインフィルターなしと比較して、勝率が5〜10%改善されるケースが報告されている。
フィルター2: ヒストグラムの方向確認
クロスのタイミングだけでなく、ヒストグラムが連続して同方向に拡大しているかを確認する。
// 買いシグナルの例:2本連続でヒストグラムが拡大している
if(hist_current > hist_prev_1 && hist_prev_1 > hist_prev_2) {
// ヒストグラム拡大確認
}
ヒストグラムが縮小しているのにゴールデンクロスが発生するケースは「偽のクロス」になる可能性が高い。モメンタムの方向性がシグナルと一致している場合のみエントリーを許可することで、フォルスシグナルを大幅に削減できる。
フィルター3: トレンドフィルター(移動平均線)
上位時間足(日足など)のEMA200と価格の位置関係を確認する。EMA200より上にいるときは買いのみ、下にいるときは売りのみを許可する。
このフィルターは「大きなトレンドに逆らうエントリーを排除する」という本質的な役割を持つ。MACD単独のシグナルに上位足トレンドのフィルターを重ねることで、大局観と一致したエントリーのみを実行できる。実装は数行で済むが、効果は大きい。
フィルター4: ボラティリティフィルター(ATR)
ATR(Average True Range)が一定値以下のとき、エントリーを禁止する。低ボラティリティ環境でのダマシを排除するためだ。
double atr = iATR(_Symbol, _Period, 14, 0);
if(atr < min_atr_threshold) return; // 低ボラでスキップ
ATRの閾値は通貨ペアと時間足によって異なるため、バックテストで最適な値を確認する必要がある。たとえばUSDJPY H1であれば、ATRが0.15(15pips)を下回る局面はレンジ状態と判断してスキップする設計が一例だ。
MQL5実装コード(骨格)
MQL5でのMACD取得は iMACD() を使う。
// ハンドルの作成(OnInit内)
int macd_handle = iMACD(_Symbol, _Period, 12, 26, 9, PRICE_CLOSE);
// 値の取得(OnTick内)
double macd_main[];
double macd_signal[];
ArraySetAsSeries(macd_main, true);
ArraySetAsSeries(macd_signal, true);
CopyBuffer(macd_handle, MAIN_LINE, 0, 3, macd_main);
CopyBuffer(macd_handle, SIGNAL_LINE, 0, 3, macd_signal);
// ゴールデンクロス判定
bool golden_cross = (macd_main[1] > macd_signal[1]) && (macd_main[2] <= macd_signal[2]);
// ゼロライン以下のクロスのみ有効とする
bool below_zero = (macd_main[1] < 0);
if(golden_cross && below_zero) {
// 買いエントリー処理
}
MT4との違いは CopyBuffer() でバッファからデータを取得する点だ。MT4の iMACD() と引数の構造が異なるので注意が必要だ。
ヒストグラムフィルターを追加した完全版骨格
// ヒストグラムの取得
double hist[];
ArraySetAsSeries(hist, true);
CopyBuffer(macd_handle, 2, 0, 4, hist); // HISTOGRAM_LINE = 2
// ヒストグラム拡大確認(2バー連続)
bool hist_expanding = (hist[1] > hist[2]) && (hist[2] > hist[3]);
// 全フィルターを組み合わせたエントリー条件
if(golden_cross && below_zero && hist_expanding) {
// 高品質なシグナルとして処理
}
このようにフィルターを追加するほどシグナル数は減るが、精度は上がる。取引回数が統計的有意水準(200回以上)を下回らないよう、バランスを調整する必要がある。
バックテスト設計の注意点
MACDゴールデンクロスEAをバックテストする際の設計上の注意点を整理する。
過剰最適化(カーブフィッティング)の回避
12/26/9というパラメータを最適化ツールで変更してバックテストを行い、「最も成績の良いパラメータ」を見つけることは容易だ。しかしその結果は過去データへの特殊適合であり、フォワードテストでは機能しないことが多い。
パラメータは標準設定のまま使い、フィルター条件の追加によって精度を上げることを推奨する。
「9/21/5」など非標準パラメータへの変更が有効に見えるバックテスト結果は、その期間の相場特性への過適合である可能性が高い。異なる5年間のデータで同じパラメータが機能するかを必ず確認すること。
最低サンプル数の確保
バックテストで「有意な結果」として扱うには、最低200回以上のトレードサンプルが必要だ。それ未満の結果は統計的信頼性が低い。
フィルターを多数追加すると、シグナル数が激減して200回に届かなくなることがある。その場合はテスト期間を延ばすか、一部フィルターの閾値を緩めてサンプル数を確保する。
ウォークフォワードテスト
バックテスト期間の最後の30%をフォワード期間として残し、最初の70%でパラメータを確定してから後半で検証するウォークフォワード設計が有効だ。
MT5のストラテジーテスターには最適化後にアウトオブサンプル期間でテストを走らせる機能が用意されている。この機能を活用することで、カーブフィッティングを効率的に検出できる。
テスト期間の選び方
MACDのような遅行系指標は相場環境によって性能が大きく変わる。トレンド相場が続いた期間だけでバックテストすると過大評価になる。最低でも2〜3年のデータを使い、トレンド・レンジ・高ボラティリティの各環境を含む期間で検証することを推奨する。
まとめ
MACDゴールデンクロスEAを機能させるための要点:
- 単純クロスだけでは長期的に利益が出ない — 追加フィルターが必須
- ゼロラインフィルターで質の高いシグナルに絞る — ゼロライン以下でのゴールデンクロスが優位
- ヒストグラムの拡大方向を確認する — モメンタムの裏付けを取る
- 上位足トレンドフィルターを追加する — 大局観と一致したエントリーのみ実行
- ATRフィルターでレンジ相場をスキップ — 低ボラ環境のダマシを排除
- パラメータ変更より構造改善を優先 — 過剰最適化リスクを避ける
よくある質問(FAQ)
Q: MACDとシグナルのクロスだけでEAは作れますか? A: 作れるが、長期バックテストでプロフィットファクターが1.00前後に収束しやすい。最低でも1〜2のフィルターを追加することを強く推奨する。
Q: MACDの最適な設定値は12/26/9以外にありますか? A: 設定値の変更より、フィルター条件の追加の方がEAの安定性改善に効果的なケースが多い。設定値変更は過剰最適化リスクを高める。
Q: MT4とMT5でMACD実装の違いはありますか? A: MT5ではハンドル方式(iMACD()でハンドルを作成し、CopyBuffer()でデータ取得)に変わった。MT4の直接値取得方式との構文差異に注意する。
Q: ヒストグラムとMACDラインの違いは何ですか? A: MACDライン(EMA12-EMA26の差)とシグナルライン(MACDラインのEMA9)の差がヒストグラムだ。ヒストグラムがゼロを超えたとき、MACDラインがシグナルラインを上抜けたことを意味する。
Q: ゼロライン以下でのゴールデンクロスだけを使うべき理由は? A: ゼロライン以上でのゴールデンクロスは既にトレンドが進行中のことが多く、エントリーが遅くなりやすい。ゼロライン以下でのクロスの方がトレンドの初動に近く、理論的には優位性が高い——ただしこれは仮説であり、実際のバックテスト検証が必要だ。
Q: MACD系EAのバックテストには何年のデータが必要ですか? A: 最低2年、推奨は5年以上だ。MACDは相場環境の影響を強く受けるため、トレンド・レンジ・高ボラティリティの各環境を含む長期データでの検証が必要だ。
Q: MACDとRSIを組み合わせるとどんな効果がありますか? A: MACDがトレンド方向のフィルター、RSIが過買い・過売りのフィルターとして機能する。MACDゴールデンクロスが発生したときにRSIが50以下(過売りではないが買われすぎでもない)なら、より質の高いエントリーとして評価できる。ただし組み合わせによってシグナル数が激減する点に注意が必要だ。
免責事項: 本記事はFXトレードおよびEA設計の教育目的で作成されています。FX取引には元本割れを含む損失リスクがあります。バックテスト結果は過去のデータに基づくものであり、将来の利益を保証するものではありません。投資判断はご自身の責任において行ってください。
著者: Hedgrow FX編集部(金融工学専門家監修)
