コンテンツにスキップ

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

EURUSD 1時間足で異常に長いヒゲの候補を赤と緑の矢印で示したMT5画面

この記事の3行まとめ

  • 過去50本のTrue Range中央値を基準に、2倍以上の上ヒゲ・下ヒゲを要確認候補として表示します
  • EURUSD・1時間足の直近1000本では上ヒゲ2件、下ヒゲ2件、最大2.55倍を検出しました
  • 長いヒゲだけではバッドティックと断定できず、他社チャートや元ティックとの照合が必要です

今回の原典は「大量のバッドティックが混入した事故」

投稿日順で次に当たる2010年1月13日の記事では、当時のFXDDでシステム更新中に異常な価格が多数配信され、チャートへ長いヒゲが連続した事例が取り上げられていました。

元記事「FXDDでバッドティック発生…」を読む

原典によると、この事故に起因する損失は補填すると案内されたそうです。ただし、これは2010年当時の特定事例であり、現在の業者評価を扱うものではありません。

ここから得られる教訓は、チャートへ記録された価格も常に正しいとは限らないことです。異常値が高値や安値へ混入すると、インジケーター、損切り判定、バックテスト結果にも影響します。

一方、チャート上の長いヒゲには、本当に取引された価格、ニュース時の急変、流動性低下、週明けの窓なども含まれます。そこで今回のMQL5版は「バッドティック検出器」と断定せず、詳しく調べるバーを絞るための候補表示ツールにします。


異常ヒゲ候補の定義

まず、各バーの通常の値動きをTrue Rangeで測ります。

Text Only
TR = max(
  High - Low,
  abs(High - Previous Close),
  abs(Low - Previous Close)
)

候補バー自身は基準へ含めず、その直前50本のTRを小さい順に並べ、中央値を求めます。

Text Only
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へ保存してコンパイルし、調べたいチャートへ適用してください。


候補を見つけた後に確認すること

このインジケーターだけでは、その価格が誤配信だったかを証明できません。候補時刻が見つかったら、次の情報を同じタイムゾーンへそろえて確認します。

  1. 別業者や別データ提供元の同一銘柄チャート
  2. 保存済みのティック履歴とBid・Ask
  3. MT5のJournal、注文履歴、約定履歴
  4. 重要指標、要人発言、市場休場、ロールオーバー時刻
  5. 業者からの障害・価格訂正のお知らせ

複数の独立したデータに同じ価格があれば、実際の急変だった可能性が高まります。1社の1ティックだけに極端な値があり、後から訂正案内も出ていれば、データ異常を疑う根拠が強くなります。


ロジック評価の結論

原典の事例は、相場予測とは別に「入力データ自体が壊れるリスク」があることを示しています。バックテストやインジケーター計算が正確でも、元の価格が誤っていれば結果も影響を受けます。

今回の中央値TR方式は、一瞬だけ伸びた極端なヒゲを少数の候補へ絞れました。ただし、検出できるのはOHLCへ残った異常だけです。同じバーの途中で誤ったティックが入り、最終的な高値・安値へ影響しなかった場合は見つけられません。

これはバッドティックの断定器ではなく、データ品質調査の入口です。候補を自動削除したり、都合の悪いバーをバックテストから除外したりせず、元ティックと外部データを確認してから扱う必要があります。


前後の記事

前: 【移植#25】RSIの平均方法を選べるようにする — SMA・EMA・SMMA・LWMAと確定MTF

次: 【移植#27】OCO両建て注文の状態遷移を可視化する — 実注文なしでキャンセル順序を検証

— SPONSORED —