コンテンツにスキップ

【移植#79】TimeCurrentはどの銘柄の時刻か — Market Watchのクォート鮮度を横断監査

EURUSD H1上で時刻差を与えた3つの検証用銘柄と無Tick銘柄を並べ、FRESH・LAG・STALE・UNAVAILABLEを独立照合したMT5画面

この記事の3行まとめ

  • TimeCurrent()は、Market Watchで選択されているいずれかの銘柄について最後に受信したクォートのサーバー時刻です
  • 各銘柄のMqlTick.time_mscとの差を並べると、全体の基準時刻に対して更新が遅い銘柄を切り分けられます
  • 専用MT5ではFRESH・LAG・STALE・UNAVAILABLEを各1件作り、独立再計算、不一致0、注文・ポジション不変を確認しました

原典は「TimeCurrentと銘柄別時刻の違い」

今回採用したのは、2010年4月7日の「TimeCurrent() と、MarketInfo(Symbol(),MODE_TIME) の違い。」です。

元記事を読む

原典は、TimeCurrent()とUSDJPY・AUDUSDそれぞれの最終更新時刻を同じ画面へ出し、役割の違いを観察していました。

  • TimeCurrent()はMarket Watch全体側の基準になる時刻
  • MarketInfo(symbol, MODE_TIME)は指定した銘柄の最終更新時刻
  • 両者が大きく離れたら、配信や接続の異常を疑う材料になり得る

MT5では、銘柄ごとの最新価格と時刻をSymbolInfoTick()でまとめて取得できます。そこで#79は、複数銘柄の時刻差を1枚で確認する読み取り専用インジケーターへ再設計しました。

4月6日の50銭区切りは【移植#22】と役割が重なるため番号を使っていません。4月7日の時刻差は、現在の複数銘柄監視にも独立した用途があると判断しました。

TimeCurrentはPCの現在時刻ではない

MQL5公式資料では、OnTimer()などOnTick()以外から呼ぶTimeCurrent()は、Market Watchで選択されているいずれかの銘柄について、最後にクォートを受信したサーバー時刻を返します。

PCの時計でも、呼び出すたびに必ず進む時計でもありません。全銘柄の配信が止まれば、TimeCurrent()も止まります。

この性質から、#79が測るのは次の差です。

Text Only
Market Watch全体の最終受信時刻
    − 対象銘柄の最終価格更新時刻

特定銘柄だけが遅れていれば差が広がります。一方、接続断などですべての銘柄が同時に止まると、基準側も進まないため、この差だけでは検出できません。端末の接続状態やPCの壁時計を使う生存監視とは役割が別です。

MqlTick.time_mscとの精度差を隠さない

MqlTickには2種類の時刻があります。

フィールド 精度 内容
time 秒 最終価格更新時刻
time_msc ミリ秒 最終価格更新時刻のミリ秒表現

一方、TimeCurrent()は秒精度です。単純にミリ秒へ直しても、小数部分は分かりません。

配布版は、次を「鮮度差の下限」として表示します。

Text Only
lag_lower_ms = max(0, TimeCurrent() × 1000 − tick.time_msc)

たとえば表示が>= 26.000sなら、少なくとも26秒古いという意味です。実際の差は最大999ms大きい可能性があります。しきい値の境界付近を、厳密なミリ秒判定とはみなしません。

対象Tickの秒がTimeCurrent()より未来なら、差を0へ丸めずFUTUREとして分けます。サーバー時刻、合成データ、外部入力の単位や時刻系を確認するためです。

5つの状態へ分類する

初期設定では、各銘柄を次の状態へ分けます。

状態 初期条件 意味
FRESH 下限差が5秒以下 基準時刻に近い
LAG 5秒超〜30秒以下 更新が遅れている
STALE 30秒超 大きな鮮度差がある
UNAVAILABLE 未選択、取得失敗、Tickなし 比較できない
FUTURE 銘柄時刻が基準秒より未来 時刻系の確認が必要

しきい値は市場や銘柄の性質に合わせて変更します。週末、取引休止中の銘柄、流動性の低い銘柄、遅延配信銘柄を、平日昼間の主要FXと同じ基準で異常扱いしないでください。

Market Watchを監査中に書き換えない

配布版はSymbolsTotal(true)とSymbolName()で、選択済みの銘柄を読み取ります。SymbolSelect()は呼びません。

監査ツール自身が銘柄を追加すると、TimeCurrent()の参照母集団まで変わってしまうためです。明示した銘柄が選択されていなければ、自動追加せずUNAVAILABLEにします。

InpSymbolsを空欄にした場合、画面へ並べるのはMarket Watchで可視になっている銘柄です。ただし、端末はクロスレート計算などのために、画面には見えない銘柄を内部で選択する場合があります。パネルのMARKET WATCH SELECTEDはその暗黙選択も含み、表示行とは件数が一致しないことがあります。

移植#71との違い

【移植#71】もTimeCurrent()とMqlTick.time_mscに触れましたが、測っている対象は別です。

回 主な問い 比較対象
#71 TickがなくてもTimer処理は進むか 壁時計の経過、Timer回数、1銘柄の時刻変化
#79 Market Watch内でどの銘柄が遅いか TimeCurrent()と複数銘柄の最終Tick時刻

79はTimer周期やイベント取りこぼしを評価しません。Timerは定期的に読み直す入口としてだけ使い、結果は銘柄間の鮮度差へ限定しています。

専用MT5で4状態を独立照合

配布版と独立検証EAを、専用MetaTrader 5 Build 6182でコンパイルしました。どちらも0エラー・0警告です。

検証では、標準銘柄の履歴を変更せず、専用端末内に4つの一時的なカスタム銘柄を作りました。

  • 基準より約2秒古いTick
  • 基準より約25秒古いTick
  • 基準より約180秒古いTick
  • Tickを1件も持たない銘柄

検証用しきい値は10秒/60秒です。判定時には次の結果になりました。

検査項目 結果
Market Watch選択銘柄 26
Tick取得可能 21
監視対象 / 取得可能 4 / 3
FRESH / LAG / STALE 1 / 1 / 1
UNAVAILABLE / FUTURE 1 / 0
最大の鮮度差下限 181秒
同じ基準秒を持つ選択Tick 4
独立再計算との不一致 0
パネルオブジェクト 14 / 14
注文数・ポジション数 開始前後で変化なし

掲載画像は合否判定の直後に撮影した次のスナップショットです。時刻が進んだため、3本の差は3秒、26秒、181秒になり、同じ基準秒のTickは6件へ増えています。分類はFRESH・LAG・STALEのままです。

独立検証EAは、配布版の集計値をそのまま合格根拠にしていません。バッファが返したTimeCurrent()を基準に3本のtime_mscを別計算し、Tickなしの1本を含む5状態の件数、しきい値、表示オブジェクト、各銘柄名を照合しました。

主なパラメーター

パラメーター 初期値 役割
InpSymbols 空欄 カンマ区切りの監視対象。空欄は可視Market Watch
InpMaxRows 8 表示する最大銘柄数(1〜12)
InpFreshSeconds 5 FRESHの上限秒
InpStaleSeconds 30 これを超えたらSTALE
InpRefreshMilliseconds 500 再読間隔
InpShowPanel true 監査パネルの表示

79_Symbol_Quote_Freshness_Auditor_v1_00.mq5 をダウンロード

使い方

  1. MQ5をMT5のデータフォルダー内にあるMQL5/Indicatorsへ置き、MetaEditorでコンパイルします。
  2. 複数銘柄が選択された通常のチャートへ適用します。
  3. 自動一覧を使う場合はInpSymbolsを空欄にします。
  4. 対象を固定する場合は、端末で使われている正確な銘柄名をカンマ区切りで指定します。
  5. STALEが出たら、取引時間、銘柄の配信条件、接続状態、最後の価格更新を確認します。

サフィックス付き口座では、EURUSDではなくEURUSD.aのような実際の銘柄名が必要です。配布版は部分一致で推測せず、指定どおりの銘柄だけを監査します。

使えないこと・注意点

  • TimeCurrent()は壁時計ではありません。全配信が止まった状態の経過秒は測れません。
  • 鮮度差だけで、価格が正しい、スプレッドが正常、約定可能とは判断できません。
  • 取引休止中や低流動性の銘柄は、正常でもSTALEになり得ます。
  • 秒精度とミリ秒精度の差により、表示値は実差より最大999ms小さい下限です。
  • FUTUREは即座に不正データと断定せず、サーバー時刻とデータ生成元を確認します。
  • 監視対象が未選択でも自動でMarket Watchへ追加しません。
  • 売買、通知、ファイル出力、DLL、Web通信は行いません。
  • この監査結果はEAの収益性や約定品質を保証しません。

まとめ

TimeCurrent()と銘柄別時刻は、同じ「現在時刻」ではありません。前者はMarket Watch全体側の最終受信時刻、後者は対象銘柄の最終価格更新時刻です。

両者を複数銘柄で横並びにすると、「端末全体は動いているのに、この銘柄だけ古い」という状態を読み取り専用で切り分けられます。ただし、全銘柄が止まる障害、取引時間の違い、秒とミリ秒の精度差は別に扱う必要があります。基準の意味と測れない範囲をそろえてこそ、鮮度差を安全な監査材料として使えます。

あわせて読みたい記事


前後の記事

前: 【移植#78】M1のTick VolumeをOHLC経路で見積もる

次: 【移植#80】通貨強弱は何本のペアで決まるか — xMeterの構成バイアスを可視化

— SPONSORED —