確定足だけで判断するEAはなぜリペイントしないのか
結論から書くと、確定足だけで判断するEAのシグナルが変わりにくいのは、判断材料がその時点で動かなくなっているからです。形成中のバーは、終値も高値も安値も次のティックで変わる可能性があります。一方、閉じたバーの四本値は、通常は確定後に動きません。
ただし、確定足を読んでいれば安全とは言い切れません。インジケーターの計算や上位足の扱い次第で、確定足を使っているつもりでも未来の値が混ざることがあります。
なぜ形成中バーは危険なのか
MQL5では、シフト0が形成中のバー、シフト1が直近の確定足です。シフト0の終値は「いまの価格」にすぎません。これを判断に使うと、次の問題が起きます。
- ティックごとに条件が成立したり消えたりし、一度エントリーした根拠があとから消える
- 閉じたあとのチャートには残らない一瞬のシグナルで約定する
- テスターではティックの生成方法によって結果が変わりやすく、バー内の値動きが実際と異なるとその差が成績に直結する
| 項目 | 形成中バー(シフト0) | 確定足(シフト1以降) |
|---|---|---|
| 判断材料の値 | 確定まで変化する | 通常は変化しない |
| シグナルの再現性 | 低い | 高い |
| エントリーの速さ | 速い | 確定を待つ分だけ遅い |
| テスターのティック方式の影響 | 判断自体が変わりうる | 判断への影響は小さい(決済には残る) |
形成中バーの利用が常に誤りというわけではありません。ブレイクアウトを即座に捉える設計もあります。その場合は「バー内の動きに依存している」と認めたうえで、実ティックでの検証を重視する必要があります。
おすすめブローカー比較 →
🎁 無料EAをダウンロード📧 無料メール講座(全8通)+登録者限定 MT5 インジケーター13本パック
登録するとすぐに、サイトの MT5 インジケーター13本をコンパイル済みファイル(.ex5)・ソースコード・使い方ガイドにまとめた登録者限定パックのダウンロードリンクが届きます。続けて、FX自動売買の本質、バックテストの正しい見方、ブローカー選びのコツなどを全8通(最初の5日間は毎日1通、その後は登録7・14・30日後)でお届けします。MQL5 Market 版(ローンチ価格・販売数に応じて段階的に値上げ)の値上げ前のお知らせも届きます。当サイトのEAは提携ブローカーのリアル口座があれば無料です。
※ プライバシーは厳守。配信解除はいつでも可能です。
シグナル確定の設計
CopyRatesは開始位置と並び順を明示する
新しいバーの最初のティックで一度だけ、確定足を読みます。
datetime g_lastBar = 0;
void OnTick()
{
datetime t = iTime(_Symbol, _Period, 0);
if(t == 0 || t == g_lastBar) return;
MqlRates r[];
ArraySetAsSeries(r, true);
if(CopyRates(_Symbol, _Period, 1, 2, r) != 2) return;
g_lastBar = t;
// r[0]が直近の確定足、r[1]がその一つ前
}
要点は3つです。開始位置を1にして形成中バーを取得範囲から外すこと、ArraySetAsSeries で並び順を決めること、取得に失敗したら g_lastBar を更新せず次のティックで再試行することです。並び順の指定を忘れると、配列の先頭は最も古いバーになります。
iBarShiftは上位足で落とし穴になる
上位足を参照する場合、iBarShift が返すのは「その時刻を含むバー」です。現在時刻を渡せば、通常は形成中の上位足が返ります。
int s = iBarShift(_Symbol, PERIOD_H1, TimeCurrent(), false);
if(s < 0) return;
double closedH1 = iClose(_Symbol, PERIOD_H1, s + 1);
確定した上位足が欲しいなら、このように1つ古いバーを指定します。
典型的なリペイントは、下位足チャートに上位足の値を描くインジケーターで起きます。過去の下位足それぞれに、同じ時刻を含む上位足の終値を割り当てると、その時点ではまだ存在しなかった最終値が過去に描かれます。チャート上では的中して見えても、リアルタイムでは同じ判断ができません。
第4引数の exact を false にすると、該当バーがないときに近いバーが返ります。データ欠損に気づきにくくなるため、取得したバーの時刻も確認すると安全です。別銘柄や別時間足のデータは更新が遅れることもあるので、期待した時刻のバーかどうかを照合してから判断します。
再起動時の二重判定を防ぐ
上のコードの g_lastBar は、EAの再起動で初期値に戻ります。同じ確定足で再度判定されて二重にエントリーしないよう、保有ポジションや直近の約定時刻も確認する設計が必要です。
利用者ができる確認手順
ソースコードが読めなくても、次の方法である程度は確かめられます。
- ビジュアルモードで見る: テスターのビジュアルモードで、エントリーの時刻がバーの始まり付近に揃うかを確認する。バーの途中で頻繁に約定するなら、形成中バーを使っている可能性がある(決済は別)。
- モデリングを変えて比較する: 同じ期間・同じ設定で、始値のみ、全ティック、実ティックに基づく全ティックを試す。エントリーの回数や時刻が大きくずれるなら、バー内の動きへの依存を疑う。
- インジケーターの矢印を記録する: 矢印が出た時刻をスクリーンショットなどで残し、数本後のバーと見比べる。位置が変わったり消えたりするならリペイントしている。
- 配布元に確認する: 確定足で判断しているか、上位足をどう扱っているかを問い合わせる。
どれも状況証拠であり、これだけで「リペイントなし」と証明はできません。インジケーターを試すなら、無料インジケーターで手順を練習し、EAの導入はEA設定方法を参考にしてください。
限界と注意
確定足での判断には、都合の悪い面もあります。
- エントリーが遅れる: 確定を待つ間に価格が進み、不利な位置で入ることがあります。急騰急落の局面では、その差が大きくなりえます。
- バーの始まりのコスト: 新しいバーの最初のティックに注文が集まる設計では、スプレッドが広い時間帯や窓開けの影響を受けることがあります。
- 未来を参照するインジケーターは防げない: ZigZagのように後から形が変わるものや、確定に後続のバーが必要なものは、読む位置によっては確定足でも値が変わります。
- 確定足も業者ごとに違う: サーバー時刻や配信レートが違えば四本値も変わるので、同じEAでも業者が変われば判断が変わることがあります。ヒストリーがあとから修正される可能性も否定できません。
- 決済はバー内で起きる: エントリーの判断が確定足でも、ストップロスや利確はバーの途中で約定します。この部分は引き続きティックの質に左右されます。
そして最も重要なのは、リペイントしないことと儲かることは別だという点です。私たちのEAにも、過去データでの検証は良好でありながら、デモ口座でのフォワードテストではマイナスになっているものがあります。確定足かどうかは検証結果を信頼するための前提の一つで、将来の成績を示すものではありません。また、確定足を使うかどうかはEAの設計ごとに異なるので、EAを選ぶ際は個別に確認し、実測ランキングの数字とあわせて判断してください。関連する検証の考え方はEA・MT5ノウハウにまとめています。
まとめ
- 形成中バーの値は確定まで動くため、シグナルが消えたり変わったりする
- 確定足で判断すれば判断材料は固定され、ティック生成方式の影響も受けにくくなる
CopyRatesは開始位置と並び順を明示し、取得失敗時は再試行するiBarShiftは形成中の上位足を返しやすいので、確定足を読むならシフトをずらす- 上位足の描画と、未来を参照するインジケーターはリペイントの典型例
- 確定足には遅れとコストの問題があり、利益を約束するものではない
関連記事
📧 無料メール講座(全8通)+登録者限定 MT5 インジケーター13本パック
登録するとすぐに、サイトの MT5 インジケーター13本をコンパイル済みファイル(.ex5)・ソースコード・使い方ガイドにまとめた登録者限定パックのダウンロードリンクが届きます。続けて、FX自動売買の本質、バックテストの正しい見方、ブローカー選びのコツなどを全8通(最初の5日間は毎日1通、その後は登録7・14・30日後)でお届けします。MQL5 Market 版(ローンチ価格・販売数に応じて段階的に値上げ)の値上げ前のお知らせも届きます。当サイトのEAは提携ブローカーのリアル口座があれば無料です。
※ プライバシーは厳守。配信解除はいつでも可能です。