EAのリペイントを見分けてFX自動売買のシグナルを検証する方法

EAを動かしたときにはあった買い矢印が、後からチャートを見ると消えている。そんなときは、EAが参照したインジケーターのリペイントを疑う場面です。過去チャートに残っている矢印だけを数えても、実際の売買判断と一致するとは限りません。
確かめる方法は、シグナルを読み取った瞬間の値を、対象の足の時刻と一緒に記録し、後から同じ足の値と照合することです。現在足の更新、確定足の書き換え、上位足の未確定、ZigZagの転換点の後日更新を分ければ、どの情報をいつ使ったのか整理できます。
この記事では、FX自動売買に使うEAのリペイント確認を、デモ環境で行う手順として説明します。売買成績の良し悪しより先に、当時利用できたシグナルが再現できるかを調べるための内容です。
- 未確定足の値動きと過去シグナルの書き換えを区別できる
- 上位足やZigZagで確認時刻がずれる理由を理解できる
- 同じ足の開始時刻を使って当時と後日の値を照合できる
- 取得失敗や条件変更を除き、本番前に確認すべき点を整理できる
EAのリペイントとFX自動売買の注意点

変わるのは何の値なのか
リペイントは、一度表示されたインジケーターの線やサインが、後から描き直される現象を指して使われる言葉です。ただし、形成中の足で値が動くことまで含める説明もあれば、過去足のサインの書き換えだけを指す説明もあります。まずは言葉の印象ではなく、どの足の何が変わったかを確認しましょう。
EA自体が矢印を描き直しているとは限りません。カスタムインジケーターが作る買い・売りの値をEAが読み、その値で注文を判断している場合、変化の出発点はインジケーター側です。チャートの描画、EAが読み取る値、EAが採用した売買条件は、別々に調べる必要があります。
MT4では、カスタムインジケーターの値を取得するiCustomに、対象銘柄、時間足、入力値、バッファ番号に対応するmode、読み取る位置のshiftを指定します。MetaQuotesのiCustomリファレンスは、入力値の順番と型をインジケーター側の定義に合わせることも説明しています。
バッファは、足ごとの計算値を入れる領域です。買いサインが入る領域と売りサインが入る領域が分かれていたり、矢印ではなく数値の大小で方向を表したりします。チャート上の矢印が図形オブジェクトとして作られ、同じ情報がバッファに用意されていない場合は、見た目と取得値を同じものとして扱えません。仕様書や提供元の説明で読み取り対象を確かめます。
チャートには買い矢印があるのにEAが反応しなかったとしても、すぐにリペイントとは決まりません。時間足、入力値、バッファ、判定タイミングの相違を先に除きます。指標の役割そのものを確認したい場合は、FXインジケーターの基本と組み合わせ方を押さえてから、今回の時点の検証に進むと整理しやすいです。
現在足と確定足を分ける

shiftは現在から数えた足の位置で、0が現在の足、1がその一つ前の足です。現在足の高値、安値、終値に相当する直近値は、足が形成される途中で変わります。その価格を使う指標の値や判定も変わり得ます。未確定の買い条件が一時成立してから不成立になることと、確定後の過去値が書き換わることは分けて記録します。
たとえば15分足で、足の途中に条件が成立したときに売買するEAと、次の足が始まってから前の足を一度読むEAでは、利用する情報が異なります。前者に後者の過去矢印を当てはめて「このサインで入るはずだった」と評価すると、判定時刻の違いをリペイントの問題と混同します。
確定足を読む方法は、現在足の途中の変化を避ける手段にはなります。ただし、shift=1に変えるだけで、過去のバッファ値が永久に固定される保証にはなりません。インジケーターが後続の足で過去を再評価するなら、一つ前の足の値も後から変わる可能性があります。足の価格の確定と、指標がその足へ書く値の確定は別の話です。
また、履歴データの追加取得や欠損の補充など、入力データが変わる再計算も区別します。MQL4のOnCalculateの説明では、深い履歴のダウンロードや履歴の空白が埋まると、prev_calculatedが0になることが示されています。再計算が起きた事実だけで、意図的にサインを消す製品だとは判断できません。
| 観察した変化 | 確認する対象 | 記録上の扱い |
|---|---|---|
| 現在足の値が動いた | 足の途中の価格と判定時刻 | 未確定足の変動 |
| 同じ過去足のサインが消えた | 当時と後日の同じバッファ | 過去シグナルの変化候補 |
| 設定を変えたら矢印が変わった | 入力値や時間足の差 | 条件変更による差 |
| 再読込後に広い範囲が変わった | 履歴・バージョン・再計算条件 | 再計算による差を調査 |
上位足が確定する時刻に注意

複数時間足を使う指標では、EAを動かす足だけ見ても確定状態は分かりません。5分足のEAが1時間足の現在値を参照している場合、5分足が閉じても1時間足はまだ形成途中です。下位足に残るサインが、上位足の価格更新で変わる設計かどうか確認します。
説明用の仮想例として、サーバー時間10時00分開始の1時間足を考えます。10時20分に5分足が閉じていても、10時00分の1時間足はまだ途中です。その値で買い条件が成立した記録と、11時台に確定した1時間足から再計算した結果を比べると、同じ時刻の5分足に見えても参照情報の状態が違います。
記録には、EA側の対象足の開始時刻に加え、参照する上位足の開始時刻、上位足が未確定だったか、どの位置の値を使ったかを残します。上位足を確定足だけに変更する場合は、使用できる情報が遅くなるため、変更前の売買ロジックと同一条件の検証ではなくなります。
後から下位足の日時を上位足へ対応付けるときは、その時刻を含む上位足を探します。ただし、その上位足の後日確定値を取得できたことと、当時その値を利用できたことは同じではありません。「どの上位足に属するか」と「その時点で確定していたか」を二段階で確かめる必要があります。
いくつ前の足なら固定されるかは、インジケーターの仕様によります。一律に2本待つ、3本待つという決め方では、参照時間足が変わった場合や後日再計算には対応できません。提供元に確認するなら、現在足を使うかという質問だけでなく、過去何本を再評価し、どの条件でシグナルを確定扱いにするかまで尋ねましょう。
ZigZagと先読みを混同しない

ZigZagは高値・安値の転換点を結んで値動きを整理する指標です。後から完成した波形は分かりやすい一方、当時の最新の山や谷が、その位置で利用できたとは限りません。後続の値動きで候補の位置が更新されることを前提に、転換点の足の時刻と、その点を認識できた時刻を分けます。
MetaQuotesが公開するMT4用ZigZagのCodeBaseとソースでは、再計算する転換点の深さを扱い、過去のバッファ位置の値を0に戻して別の位置へ値を書き込む処理を確認できます。この実装を根拠に、「最新のローソク足が閉じたから、直近の転換点も固定された」とは扱えません。別のZigZag派生版には、それぞれの仕様確認が必要です。
たとえば、10時00分の谷らしい位置が、その後10時30分のより低い谷へ置き換わったとします。これは説明用の仮想例です。後日の最終波形から10時30分の谷だけを拾い、10時30分の価格で必ず買えたことにすると、その谷を認識するまでに必要だった後続の値動きを省いてしまいます。
先読みは、検証上のある時点では利用できなかった後の情報を、その時点の判断に使ってしまうことです。ZigZagがリアルタイムに候補を更新すること自体と、後日の完成形を過去の売買判断へ流用することは分けます。シグナルを遅れて認識する設計なら、売買の判断時刻も遅れた時刻で記録しなければ整合しません。
リペイントする指標がすべて不適切という意味ではありません。過去の波の整理に使う用途と、今その場で発注する条件に使う用途では、必要な確認が違います。売買条件に使う場合は、点の発生時刻を保存し、更新や取り消しがあっても当時の判断記録を後から上書きしないことが検証の出発点です。
EAのリペイントを記録照合する手順

読み取り条件を先に固定する
最初は注文を出さない観察用の環境、またはデモ環境で確認します。リアル口座のEA設定をそのまま変更しながら調べると、取引への影響と検証条件の変更が重なります。対象のEAとインジケーター、銘柄、時間足、入力値、端末のバージョン、配信元を一つの検証条件としてそろえます。
次に、買い・売りを判定するバッファ、サインがないときの値、判定に使うshift、判定を行うタイミングを確認します。「矢印が出たら買い」だけでは足りません。矢印の価格が入るのか、方向を示す値が入るのか、表示だけで数値としては取得できないのかを、説明書と取得結果で照合します。
サインなしの値を0と決め付けないことも必要です。MT4にはSetIndexEmptyValueという表示上の空値を設定する関数があり、標準のEMPTY_VALUEと別の値を使う実装もできます。SetIndexEmptyValueの公式説明を踏まえ、対象指標の定義を確認します。空値と取得失敗を同じ「サインなし」にまとめると、消失したように見える原因を追えません。
MT5では、インジケーターハンドルからCopyBufferで値を取得する方式も使われます。CopyBufferの公式説明は、開始位置0が現在足であること、戻り値がコピーした要素数で、エラー時は-1になることを示しています。要求した本数を取得できたかを確認したうえで値を比較する必要があります。MT4の戻り値と同じ扱いにはしません。
ソースがない市販指標なら、仕様と観察で確認できる範囲を決めます。読み取る値が分からない状態で、任意のバッファを試して一度一致しただけでは検証条件が固まりません。入力値の変更や端末の再起動は別の試験として分け、同じ条件の観察途中に混ぜない方が原因を絞りやすくなります。
発生時の値を足の時刻と残す

記録の中心は、読み取った時刻と、値が属する足の開始時刻です。チャートに表示された場所だけでなく、EAが実際に採用した値を保存します。新しい足ができるたびに前の足を読むEAなら、その読み取り処理が行われた時刻と、読み取った前の足の時刻を別欄にします。
足の開始時刻は、MT4のiTimeで対象銘柄・時間足・shiftを指定して取得できます。iTimeの公式リファレンスでは、指定した足の開始時刻を返し、ローカル履歴が未取得なら0になることが説明されています。時刻が取れていない行は、後日の比較対象として有効な記録とは扱いません。
| 記録項目 | 保存する内容 | 照合での役割 |
|---|---|---|
| 観察時刻 | EAが値を読んだ時刻と時間基準 | 利用できた情報の時点 |
| 足の識別 | 銘柄・時間足・足の開始時刻 | 後日も同じ足を探す |
| 読取条件 | 入力値・バッファ・shift | 設定の違いを除く |
| 読取結果 | 生の値・成功/失敗・空値 | 表示とデータを分ける |
| 判定結果 | 買い・売り・なし・判定保留 | 売買条件への影響 |
| 参照情報 | 上位足の時刻・確定状態 | 複数時間足のずれを確認 |
サインが出た行だけ残すのではなく、判定対象の足でサインがなかったことも保存します。後から過去足に矢印が追加されるタイプは、発生時の買い記録だけでは見つけにくいためです。たとえば買い・売り両方の空値が確認できた時点を「なし」として残せば、後日の追加を照合できます。
足の途中で判定するEAでは、足が閉じたときの一枚の画像だけでは足りません。EAが判断した読み取り時点を記録する必要があります。数秒おきの目視や録画も補助にはなりますが、その間に出て消えた変化を網羅したとは言えません。観察した間隔と、実際のEAの判定機会の違いを明記します。
記録はCSVやログなど、後から当初の値を追える形式にします。比較の際に初回値を新しい値で置き換えると、消えたサインの証拠もなくなります。初回記録と再読取記録を分け、同じ足のキーで結び付ける方法が扱いやすいです。画面画像は銘柄・時間足・時刻・設定を確かめる補助として添えます。
後日も同じ足を探して比較する

新しい足が増えると、同じshiftが指す足は変わります。最初にshift=1で読んだ足を、翌日もshift=1で読むと、別の足を比べることになります。最初に保存した足の開始時刻から現在の位置を探し直し、その位置のバッファ値を再取得するのが基本です。
MT4のiBarShiftは、指定した時刻を含む足の位置を探す関数です。iBarShiftの公式リファレンスでは、該当する足がないとき、exactの指定によって近い足の位置または-1を返すことが説明されています。同じ足を照合する検証では近い足で代用せず、exact=trueで探した後、iTimeの開始時刻も保存値と一致するか確認します。
比較する時点も事前に決めます。たとえば、次の足が始まった後、数本進んだ後、参照する上位足が閉じた後、端末を再起動した後を別々に確認します。この順番は検証の設計例であり、特定の本数が経過すれば全指標が固定されるという意味ではありません。再起動試験は、継続稼働中の記録を取ってから行います。
数値の比較では、値が変わったことと売買条件が変わったことを分けます。線の値が小さく変わっても閾値を跨がなければ、EAの買い・売り判定は同じ場合があります。反対に、微小な差が閾値を跨ぐなら発注条件が変わります。生の値の差と、同じ判定式で得た方向の差を併記します。
丸めて表示した値だけで比較すると差を見落とすため、検証には必要な精度の生値を使います。許容差を設ける場合は、指標が価格を返すのか比率を返すのかなどの単位を確認して先に定めます。都合の悪い変化が出た後に許容差を広げると、結果の評価基準まで変わってしまいます。
比較先の履歴が不足している、対象時刻の足が見つからない、データ取得に失敗した場合は「比較不能」にします。これらをサイン消失へ含めないことが大切です。原因を解消してから同条件で再取得し、それでも初回と値が違う場合に、過去シグナルの変化として調べます。
消失と追加を仮想例で整理する

以下は手順を理解するための仮想例です。実測値や売買成績ではありません。銘柄、時間足、入力値、バッファを固定し、いずれも取得に成功した同じ足の値を比べたとします。「買い」「なし」は、その指標の空値と判定仕様に従って分類した結果です。
| 対象足の開始時刻 | 最初に読んだ結果 | 後日の同じ足 | 分類 |
|---|---|---|---|
| 10時00分 | 買い | なし | サイン消失 |
| 10時15分 | なし | 買い | 後日の追加 |
| 10時30分 | 買い | 売り | 方向の変更 |
| 10時45分 | 買い | 買い | 判定は維持 |
| 11時00分 | 買い | 取得失敗 | 比較不能 |
10時00分の買いが後日なくなっても、当時その値を使って出した注文までなかったことにはできません。10時15分へ後から買いが追加されても、当時はサインなしだったなら、その時点の売買として計上しません。この二つを徹底すると、完成したチャートに残るサインだけで評価する誤りを避けられます。
「移動」は一行の変化だけでは判定できません。同じ観察区間で、ある足のサインが消え、別の足へ同方向のサインが追加されたかを確認します。ただし、それだけで同一サインが移動したと確定できるとは限りません。転換点の識別子など対応を示す情報がなければ、消失と追加を別々に記録し、移動の可能性として扱います。
集計する場合は、比較できた足の数、比較不能の数、消失・追加・方向変更の数を分けます。サイン発生足だけを分母にした数字と、サインなしを含む全観察足を分母にした数字は意味が違います。足の変化件数なのか、同じ足で複数回起きた変化の回数なのかも区別し、観察条件とともに示します。
変化が見つからなかった場合も、「この銘柄・時間足・設定・観察期間・再読取の間隔では差を検出しなかった」という範囲の結果です。別の相場、設定変更、長い履歴の再計算まで含めてノーリペイントを証明したとは言えません。広告上の表現より、再現できる記録がそろっているかを重視しましょう。
EAのリペイント確認後の判断
変化を見つけたら、まず仕様で説明できるかを確認します。未確定足だけの変動なら、EAがその途中の値を使う設計なのかを確認します。上位足の未確定が原因なら、参照する上位足の状態を判定条件に含めるか検討します。過去足の書き換えなら、どの条件と時刻で確定扱いになるのか、提供元の仕様と観察を突き合わせます。
過去の転換点を遅れて確認する方式に変える場合は、確認できた時刻から注文するロジックとして、検証し直す必要があります。サインの描画場所の時刻に戻して入る方式にはしません。「何本か待てば良さそう」という見た目の調整だけで終わらせず、その待機条件を満たした時点の値を保存して再評価します。
バックテストでは、EAが判定時に読んだ値を記録し、後の再計算結果と比較します。終了後の完成チャートを眺めるだけでは、当時の状態は確認できません。MT4公式のストラテジーテスター説明ではテストにモデル化したデータを使うことが示されており、観察できる変化はテスト条件にも依存します。
実際に配信される価格での挙動も調べるなら、EAのフォワードテストで本番前に確認する項目に沿って、デモ環境の観察へ進みます。今回はシグナルの時点の整合を確かめる工程です。値が変わらないことだけで、収益性や注文の正常動作まで確認したことにはなりません。
- 同じ銘柄・時間足・入力値・バッファで比較できている
- 最初に読んだ時刻と対象足の開始時刻を分けている
- サインなし・取得失敗・比較不能を区別している
- 後から追加されたシグナルを当時の注文条件へ戻していない
- 確定扱いの条件を変えた場合は変更後のロジックで再検証する
EAのリペイント確認は、きれいな過去チャートを見つける作業ではなく、当時使えた情報を説明できるか確かめる作業です。まず一つの条件に絞り、サインが出た時点の値と足の時刻を記録してください。その記録と後日の同じ足を比較できれば、発生した差を仕様、再計算、読み取り条件のどこから調べるべきか判断しやすくなります。
