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

図:検証インジケータの動作確認
この記事の3行まとめ
- 🎨 リペイントには「正常な更新」と「悪質な書き換え」がある
- 😈 悪質なツールは現在足のサインを1本前(過去)にずらして表示する
- 🛡️ 対策:ストラテジーテスターのビジュアルモードで見抜く!
はじめに¶
この記事は、「とあるMetaTraderの備忘秘録」様のブログ記事を検証・紹介するシリーズの第13弾です。
FX初心者が最も騙されやすいのが「リペイント(Repaint)」するインジケータです。 チャートを見ると天井と大底でドンピシャのサインが出ているのに、実際に使ってみると全く勝てない……。そのカラクリを暴きます。
元ネタ
リペイントの定義
https://fai-fx.hatenadiary.org/entry/20100730/1280424681
(2010年7月30日 公開)
良いリペイント vs 悪いリペイント¶
✅ 正常な動作(良いリペイント)¶
「現在足(最新の足) のサインが点いたり消えたりする」のは、リペイントではありません(というか仕様です)。 終値が確定するまではRSIもMAも変動するため、サインも変動するのは当然です。
❌ 詐欺的な動作(悪いリペイント)¶
問題なのは「確定したはずの過去の足 のサインが変化する」ことです。 これを通称「リペイント」と呼びます。特に悪質なのがバックシフト(Back Shift)です。
詐欺の手口:バックシフト¶
これが典型的な詐欺インジケータのロジックです。
- 現在足(足0)でゴールデンクロスが発生した。
- このまま表示すると、少し遅れた位置にサインが出る。
- 「そうだ、1本前(足1)にサインを出そう!」
- プログラムで
Buffer[1] = Arrowと書き込む。
見え方の違い¶
- リアルタイム: 現在足でクロスした瞬間、突然「1本前の足」に矢印が出現する。
- 後で見るチャート: まるで底値で予知したかのように、クロス発生前のローソク足に矢印が残る。
MQL5での検証コード¶
この「未来予知(カンニング)」を行うインジケータを作成しました。
ファイル名: 13_Repaint_Test_Indi.mq5
保存先: MQL5\Indicators
使い方: パラメータ EnableRepaint を true にしてチャートに入れます。
//+------------------------------------------------------------------+
//| 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);
}
確認方法¶
- ストラテジーテスターを起動します。
- 「ビジュアルモード(可視化)」をオンにします。
- このインジケータを動かします。
- 矢印が出る瞬間をよく観察してください。足が確定した瞬間に、ひとつ前の足にポッと矢印が出るはずです。
これが「バックテスト(ビジュアルなし)や過去チャートだけで判断してはいけない」理由です。
まとめ¶
| ポイント | 内容 |
|---|---|
| 現在足の点滅 | 正常な動作。確定まで待つのが基本。 |
| 過去足の出現 | 詐欺。バックシフト型リペイント。 |
| 見抜き方 | バックテストのビジュアルモードで、サインが出る瞬間を目視確認する。 |
「勝率90%の神ツール」なんてものがもしあったら、まずはストラテジーテスターで動かしてみてください。 魔法の正体は、単なる「後出しジャンケン」かもしれません。
ソースコードのダウンロード¶
この記事で紹介したリペイント検証用インジケータをダウンロードできます。
ファイルの種類:インジケータ
保存先: MQL5/Indicators/ フォルダ
使い方: MT5のナビゲーターから「インディケータ」を展開し、チャートにドラッグ&ドロップで適用
13_Repaint_Test_Indi.mq5 をダウンロード
パラメータの説明¶
| パラメータ | デフォルト | 説明 |
|---|---|---|
| EnableRepaint | true | true=詐欺モード(1本前にサイン)、false=正常モード |
確認のコツ¶
- ストラテジーテスターのビジュアルモードで動作させる
EnableRepaint = trueのとき、足が確定した瞬間に1本前の足に矢印が出現するのを観察EnableRepaint = falseに変更して比較すると、違いがよくわかります
関連記事・用語¶
- #06 バックテスト詐欺の手口 — 別の詐欺手法(4本値の隙間)
- 用語集 - リペイント