【検証#06】バックテスト詐欺の手口を知る¶
この記事の3行まとめ
- 🚨 バックテストで「未来のレート」を参照すれば100%勝てるEAが作れる
- 💀 これは詐欺の手口であり、リアル口座では絶対に勝てない
- 🛡️ 見破り方:フォワードテストとコードレビュー
はじめに¶
この記事は、「とあるMetaTraderの備忘秘録」様のブログ記事を検証・紹介するシリーズの第6弾です。
今回は技術検証ではなく、EA購入者を守るための重要な知識をお届けします。
元ネタ
どんな通貨ペア時間足でもバックテストで利益の出るEA
https://fai-fx.hatenadiary.org/entry/20090930/1254280820
(2009年9月30日 公開)
時代背景に関する注意
この記事の元となるブログ記事は2009年頃に公開されたものです。
MQL5の仕様変更により、一部のハック的な未来参照手法は無効化されていますが、概念は依然として重要です。
なぜこの知識が重要なのか¶
インターネット上には「勝率99%」「年利300%」を謳うEAが溢れています。
その多くが見せているのはバックテスト結果です。
しかし、バックテストには致命的な弱点があります: 「未来のレートを知っている状態でテストできる」 ということです。
未来参照の仕組み¶
バックテスト時、MT4/MT5はすべてのヒストリカルデータを読み込んでいます。
つまり、プログラムから「1本先」「10本先」のローソク足を参照することが可能です。
// バックテスト時だけ動作する「詐欺コード」の概念図
void OnTick()
{
// 次のバーの終値を取得(バックテストでは可能!)
double nextClose = iClose(_Symbol, PERIOD_CURRENT, -1); // 未来のバー
double currentClose = iClose(_Symbol, PERIOD_CURRENT, 0);
// 未来の方向がわかれば、必ず勝てる
if(nextClose > currentClose)
Buy(); // 上がるとわかっているので買い
else
Sell(); // 下がるとわかっているので売り
}
注意:実際のコードはより巧妙
上記は概念を示す疑似コードです。
実際の詐欺EAはこれを巧妙に隠蔽しています。
より巧妙な手口¶
1. インジケータ経由の未来参照¶
インジケータのバッファに未来の値が入っていることを利用:
// 一部のインジケータは未来のバーの値を参照可能
double futureValue = iCustom(_Symbol, PERIOD_CURRENT, "SomeIndicator", 0, -1);
2. リペイントインジケータの利用¶
過去のシグナルを書き換える「リペイント」インジケータを使い、 バックテストでは「常に正しいシグナルが出ていた」ように見せる。
3. 配列インデックスのトリック¶
ArraySetAsSeries の設定で混乱させ、実質的に未来参照していることを隠す。
実際にどれくらい勝てるのか¶
未来参照を使えば、理論上100%勝つことが可能です。
| 条件 | バックテスト結果 | リアル運用結果 |
|---|---|---|
| 未来参照あり | 勝率100%、右肩上がり | 動作しない or 大損 |
| 未来参照なし | 現実的な結果 | 同様の結果が期待できる |
見破り方¶
1. フォワードテストを確認¶
最も確実な方法
デモ口座でのリアルタイム運用結果を確認する。
バックテスト結果だけを見せるEAは要注意。
- MyFXBookなどの第三者検証サービスを確認
- 最低3ヶ月以上の実運用データを要求
2. ソースコードを確認(可能な場合)¶
以下のパターンがないかチェック:
// 危険なパターン1: 負のインデックス
double value = Close[-1]; // 未来参照
double value = iClose(_Symbol, PERIOD_H1, -5); // 未来参照
// 危険なパターン2: Rates配列で未来を参照
MqlRates rates[];
CopyRates(_Symbol, PERIOD_H1, -10, 20, rates); // 開始位置が負
// 危険なパターン3: 不自然なバッファ参照
double signal = buffer[i - 10]; // ループ内で「前」を参照しているように見えて実は未来
3. チェックリスト¶
| 確認項目 | 安全 | 危険 |
|---|---|---|
| フォワードテスト公開 | ✓ | ✗ |
| ソースコード公開 | ✓ | ✗ |
| 販売者の実績 | ✓ | ✗ |
| 現実的な成績 | ✓ | ✗ 過剰 |
| 返金保証 | ✓ | ✗ |
リペイントの見破り方¶
リペイントインジケータは、過去のシグナルを書き換えます。
リアルタイムで確認する方法¶
- MT5でインジケータを適用
- 最新のシグナルをスクリーンショット
- 数時間〜数日後に再確認
- 過去のシグナルが変わっていたらリペイント
コードで確認する方法¶
// リペイントの典型的なパターン
// CalculateOnBarOpen = false のインジケータで、
// i = 0 (現在のバー) を計算している場合は要注意
for(int i = 0; i < rates_total; i++)
{
// i = 0 の時に計算して buffer[0] に書き込むと
// 次のバーでは buffer[1] になり、値が「確定」したように見える
buffer[i] = SomeCalculation(close[i], close[i+1], ...);
}
健全なEA選びのポイント¶
- フォワードテストを重視: バックテストよりリアルタイム結果
- ドローダウンを確認: 勝率100%は疑う
- ソースコード入手: できれば自分でレビュー
- コミュニティの評判: フォーラムやレビューサイト
- 少額から開始: いきなり大金を投入しない
まとめ¶
| ポイント | 内容 |
|---|---|
| 手口 | バックテスト時に未来のレートを参照 |
| 結果 | バックテストでは100%勝てる |
| リアル | まったく機能しないか大損 |
| 対策 | フォワードテストとコードレビュー |
オリジナル記事への謝辞
この記事は「とあるMetaTraderの備忘秘録」様の貴重な知見をもとに、
現代の視点で解説を加えたものです。
2009年に既にこの問題を指摘されていたことに敬意を表します。
関連用語¶
この記事で登場した用語は用語集でも解説しています。