【移植#26】バッドティック候補を異常ヒゲから探す — 中央値TRで要確認バーを絞る¶

この記事の3行まとめ
- 過去50本のTrue Range中央値を基準に、2倍以上の上ヒゲ・下ヒゲを要確認候補として表示します
- EURUSD・1時間足の直近1000本では上ヒゲ2件、下ヒゲ2件、最大2.55倍を検出しました
- 長いヒゲだけではバッドティックと断定できず、他社チャートや元ティックとの照合が必要です
今回の原典は「大量のバッドティックが混入した事故」¶
投稿日順で次に当たる2010年1月13日の記事では、当時のFXDDでシステム更新中に異常な価格が多数配信され、チャートへ長いヒゲが連続した事例が取り上げられていました。
原典によると、この事故に起因する損失は補填すると案内されたそうです。ただし、これは2010年当時の特定事例であり、現在の業者評価を扱うものではありません。
ここから得られる教訓は、チャートへ記録された価格も常に正しいとは限らないことです。異常値が高値や安値へ混入すると、インジケーター、損切り判定、バックテスト結果にも影響します。
一方、チャート上の長いヒゲには、本当に取引された価格、ニュース時の急変、流動性低下、週明けの窓なども含まれます。そこで今回のMQL5版は「バッドティック検出器」と断定せず、詳しく調べるバーを絞るための候補表示ツールにします。
異常ヒゲ候補の定義¶
まず、各バーの通常の値動きをTrue Rangeで測ります。
候補バー自身は基準へ含めず、その直前50本のTRを小さい順に並べ、中央値を求めます。
Baseline = median(previous 50 True Ranges)
Upper Wick = High - max(Open, Close)
Lower Wick = min(Open, Close) - Low
Upper Ratio = Upper Wick / Baseline
Lower Ratio = Lower Wick / Baseline
今回の初期値では、比率が2.0以上なら候補です。
| 状態 | 条件 | 表示 |
|---|---|---|
| 上ヒゲ候補 | Upper Ratio ≥ 2.0 | 高値の上に赤い下矢印 |
| 下ヒゲ候補 | Lower Ratio ≥ 2.0 | 安値の下に緑の上矢印 |
| 基準未満 | 両方とも2.0未満 | 表示なし |
実体ではなくヒゲを測るのは、異常な価格が一瞬だけ入り、その後バーの始値・終値付近へ戻った形を優先するためです。
平均ではなく中央値を使う理由¶
異常検知の基準を単純平均にすると、直前に大きなスパイクが1本入っただけで平均TRが押し上げられます。その後に続く異常値が見つかりにくくなる可能性があります。
中央値は、並べた50個の中央にある値です。極端に大きなTRが少数混ざっても、通常の値動きに近い基準を保ちやすくなります。
MQL5版では、各バーの直前50本を配列へ入れ、公式のArraySortで昇順に並べます。50本は偶数なので、中央にある25番目と26番目の平均を基準にしています。
ただし、相場環境そのものが急に変わった直後は、過去50本の中央値が新しいボラティリティへ追いつきません。候補が増えたら、データ事故だけでなく相場のレジーム変化も確認する必要があります。
MQL5実装で確認したポイント¶
候補バーを基準計算から外す¶
バーiを判定するときに使うのは、i-50からi-1までのTRです。バーi自身の大きな値幅を基準へ混ぜないため、異常度を自分で薄めません。
確定足だけを判定する¶
形成中バーの高値と安値はティックごとに更新されます。途中で2倍を超えても、終値が確定するまでヒゲの長さは決まりません。
そこで計算の終点をrates_total - 2とし、最新の形成中バーは矢印・比率ともにEMPTY_VALUEにしています。確定後の候補表示は変わりません。
比率も非表示バッファへ保存する¶
チャートに描くのはDRAW_ARROWの2本ですが、上ヒゲ比率と下ヒゲ比率も別バッファへ保存します。検証EAや後続の調査ツールから、矢印の根拠となった数値を読み出せます。
計算範囲を制限する¶
初期値では直近3000本だけを検査します。中央値を求めるために各バーで50個の値を並べ替えるので、対象本数を無制限に増やさない設計です。
売買処理を持たない¶
候補を見つけても、注文取消、ポジション決済、業者への問い合わせは自動実行しません。誤検出時に取引へ影響させないため、表示と数値化だけに限定しています。
専用MT5での動作確認¶
売買を行わない専用テストMT5で、本体と検証EAをコンパイルしました。検証側で直前50本のTR中央値、上下のヒゲ比率、しきい値判定、矢印位置を独立に再計算しています。
| 項目 | 設定・結果 |
|---|---|
| 通貨ペア・時間足 | EURUSD・1時間足 |
| 検査本数 | 直近1000本 |
| 基準 | 直前50本のTR中央値 |
| 候補しきい値 | 2.0倍 |
| 上ヒゲ候補 | 2件 |
| 下ヒゲ候補 | 2件 |
| 最大ヒゲ比率 | 2.55倍 |
| 比率の最大誤差 | 0.000000000000 |
| 矢印位置の最大誤差 | 0.0000ポイント |
| 形成中バー | 矢印・比率なし |
| 本体コンパイル | 0 errors / 0 warnings |
| 検証用コンパイル | 0 errors / 0 warnings |
| キャプチャ | 成功、エラー0 |
画像の赤い下矢印が上ヒゲ候補です。直近1000本全体では下ヒゲ候補も2件ありました。候補が少ないのは正常で、日常的なヒゲまで大量に警告しない設定にしています。
パラメータ¶
| パラメータ | 初期値 | 説明 |
|---|---|---|
InpBaselineBars | 50 | TR中央値を求める過去バー数 |
InpWickRatio | 2.0 | 候補にするヒゲと中央値の比率 |
InpBarsToScan | 3000 | 検査する直近バー数 |
InpArrowOffsetPips | 4.0 | 矢印を高値・安値から離す距離 |
候補を広く拾いたい場合は比率を下げ、極端なヒゲだけへ絞る場合は上げます。しきい値を下げるほど、ニュースや薄商いによる正しい価格も候補へ入りやすくなります。
ダウンロード¶
26_Wick_Anomaly_Candidates_v1_00.mq5 をダウンロード
MT5のIndicatorsへ保存してコンパイルし、調べたいチャートへ適用してください。
候補を見つけた後に確認すること¶
このインジケーターだけでは、その価格が誤配信だったかを証明できません。候補時刻が見つかったら、次の情報を同じタイムゾーンへそろえて確認します。
- 別業者や別データ提供元の同一銘柄チャート
- 保存済みのティック履歴とBid・Ask
- MT5のJournal、注文履歴、約定履歴
- 重要指標、要人発言、市場休場、ロールオーバー時刻
- 業者からの障害・価格訂正のお知らせ
複数の独立したデータに同じ価格があれば、実際の急変だった可能性が高まります。1社の1ティックだけに極端な値があり、後から訂正案内も出ていれば、データ異常を疑う根拠が強くなります。
ロジック評価の結論¶
原典の事例は、相場予測とは別に「入力データ自体が壊れるリスク」があることを示しています。バックテストやインジケーター計算が正確でも、元の価格が誤っていれば結果も影響を受けます。
今回の中央値TR方式は、一瞬だけ伸びた極端なヒゲを少数の候補へ絞れました。ただし、検出できるのはOHLCへ残った異常だけです。同じバーの途中で誤ったティックが入り、最終的な高値・安値へ影響しなかった場合は見つけられません。
これはバッドティックの断定器ではなく、データ品質調査の入口です。候補を自動削除したり、都合の悪いバーをバックテストから除外したりせず、元ティックと外部データを確認してから扱う必要があります。
前後の記事¶
前: 【移植#25】RSIの平均方法を選べるようにする — SMA・EMA・SMMA・LWMAと確定MTF
次: 【移植#27】OCO両建て注文の状態遷移を可視化する — 実注文なしでキャンセル順序を検証