MetaTrader 5 / スクリプト

TimeServerDaylightSavings - MetaTrader 5のためのスクリプト

170
(7)

このスクリプトは、TimeServerDaylightSavings() 関数を紹介します。この関数は、ローカルコンピュータ用のTimeDaylightSavings() のみを 提供する組み込み関数に欠けています。さらに、添付のヘッダー mqh ファイルには、サーバーに関連するその他の便利な関数がいくつか含まれており、特に、ブローカーが一般的にサマータイムを使用しているかどうかを知ることができます。

これらはすべて、ブローカーからの相場履歴の経験的分析に基づいている。簡単に言うと、この方法は、週の営業時間の統計を分析し、ブローカーのGMTオフセットを推測します。オフセットの統計における2つの異なる最大値は、それらが隣接する時間に対応する場合、標準時間(「冬」)と夏時間(「夏」)に対応する可能性が高い。

実はこのスクリプトは、この本で紹介されているスクリプトを改良・拡張したものである。具体的には、2024年10月以降のバージョンには重要なバグフィックスが含まれています:週次取引の開始時間は米国市場によって検出され、米国市場自体が米国のタイムゾーン(EST、UTC-5、標準冬時間<--> EDT、UTC-4、夏時間)に従って夏時間に切り替わる影響を受けます。すべての功績はamraliに ある。

夏時間の変更に伴う週のオープニング時間の変更例


北半球では「春」(3月または4月)に1時間追加され、「秋」(10月または11月)に1時間減算されるのに対し、南半球ではその逆である(季節がすべて入れ替わっているため)。

分析の特異性のため、最も流動性の高いFXティッカー(通常はEURUSD)のコードを実行することをお勧めします。

以下はAPIである:

// サーバーのタイムゾーンとサマータイムの現在の情報 struct ServerTimeZone  // 週間営業時間の履歴分析 {    int offsetGMT;      // 現在の週のUTC/GMTに対するタイムゾーンのオフセット(秒単位    int offsetDST;      // DST補正(秒単位)(MQL5に従ってoffsetGMTに含まれる    bool supportDST;    // DSTの変更は引用符で検出される。 }; // H1の引用履歴から、サーバーのタイムゾーンと夏時間モードを推定する。 ServerTimeZone TimeServerZone(   const datetime srvtime = 0,     // デフォルトでは現在時刻だが、過去の時刻を指定することもできる。   const int threshold = THRESHOLD,   const double lookupYears = 0.0, // デフォルトでは、利用可能なすべてのバーが表示される。   const string symbol = NULL)     // デフォルトでは、現在のチャートのシンボル // サーバーの推定時刻 DST モードによる補正 (秒単位) int TimeServerDaylightSavings(const datetime srvtime = 0,   const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // サーバのタイムゾーンのオフセットを見積もる (秒単位) int TimeServerGMTOffsetHistory(const datetime srvtime = 0,   const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // サーバがサマータイムに対応しているかどうかを推定する (true/false)。 bool TimeServerDaylightSavingsSupported(const datetime srvtime = 0,   const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // 取引サーバー用のTimeGMTOffset()関数のアナログ。 int TimeServerGMTOffset(); // TimeGMT() - TimeTradeServer() 

関数TimeServerDaylightSavings(),TimeServerGMTOffsetHistory(),TimeServerDaylightSavingsSupported() は、TimeServerZone() の単なるラッパーである。

これらの関数はすべて、対応する特性(現在または過去)を取得したいサーバー時刻を1番目の引数として取ります。サーバー時刻が0(デフォルト)のままであれば、現在時刻の結果が返されます。

2番目の引数thresholdは、アルゴリズムの感度を調整することができます。デフォルトでは52/4となっており、これは判断に必要な統計情報の年の4分の1です(祝日の前後の短い週が干渉することなくタイムゾーンを検出することができます)。一方、この設定は、(ブローカーがある時点でそうすることを決定した場合)アドホックなタイムゾーン変更の迅速な検出を防ぎます。アルゴリズムにできるだけ早く変更を検出させるために、しきい値を0に設定するとよいでしょう。

TimeServerGMTOffset() 関数は履歴分析を使用せず、MQL5関数(TimeGMT()-TimeTradeServer() として)を使用して直接オフセットを計算します。

この関数はMQL5の組み込み関数TimeGMTOffset() と同じオフセット表記を使用します。つまり、GMT+3のような正のタイムゾーンは-10800のような負のオフセットで表記され、その逆も同様です。この表記法はJaveScriptのような他のプログラミング言語でも使われていますが、他にも正のタイムゾーンを正のオフセットで表し、負のタイムゾーンを負のオフセットで表す言語があります。アルゴリズムをよく確認してください。

例えば、テストスクリプトは取得したすべてのデータをログに出力する:

1 ~ Built-in functions ~ TimeLocal()=2024.10.05 00:39:01 / ok TimeCurrent()=2024.10.05 00:38:59 / ok TimeTradeServer()=2024.10.05 00:39:01 / ok TimeGMT()=2024.10.04 21:39:01 / ok TimeGMTOffset()=-10800 / ok TimeDaylightSavings()=0 / ok 2 ~ Add-on over built-in functions ~ TimeServerGMTOffset()=-10800 / ok 3 ~ Estimation of server TZ with DST based on week opening hours in history ~ TimeServerDaylightSavings()=-3600 / ok     [offsetGMT] [offsetDST] [supportDST] [0]      -10800       -3600         true 

この場合、サーバーが現在サマータイムモードであるのに対し、ローカルコンピューターはそうでないことが検出されます。

ローカルコンピューターとサーバーのシステム時計は、同じタイムゾーンにある場合でも、通常、わずかに異なる時間(秒や分)を示すことがあることを覚えておいてください。また、組み込みのTimeTradeServer() 関数は合成された日時を 返すことに注意してください。これはMQL5では、タイムゾーン間の変換を簡素化するために行われています。TimeLocal()TimeGMT() は「ローカル形式」で返され、トレードサーバーの時間も同様に返されます。

プリプロセッサ指令により、分析中のデータの詳細な印刷を有効にすることができます:

#define  PRINT_DST_DETAILS

これは、インクルードする前にコードに記述する必要があります:

#include "TimeServerDST.mqh"

以下はログの詳細の例です:

Got 20023 H1 bars, ~834 days Week opening hours stats: 30  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 83 54  0 Time Zone changes (UTC±X before/after weekstart):             [weekstart]    [before] [DSTb] [after] [DSTa] [0] 2021.07.25 00:00:00 -2147483648  false      -1  false [1] 2021.11.08 00:00:00           0   true       0  false [2] 2022.03.14 00:00:00           0  false       0   true [3] 2022.11.07 00:00:00           0   true       0  false [4] 2023.03.13 00:00:00           0  false       0   true [5] 2023.11.06 00:00:00           0   true       0  false [6] 2024.03.11 00:00:00           0  false       2  false 3 different timezones detected in quotes, 1 DST candidates Server time offset: UTC+2 STD TimeServerDaylightSavings()=-3600 / ok 

あなたの環境でこのスクリプトを実行し、その結果のログをディスカッションに投稿してください。


更新情報

2024.10.10 - バグ修正:アメリカの夏時間スイッチ(営業時間の統計に干渉していた)を、メイン解析の前にタイムラインから削除。

2024.10.27 - すべての関数の引数に、対象サーバー時刻と最小週間統計のしきい値を追加;TimeServerGMTOffsetEmpiric()TimeServerGMTOffsetHistory() に改名。

2024.10.29 - リクエストされた時間をルックアップ期間に含めるための小さなバグ修正。

2024.10.30 - TimeZoneChange 配列のサマータイムを修正。

2024.11.01 - 貴金属に適用される際の計算の自動調整を追加しました。これにより、米国の夏時間とEUの夏時間のスケジュールが同期していない週において、より信頼性の高い結果を提供することができます。

2024.11.04 - 夏時間のオン/オフのオンライン検出を改良。

2024.11.07 - 指標や経済イベントのバックテスト用の履歴に一括リクエストのためのタイムゾーン/夏時間の変更のキャッシュを追加。

2024.11.08 - 小さなコードのリファクタリングにより、キャッシュのパフォーマンスを最適化。

2024.11.16 - amraliによる金属から推測されるタイムスタンプの1時間調整。

2024.11.17 - amraliによるリファクタリングと修正: 週末のオンラインリクエストに対するキャッシュの再構築を排除、週末にTZの変更を検出するために48時間のルックヘッドを追加(DST移行の可能性あり)、日曜日の00:00をタイムゾーンの境界として使用(週の1番目のバーの代わりに)。

2024.11.20 - デフォルトのしきい値を1に変更(タイムゾーンの変更を迅速に検出することと、休日明けなどの非標準週での誤検出を排除することのバランス); タイムゾーンのオフセットとサマータイムを含む、時刻フォーマットのための新しい関数セットを追加(TimeZoneFmt.mqhを参照); その他の小さな改良。




MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/52557