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

この記事の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が測るのは次の差です。
特定銘柄だけが遅れていれば差が広がります。一方、接続断などですべての銘柄が同時に止まると、基準側も進まないため、この差だけでは検出できません。端末の接続状態やPCの壁時計を使う生存監視とは役割が別です。
MqlTick.time_mscとの精度差を隠さない¶
MqlTickには2種類の時刻があります。
| フィールド | 精度 | 内容 |
|---|---|---|
time | 秒 | 最終価格更新時刻 |
time_msc | ミリ秒 | 最終価格更新時刻のミリ秒表現 |
一方、TimeCurrent()は秒精度です。単純にミリ秒へ直しても、小数部分は分かりません。
配布版は、次を「鮮度差の下限」として表示します。
たとえば表示が>= 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 をダウンロード
使い方¶
- MQ5をMT5のデータフォルダー内にある
MQL5/Indicatorsへ置き、MetaEditorでコンパイルします。 - 複数銘柄が選択された通常のチャートへ適用します。
- 自動一覧を使う場合は
InpSymbolsを空欄にします。 - 対象を固定する場合は、端末で使われている正確な銘柄名をカンマ区切りで指定します。
STALEが出たら、取引時間、銘柄の配信条件、接続状態、最後の価格更新を確認します。
サフィックス付き口座では、EURUSDではなくEURUSD.aのような実際の銘柄名が必要です。配布版は部分一致で推測せず、指定どおりの銘柄だけを監査します。
使えないこと・注意点¶
TimeCurrent()は壁時計ではありません。全配信が止まった状態の経過秒は測れません。- 鮮度差だけで、価格が正しい、スプレッドが正常、約定可能とは判断できません。
- 取引休止中や低流動性の銘柄は、正常でも
STALEになり得ます。 - 秒精度とミリ秒精度の差により、表示値は実差より最大999ms小さい下限です。
FUTUREは即座に不正データと断定せず、サーバー時刻とデータ生成元を確認します。- 監視対象が未選択でも自動でMarket Watchへ追加しません。
- 売買、通知、ファイル出力、DLL、Web通信は行いません。
- この監査結果はEAの収益性や約定品質を保証しません。
まとめ¶
TimeCurrent()と銘柄別時刻は、同じ「現在時刻」ではありません。前者はMarket Watch全体側の最終受信時刻、後者は対象銘柄の最終価格更新時刻です。
両者を複数銘柄で横並びにすると、「端末全体は動いているのに、この銘柄だけ古い」という状態を読み取り専用で切り分けられます。ただし、全銘柄が止まる障害、取引時間の違い、秒とミリ秒の精度差は別に扱う必要があります。基準の意味と測れない範囲をそろえてこそ、鮮度差を安全な監査材料として使えます。
あわせて読みたい記事¶
前後の記事¶
前: 【移植#78】M1のTick VolumeをOHLC経路で見積もる
次: 【移植#80】通貨強弱は何本のペアで決まるか — xMeterの構成バイアスを可視化