最終更新: 2026年6月
MACDのパラメーター(12/26/9)を変えれば成績が上がる——そう考えてバックテストで最適化を試みた結果、過剰適合を起こして実運用で悲惨な成績になった経験を持つEA開発者は少なくない。
結論から言うと、MACDのデフォルト設定(12/26/9)が多くのトレーダーに支持されているのには合理的な理由がある。自分のトレードスタイルと時間足に合わせた調整は意味があるが、「数値を弄り回せば正解が見つかる」という発想がそもそも危険だ。
本稿ではMACDの設定値を変える場合のロジックと、バックテストで検証する際の正しい方法論を解説する。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
MACDの構造——12・26・9の意味
MACDは3つの値で構成される:
MACDライン = EMA(終値, 12) − EMA(終値, 26)
シグナルライン = EMA(MACDライン, 9)
ヒストグラム = MACDライン − シグナルライン
12(短期EMA): 約2.5週間分の取引日数 26(長期EMA): 約1ヶ月分の取引日数 9(シグナル): 約2週間分の取引日数
この設定はジェラルド・アペルが1970年代に株式市場向けに設計したものだ。「週5日取引 × 約3週間 = 15」という感覚的な数値から、実用上の修正が加わって12・26・9になった。FXに転用されてもこの設定が機能するのは、世界中のトレーダーが同じ数値を参照しているという「自己実現効果」が働いているからでもある。
MACDのシグナルパターンと設定値の影響
シグナル種別ごとの設計
1. ゴールデンクロス/デッドクロス(最も一般的)
// MACDラインがシグナルラインを上抜け → 買い
bool macdCrossUp = (prevMACD < prevSignal) && (currMACD >= currSignal);
// MACDラインがシグナルラインを下抜け → 売り
bool macdCrossDown = (prevMACD > prevSignal) && (currMACD <= currSignal);
短期設定(6/13/5)ではクロスが頻繁に発生し、ダマシが増える。長期設定(24/52/9)ではクロスが遅延するが信頼性は向上する。
2. ゼロラインクロス
// MACDラインがゼロを上抜け → トレンド転換の確認
bool macdAboveZero = (prevMACD < 0.0) && (currMACD >= 0.0);
ゼロラインクロスはゴールデンクロスより遅れて発生するが、トレンドの方向転換をより確実に確認できる。EAでフィルターとして使いやすい。
3. ヒストグラムの縮小・拡大
// ヒストグラムが縮小中(モメンタムが弱まっている)
bool histogramDecreasing = (currHistogram > 0 && currHistogram < prevHistogram);
ヒストグラムの方向変化を「トレンドのモメンタム変化」のシグナルとして使う高度な手法。
MQL5での実装コード
input int FastEMA = 12;
input int SlowEMA = 26;
input int SignalSMA = 9;
input ENUM_APPLIED_PRICE MACDPrice = PRICE_CLOSE;
int MACDHandle;
double MACDMainBuffer[]; // MACDライン
double MACDSignalBuffer[]; // シグナルライン
int OnInit()
{
MACDHandle = iMACD(_Symbol, _Period, FastEMA, SlowEMA, SignalSMA, MACDPrice);
if(MACDHandle == INVALID_HANDLE)
{
Print("MACDハンドル取得失敗");
return INIT_FAILED;
}
ArraySetAsSeries(MACDMainBuffer, true);
ArraySetAsSeries(MACDSignalBuffer, true);
return INIT_SUCCEEDED;
}
// MACD値の取得
bool GetMACDValues(double &macd, double &signal, double &histogram, int shift = 0)
{
if(CopyBuffer(MACDHandle, 0, 0, 3 + shift, MACDMainBuffer) < (3 + shift))
return false;
if(CopyBuffer(MACDHandle, 1, 0, 3 + shift, MACDSignalBuffer) < (3 + shift))
return false;
macd = NormalizeDouble(MACDMainBuffer[shift], _Digits + 1);
signal = NormalizeDouble(MACDSignalBuffer[shift], _Digits + 1);
histogram = NormalizeDouble(macd - signal, _Digits + 1);
return true;
}
// クロスシグナルの検出
int CheckMACDCross()
{
double macd0, sig0, hist0;
double macd1, sig1, hist1;
if(!GetMACDValues(macd0, sig0, hist0, 0)) return 0;
if(!GetMACDValues(macd1, sig1, hist1, 1)) return 0;
if(macd1 < sig1 && macd0 >= sig0) return 1; // ゴールデンクロス
if(macd1 > sig1 && macd0 <= sig0) return -1; // デッドクロス
return 0;
}
void OnDeinit(const int reason)
{
IndicatorRelease(MACDHandle);
}
MQL5のiMACD関数では、バッファ0がMACDライン、バッファ1がシグナルラインだ。MQL4のiMACD()とは引数の順序が異なるため、移植時には注意が必要になる。
トレードスタイル別の推奨設定値
| トレード形態 | 短期EMA | 長期EMA | シグナル | 主な時間足 | 特徴 | |------------|--------|--------|--------|---------|-----| | スキャルピング | 6 | 13 | 5 | M1〜M5 | 高頻度・ダマし多め | | デイトレード | 12 | 26 | 9 | M15〜H1 | 標準・バランス型 | | スイング | 19 | 39 | 9 | H4〜D1 | 遅延少・信頼性高 | | 長期ポジション | 24 | 52 | 9 | D1〜W1 | 低頻度・安定型 |
ジョー・ディナポリの8/17/9設定は「12/26/9より早く機能する」と主張されており、FXコミュニティでの利用者も一定数いる。ただし「早い」ということは「ダマしも早く発生する」という裏返しでもある。
バックテストでの設定値最適化——正しい手順
Step 1: 固定する変数と最適化する変数を分離
全パラメーターを同時に最適化するのは過剰適合の温床だ。まずシグナル値(9)は多くの場合固定してよい。MACDラインとシグナルラインの計算は数理的に独立しているため、シグナル期間はMACDラインの期間とは別に考えられる。
最適化の優先順位:
- FastEMAとSlowEMAの比率(重要)
- シグナルSMAの期間(次に重要)
- 適用価格(CLOSE/TYPICAL等)(最後に検討)
Step 2: 探索範囲の設定
FastEMA: 6〜20、ステップ2
SlowEMA: 20〜52、ステップ2(FastEMAより必ず大きくなるよう制約)
SignalSMA: 5〜14、ステップ1
制約条件: SlowEMA > FastEMA を必ず守る。これを無視すると「数学的に意味のない逆転したMACD」を計算してしまう。
// OnInit()内でパラメーターの整合性チェック
if(FastEMA >= SlowEMA)
{
Print("エラー: FastEMA はSlowEMAより小さい必要があります");
return INIT_PARAMETERS_INCORRECT;
}
Step 3: 評価基準の設計
double OnTester()
{
double pf = TesterStatistics(STAT_PROFIT_FACTOR);
double dd = TesterStatistics(STAT_EQUITY_DD_RELATIVE);
int trades = (int)TesterStatistics(STAT_TRADES);
double winRate = TesterStatistics(STAT_WIN_TRADES) / trades;
if(trades < 150) return 0.0; // 少ないトレード数は無効
if(pf < 1.2) return 0.0; // 最低ラインを設定
// 複合評価スコア
return pf * (1.0 - dd / 100.0);
}
なぜ12/26/9がロバストなのかの数理的考察
複数の検証レポートを見ると、MACD(12/26/9)は多くの通貨ペアと時間足で「安定して中位〜上位のパフォーマンス」を示す傾向がある。最高値は出さないが、最悪値にもなりにくい。
これは「多くのトレーダーが参照する設定値には、市場参加者の行動パターンが集約される」という効果が働いているためと考えられる。ノイズとシグナルの分離という観点から見ても、12と26の比率(約1:2)はEMAの数理的特性から見て適切な「感度と安定性のバランス」を実現している。
変更するメリットがあるのは、特定の時間足・通貨ペアで「12/26/9が特に機能しにくいことが検証で確認できた場合」に限定すべきだ。「もっと良い数値があるはず」という思考はバックテストの過剰最適化に繋がりやすい。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
よくある質問(FAQ)
Q: MACDのゴールデンクロスだけでEAを作れますか? A: シンプルなMACDクロスEAは作れますが、単独では多くの場合プロフィットファクターが1.0前後になります。ADXフィルター(ADX≥25)やRSIフィルターを追加して、トレンドが明確な局面に絞ることで成績が改善するケースが多いです。
Q: MACDヒストグラムとMACDラインのどちらをシグナルに使うべきですか? A: ヒストグラムはMACDラインよりも一歩早いシグナルを出しますが、その分ダマしも多くなります。EAでの利用はMACDライン×シグナルラインのクロスの方がシンプルで実装しやすく、初期設計には推奨します。
Q: iMACD関数でヒストグラムの値を直接取得できますか?
A: MQL5のiMACDはバッファ0(MACDライン)とバッファ1(シグナルライン)のみ返します。ヒストグラムはコード内でhistogram = macd - signalとして計算する必要があります。
Q: バックテストで最適化した設定値は何年おきに見直すべきですか? A: 相場環境の変化(ボラティリティ体制の変化、中央銀行政策の転換など)があった後に見直すことを推奨します。定期的には半年〜1年ごとにフォワードテストとバックテストの乖離をチェックすることが実用的です。
著者情報
本記事は金融工学・アルゴリズム取引の実務経験を持つライターが執筆しています。
免責事項: 本記事はFXの教育・情報提供を目的としており、投資勧誘を行うものではありません。FX取引には元本割れリスクがあります。バックテスト結果は将来の運用成果を保証しません。実際の取引は自己責任で行ってください。
