コンテンツにスキップ

【検証#13】「リペイント」の正体と対策 — 過去が書き換わる恐怖

リペイント検証結果

図:検証インジケータの動作確認

この記事の3行まとめ

  • 🎨 リペイントには「正常な更新」と「悪質な書き換え」がある
  • 😈 悪質なツールは現在足のサインを1本前(過去)にずらして表示する
  • 🛡️ 対策:ストラテジーテスターのビジュアルモードで見抜く!

はじめに

この記事は、「とあるMetaTraderの備忘秘録」様のブログ記事を検証・紹介するシリーズの第13弾です。

FX初心者が最も騙されやすいのが「リペイント(Repaint)」するインジケータです。 チャートを見ると天井と大底でドンピシャのサインが出ているのに、実際に使ってみると全く勝てない……。そのカラクリを暴きます。

元ネタ

リペイントの定義
https://fai-fx.hatenadiary.org/entry/20100730/1280424681
(2010年7月30日 公開)


良いリペイント vs 悪いリペイント

✅ 正常な動作(良いリペイント)

現在足(最新の足) のサインが点いたり消えたりする」のは、リペイントではありません(というか仕様です)。 終値が確定するまではRSIもMAも変動するため、サインも変動するのは当然です。

❌ 詐欺的な動作(悪いリペイント)

問題なのは「確定したはずの過去の足 のサインが変化する」ことです。 これを通称「リペイント」と呼びます。特に悪質なのがバックシフト(Back Shift)です。


詐欺の手口:バックシフト

これが典型的な詐欺インジケータのロジックです。

  1. 現在足(足0)でゴールデンクロスが発生した。
  2. このまま表示すると、少し遅れた位置にサインが出る。
  3. 「そうだ、1本前(足1)にサインを出そう!」
  4. プログラムで Buffer[1] = Arrow と書き込む。

見え方の違い

  • リアルタイム: 現在足でクロスした瞬間、突然「1本前の足」に矢印が出現する。
  • 後で見るチャート: まるで底値で予知したかのように、クロス発生前のローソク足に矢印が残る。

MQL5での検証コード

この「未来予知(カンニング)」を行うインジケータを作成しました。

ファイル名: 13_Repaint_Test_Indi.mq5
保存先: MQL5\Indicators
使い方: パラメータ EnableRepainttrue にしてチャートに入れます。

MQL
//+------------------------------------------------------------------+
//|                                     13_Repaint_Test_Indi.mq5      |
//| ※動作原理を示すための簡易版コードです                                  |
//| 完全版は mql5_codes/13_Repaint_Test_Indi.mq5 を参照してください          |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_width1  2

input bool EnableRepaint = true; // ★詐欺モードON

double BufferBuy[];
double BufferSell[]; // ダミー

int OnInit()
{
   SetIndexBuffer(0, BufferBuy, INDICATOR_DATA);
   SetIndexBuffer(1, BufferSell, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_ARROW, 233); // 矢印コード
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   if(rates_total < 3) return(0);

   int limit = prev_calculated - 1;
   if(limit < 2) limit = 2;

   for(int i = limit; i < rates_total; i++)
   {
      BufferBuy[i] = EMPTY_VALUE;

      // 簡易シグナル判定(例:反発上昇)
      // ※完全版では移動平均クロスを使用しています
      bool isGC = (close[i] > close[i-1] && close[i-1] < close[i-2]);

      int plotIndex = i;

      // ★ここが詐欺ロジック★
      // サインを「1本前(過去)」にずらす
      if(EnableRepaint)
      {
         plotIndex = i - 1; 
      }

      if(isGC)
      {
         // 過去の足を書き換える!(i-1 に書き込み)
         // 本来 i の位置に出るべき矢印を、i-1 に置いてしまう
         BufferBuy[plotIndex] = low[plotIndex]; 
      }
   }
   return(rates_total);
}

確認方法

  1. ストラテジーテスターを起動します。
  2. 「ビジュアルモード(可視化)」をオンにします。
  3. このインジケータを動かします。
  4. 矢印が出る瞬間をよく観察してください。足が確定した瞬間に、ひとつ前の足にポッと矢印が出るはずです。

これが「バックテスト(ビジュアルなし)や過去チャートだけで判断してはいけない」理由です。


まとめ

ポイント 内容
現在足の点滅 正常な動作。確定まで待つのが基本。
過去足の出現 詐欺。バックシフト型リペイント。
見抜き方 バックテストのビジュアルモードで、サインが出る瞬間を目視確認する。

「勝率90%の神ツール」なんてものがもしあったら、まずはストラテジーテスターで動かしてみてください。 魔法の正体は、単なる「後出しジャンケン」かもしれません。


ソースコードのダウンロード

この記事で紹介したリペイント検証用インジケータをダウンロードできます。

ファイルの種類:インジケータ

保存先: MQL5/Indicators/ フォルダ
使い方: MT5のナビゲーターから「インディケータ」を展開し、チャートにドラッグ&ドロップで適用

13_Repaint_Test_Indi.mq5 をダウンロード

パラメータの説明

パラメータ デフォルト 説明
EnableRepaint true true=詐欺モード(1本前にサイン)、false=正常モード

確認のコツ

  1. ストラテジーテスターのビジュアルモードで動作させる
  2. EnableRepaint = true のとき、足が確定した瞬間に1本前の足に矢印が出現するのを観察
  3. EnableRepaint = false に変更して比較すると、違いがよくわかります

関連記事・用語