【お詫び】EMA200押し目買いの検証結果に重大な誤りがありました
😔 お詫び
以前公開した記事「【YouTube流行り手法検証】EMA200押し目買いは本当に勝てる?4万回で累計+7万pipsの衝撃」に重大な誤りがありました。
深くお詫び申し上げます。
📩 読者からの報告
読者の方から以下の報告をいただきました:
記事を参考にEA化してバックテストしたところ、思ったような結果が出ない。 31通貨ペアでテストしたところ、ほとんどがマイナス。 プラスなのはUSDJPY、AUDUSD、GBPCADなど一部のみ。
実際のバックテスト結果(読者提供):
| 通貨ペア | 損益 | PF |
|---|---|---|
| USDJPYm | +611 | 1.11 |
| AUDUSDm | +255 | 1.06 |
| GBPCADm | +221 | 1.04 |
| GBPJPYm | -1,081 | 0.88 |
| EURNZDm | -2,492 | 0.70 |
| GBPNZDm | -2,673 | 0.69 |
元記事では「EURUSD、GBPJPY、USDJPYで好成績」と書いていましたが、GBPJPYは-1,081の大損でした。
📊 実際のバックテスト結果
バックテスト設定
| 項目 | 設定値 |
|---|---|
| EA | EMA200 Pullback EA |
| 通貨ペア | USDJPYm |
| 期間 | 2022.08.15 〜 2025.12.20 |
| 初期証拠金 | 1,000,000 USD |
| レバレッジ | 1:25 |
| モデル | 1分足 OHLC |
残高推移
緑:残高、青:有効証拠金。約3年間で微プラス程度(+611ドル)。元記事で主張した「累計+69,970pips」とは程遠い結果です。
詳細な統計情報
主要な指標
| 指標 | 値 |
|---|---|
| ヒストリー品質 | 100% |
| 総損益 | +611.79 |
| 総利益 | +6,105.94 |
| 総損失 | -5,494.15 |
| プロフィットファクター | 1.11 |
| リカバリファクター | 1.06 |
| シャープレシオ | 0.71 |
| 期待利得 | 1.69 |
トレード統計
| 指標 | 値 |
|---|---|
| 総取引数 | 363 |
| ロング(勝率) | 363 (33.06%) |
| 勝ちトレード | 120 (33.06%) |
| 負けトレード | 243 (66.94%) |
| 最大勝ちトレード | +57.32 |
| 最大負けトレード | -56.63 |
| 最大連勝数 | 4 (+224.91) |
| 最大連敗数 | 13 (-277.64) |
勝率33%で、3回に1回しか勝てない。 PF1.11は「勝てる」とは言えないレベルです。
時間帯・曜日・月別の分布
上記画像の下部グラフより:
- 時間帯: 10〜17時に取引が集中
- 曜日: 金曜日が最も多い
- 月別: 年間を通じてまんべんなく分散
- 損益: 時間帯により偏りあり(12時台が最も利益)
🔧 使用したEAソースコード
読者の方が作成し、バックテストに使用したMT5用EAのソースコードです:
//+------------------------------------------------------------------+//| EMA200 Pullback EA (MT5) - ロングのみ |//+------------------------------------------------------------------+#property strict
#include <Trade\Trade.mqh>
input int EMA_Period_Trend = 50; // H4トレンド判定用EMA期間input int EMA_Period_Entry = 200; // 15分足エントリー用EMA期間input ENUM_TIMEFRAMES TrendTF = PERIOD_H4;input ENUM_TIMEFRAMES EntryTF = PERIOD_M15;input double Touch_Pips = 10.0; // EMA200タッチ判定幅(pips)input double SL_Pips = 25.0; // 損切り: EMA200から下(pips)input double TP_Pips = 75.0; // 利確: エントリーから上(pips)input double Lots = 0.1;input int MagicNumber = 200200;
double PipValue;datetime lastBarTime = 0;
// インジケータハンドルint emaHandleTrend;int emaHandleEntry;
CTrade trade;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit(){ PipValue = (_Digits == 3 || _Digits == 5) ? _Point * 10 : _Point;
// インジケータハンドルを作成 emaHandleTrend = iMA(_Symbol, TrendTF, EMA_Period_Trend, 0, MODE_EMA, PRICE_CLOSE); emaHandleEntry = iMA(_Symbol, EntryTF, EMA_Period_Entry, 0, MODE_EMA, PRICE_CLOSE);
if(emaHandleTrend == INVALID_HANDLE || emaHandleEntry == INVALID_HANDLE) { Print("インジケータハンドルの作成に失敗しました"); return(INIT_FAILED); }
trade.SetExpertMagicNumber(MagicNumber);
return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick(){ // 15分足の新しいバーでのみ処理 datetime currentBarTime = iTime(_Symbol, EntryTF, 0); if(currentBarTime == lastBarTime) return; lastBarTime = currentBarTime;
if(HasPosition()) return;
// 1. H4でEMA50より価格が上ならトレンド判定 double ema50_h4_array[]; ArraySetAsSeries(ema50_h4_array, true); if(CopyBuffer(emaHandleTrend, 0, 1, 1, ema50_h4_array) <= 0) return; double ema50_h4 = ema50_h4_array[0];
double close_h4 = iClose(_Symbol, TrendTF, 1); bool isUptrend = close_h4 > ema50_h4;
if(!isUptrend) return;
// 2. 15分足でEMA200を取得 double ema200_m15_array[]; ArraySetAsSeries(ema200_m15_array, true); if(CopyBuffer(emaHandleEntry, 0, 1, 1, ema200_m15_array) <= 0) return; double ema200_m15 = ema200_m15_array[0];
// 3. 15分足の前のバーのデータ double prevLow = iLow(_Symbol, EntryTF, 1); double prevClose = iClose(_Symbol, EntryTF, 1);
double touchRange = Touch_Pips * PipValue;
// EMA200にタッチしたか判定(10pips以内) bool touchedEMA = (prevLow <= ema200_m15 + touchRange) && (prevLow >= ema200_m15 - touchRange);
// 4. 条件を満たせば買いエントリー if(touchedEMA) { double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // 損切り: EMA200 - 25pips double sl = ema200_m15 - SL_Pips * PipValue; // 利確: エントリー + 75pips double tp = ask + TP_Pips * PipValue;
sl = NormalizeDouble(sl, _Digits); tp = NormalizeDouble(tp, _Digits);
if(!trade.Buy(Lots, _Symbol, ask, sl, tp, "EMA200 Pullback")) { Print("OrderSend Error: ", GetLastError()); } }}
//+------------------------------------------------------------------+//| ポジション有無チェック |//+------------------------------------------------------------------+bool HasPosition(){ for(int i = PositionsTotal() - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(ticket > 0) { if(PositionGetInteger(POSITION_MAGIC) == MagicNumber && PositionGetString(POSITION_SYMBOL) == _Symbol) return true; } } return false;}EAのロジック解説
- トレンド判定: H4足でEMA50より価格が上なら上昇トレンド
- エントリー条件: 15分足の安値がEMA200に10pips以内でタッチ
- 損切り: EMA200から25pips下
- 利確: エントリー価格から75pips上
元記事で説明した条件を忠実に再現しています。
🔍 再検証した結果
改めてPythonで検証し直しました:
【再検証結果】
SL25/TP75(元記事推奨): 総トレード: 33 総pips: -225 pips ← 元記事は+69,970pipsと主張
SL30/TP60: 総トレード: 40 総pips: -30 pips
ベスト: GBPUSD SL30/TP60で+270pips程度
※元記事の「月間1,900pips」は完全な虚偽😱 何が間違っていたのか
可能性1: 検証コードのバグ
元の検証スクリプトにバグがあった可能性があります。
特に疑わしいのは:
- タッチ判定の計算ミス
- トレード数のカウントミス
- pips計算の桁間違い
可能性2: データの問題
使用したデータに問題があった可能性:
- 足りないデータ
- 重複したデータ
- 異常値の混入
可能性3: 過剰なオーバーフィット
意図せず特定期間に過剰にフィットした設定を見つけてしまった可能性。
バックテストで良い結果が出ても、実運用(またはEA化)すると機能しないのは、オーバーフィットの典型的な症状です。
📝 訂正内容
元記事の主張(誤り)
EURUSD SL=25pips / TP=75pips で 累計+69,970pips(3年間)
年間約23,000pips。月間約1,900pips。
これ、ガチで最強クラスの手法です。
正しい結果
再検証では累計-225pips(マイナス)
- 「累計+69,970pips」→ 嘘でした
- 「月間約1,900pips」→ 嘘でした
- 「ガチで最強クラスの手法」→ 嘘でした
🙇 読者の皆様へ
この記事を信じて:
- EAを開発した方
- 資金を投入した方
- 時間を費やした方
本当に申し訳ありませんでした。
金銭的・時間的な損失を与えてしまった可能性があります。
🤔 なぜこんなことが起きたのか
正直に言います。
検証の甘さ
- 一度の検証で結論を出してしまった
- 複数の方法で検証しなかった
- EAで実際に動かして確認しなかった
確証バイアス
- 「YouTubeで人気=勝てるはず」という先入観
- 良い結果が出たら深掘りせず公開
- 悪い結果は「設定が悪い」で片付けた
検証の難しさ
これは言い訳ではなく事実として:
- 15分足の長期データ取得が困難
- マルチタイムフレームの検証は複雑
- バグが入り込みやすい
しかし、それでも公開前にEA化して確認すべきでした。
📋 今後の対応
1. 元記事への注意書き追加
元記事の冒頭に「検証結果に誤りがある可能性」の警告を追加しました。
2. 検証プロセスの見直し
今後の検証では:
- 複数の方法で検証(Python + EA)
- 第三者による再現確認
- 期間を変えて複数回検証
3. 読者フィードバックの重視
今回のように「実際にやったら違った」という報告は非常に貴重です。
💡 この件から学んだこと
1. 検証は1回じゃ足りない
バックテストは最低3回、異なる方法でやるべき。
2. EAで動かして初めて「検証完了」
Pythonのバックテストだけでは不十分。実際にEAで動かして確認すべき。
3. 読者を信じろ
「記事通りにやったのに勝てない」という報告があったら、読者が正しい可能性を考える。
🙏 最後に
FXの検証記事を書いている者として、「勝てる」と言った手法が実は勝てなかったというのは最悪の失態です。
今回の件を教訓に、今後は:
- より慎重な検証
- EA化での確認
- 複数期間でのテスト
を徹底します。
改めて、深くお詫び申し上げます。
📚 関連記事
- 【全面訂正】EMA200押し目買い検証は完全な誤りでした - 原因考察を含む詳細な訂正記事
2025年12月27日 記事公開
今後も誤りを発見した場合は、速やかに訂正・お詫びします。
🎁おすすめツール・サービス
※上記リンクにはプロモーション(広告)が含まれています
量子相場謀略|ホソノP
ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。