無料でロボットをダウンロードする方法を見る
Twitter上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ライブラリ

Local Timezones and Local Session Hours - MetaTrader 5のためのライブラリ

ビュー:
64
評価:
(16)
パブリッシュ済み:
MQL5フリーランス このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

トレーダーの皆さん、こんにちは。

このライブラリには、特定の、またはすべての外国為替市場の現地時間を取得するためのすべての関数があります。ローカルタイムをタイムゾーン間やブローカーのサーバータイムに変換することができます。また、各セッションの開始時刻と終了時刻を個別に設定することで、特定のセッションで取引することもできます。このライブラリは、ブローカーとこれらの市場の異なるタイムオフセットと夏時間の変更に対応します。これにより、エキスパートアドバイザーやテクニカルインディケータをプログラムするたびに、タイムゾーンやローカルセッションの時間帯に対応する必要があるため、毎回車輪を再発明する負担から解放されます。


タイムゾーンとは?

タイムゾーンとは、その場所の地理的表示による標準時間と定義されます。言い換えれば、タイムゾーンは、地球の自転に基づく特定の地域のローカルタイムを指します。タイムゾーンはUTC(協定世界時)で定義され、世界各地の時刻を調整する基準となります。

例えば ニューヨークの時刻はグリニッジから5時間遅れており、日照時間に基づいてUTC-5またはUTC-4として表されます。シドニーの時刻はグリニッジより10時間進んでおり、日照時間(夏または冬)に基づいてUTC+10またはUTC+11と表される。UTCとGMTという用語は、オフセットを表すためにしばしば互換的に使用されるため、UTC+2とGMT+2はしばしば 同じ意味を持ちます。

UTCオフセットは、タイムゾーンがGMTの東にある場合は正になり、西にある場合は負になります。


タイムゾーン識別子

//+------------------------------------------------------------------+
| タイムゾーン識別子|
//+------------------------------------------------------------------+
enum ENUM_ZONE_ID
  {
   ZONE_ID_SYDNEY,     // シドニー
   ZONE_ID_TOKYO,      // 東京
   ZONE_ID_FRANKFURT,  // フランクフルト
   ZONE_ID_LONDON,     // ロンドン
   ZONE_ID_NEWYORK,    // ニューヨーク
   ZONE_ID_UTC,        // UTC
   ZONE_ID_LOCAL,      // LOCAL
   ZONE_ID_BROKER,     // ブローカー
   ZONE_ID_CUSTOM      // カスタム
  };


クラス・インタフェース

//+------------------------------------------------------------------+
//| クラス CTimeZoneInfo.|
//| 目的: 指定されたローカル時刻にアクセスするためのクラス。
//| 位置情報、タイムゾーン情報、時刻情報など。
//| 今年度の変更点。|
//||
//| ライブラリで使用されているオフセット表記:|
//| ライブラリは正の時間を表すことに注意してください。
//| 正のオフセットによるゾーンと、負のタイムゾーン。
//| 負のオフセットによって。|
//| 逆に、MQL5の組み込みのTimeGMTOffset()
//| GMT+3など、正のタイムゾーンを表す。
//| その逆も同様である。
//+------------------------------------------------------------------+
class CTimeZoneInfo
  {
public:
                     CTimeZoneInfo( ENUM_ZONE_ID placeId, datetime pLocalTime = TIME_NOW );
                    ~CTimeZoneInfo( void );

   string            Name( void );                                                       // タイムゾーン名を返す
   string            ToString( bool secs = true, bool tzname = true );                   // TZ/DSTオフセットとtznameでフォーマットされたローカル時間の文字列を返す。
   bool              RefreshTime( void );                                                // 現在の現地時間を更新し、タイムゾーン情報を入力する。
   bool              SetLocalTime( datetime pLocalTime = TIME_NOW );                     // この場所の現地時刻を指定時刻に設定する。

   datetime          TimeLocal( void );                                                  // タイムゾーンで現地時間を返す
   datetime          TimeUTC( void );                                                    // UTC時刻を返す (どのタイムゾーンでも同じ)
   int               TimeGMTOffset( void );                                              // 正のタイムゾーン(GMT+3など)の場合は正の値、そうでない場合は負の値。(夏時間を含む)
   int               TimeDaylightSavings( void );                                        // 設定されたローカル時間における、タイムゾーンの夏時間補正(秒単位)を返します。

   datetime          ConvertLocalTime( ENUM_ZONE_ID destinationId );                     // このタイムゾーンの現地時間を別のタイムゾーンに変換する。
   bool              GetDaylightSwitchTimes( datetime &dst_start, datetime &dst_end );   // サマータイムの開始時刻と終了時刻を取得する。
   datetime          GetDaylightNextSwitch( void );                                      // 次の夏時間切り替えの現地時間を取得する。
   void              PrintObject( void );

   //--- オブジェクトの生成を必要としない静的メソッド。
   static datetime   GetCurrentTimeForPlace ( ENUM_ZONE_ID placeId );                    // 指定したタイムゾーンの現在の現地時刻を取得する
   static string     FormatTimeForPlace     ( datetime time, ENUM_ZONE_ID placeId, bool secs = true, bool tzname = true );
   static datetime   ConvertTimeForPlace    ( datetime time, ENUM_ZONE_ID placeId, ENUM_ZONE_ID destinationId );
   static int        TimeGMTOffset          ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // GMT からの tz オフセット (UTC+DST) の合計を返す。
   static int        TimeDaylightSavings    ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // 指定された現地時間のタイムゾーンの dst 補正を秒単位で返す
   static bool       IsDaylightSavingTime   ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // 指定された時刻がサマータイムに該当するかどうかをチェックする。
   static bool       GetDaylightSwitchTimes ( ENUM_ZONE_ID placeId, int iYear, datetime &dst_start, datetime &dst_end );
   static bool       GetDaylightSwitchDeltas( ENUM_ZONE_ID placeId, int iYear, int &delta_start, int &delta_end );

   static bool       SetCustomTimeZone( string name, int baseGMTOffset = 0,              // ライブラリにないタイムゾーンを定義する。
                                        ENUM_ZONE_ID dstSchedule = ZONE_ID_UTC );
   static void       SetUsingGoldSymbol( bool enabled = true );                          // サーバーのTZ/DSTの推定にゴールドシンボルを使用するオプションを設定します。
  };


クラス・インタフェース

//+------------------------------------------------------------------+
//| クラス CSessionHours.|
//| 目的:ローカル・セッションの取引時間にアクセスするためのクラス。
//| 指定された場所。|
//| CTimeZoneInfoクラスから派生。|
//| 注意: セッションのデフォルト時間は午前8時から午後5時までです。
//| 新しいCSessionHoursオブジェクトのローカル時間。
//+------------------------------------------------------------------+
class CSessionHours : public CTimeZoneInfo
  {
public:
                     CSessionHours( ENUM_ZONE_ID placeId );
                    ~CSessionHours( void );

   //--- ローカルのセッション時間にアクセスするメソッド
   bool              RefreshTime( void );                            // 現在の現地時間とその日のセッション時間を更新する
   bool              SetLocalTime( datetime pLocalTime );

   //--- デフォルトのローカル・セッション時間をオーバーライドするメソッド
   bool              BeginLocalTime( int pHour, int pMinute );       // 開始時間と分を使用して、ローカル・セッションの開始時間を設定する。
   bool              EndLocalTime( int pHour, int pMinute );         // 終了時間と分を使用して、ローカル・セッションの終了時間を設定する。

   //--- ローカル・セッション時間にアクセスするメソッド
   datetime          BeginLocalTime( void );
   datetime          EndLocalTime( void );
   bool              CheckLocalSession( void );                      // ローカル取引セッションが現在アクティブかどうかをチェックする。
   int               SecRemainingSession( void );                    // ローカルセッションが終了するまでの残り時間(秒)。

   //--- オブジェクトの生成を必要としない静的メソッド。
   static datetime   ForexCloseTime( void );                         // 今週の外国為替市場が終了するブローカー時間。
   static int        SecRemainingForex( void );                      // 今週の外国為替市場が終了するまでの残り時間(秒)。
  };


ライブラリで使用されるオフセット表記

ライブラリは 正の タイムゾーンを 正の オフセットで、負のタイムゾーンを負のオフセットで表記することに注意してください。

これは、GMT+3のような正のタイムゾーンを-10800のような負のオフセットで表記するMQL5の組み込み関数TimeGMTOffset()の逆です。


サーバのTZ/DSTを推定するためのシンボルの選択

デフォルトでは、ライブラリはサーバーのタイムゾーンオフセットを推定するためにXAUUSDシンボルを検索して読み込みます。XAUUSDは、米国の夏時間とEUの夏時間のスケジュールが同期していない週(3月と10月下旬)に、より信頼性の高い結果を提供することができます(特に、EUの夏時間スケジュールに従っているブローカーの場合)。オプションとして、ブローカーが米国の夏時間スケジュールに従っている場合、または全くスケジュールに従っていない場合は、チャートシンボルを使用しても問題ありません。CTimeZoneInfo::SetUsingGoldSymbol()に'false'を指定して呼び出すと、XAUUSDの代わりに現在のチャートのシンボルが使用されます。

ブローカーの夏時間(DST)スケジュールを調べるには、次のスクリプトを使用できます: https: //www.mql5.com/en/code/48650

//+------------------------------------------------------------------+
//| XAUUSD(金)シンボルを使用するオプションを設定します。
//| H1の引用履歴の分析によるサーバーのTZ/DST。
//| TRUE : ゴールド・シンボルを検索してロードする(デフォルト動作)。
//| FALSE : 現在のチャートのシンボルを使用する。
//+------------------------------------------------------------------+
void CTimeZoneInfo::SetUsingGoldSymbol(const bool enabled = true);

注意

XAUUSDがForexの1時間後に開始される副作用として、DSTの切り替えが1時間後に行われます(ストラテジーテスターのみで、通常モードでは行われません)。


ストラテジーテスターとの互換性について

ストラテジーテスターでのテスト中、TimeGMT() 常にTimeTradeServer()の シミュレート サーバー時間と等しくなります。

TimeZoneInfo ライブラリは、組み込みの TimeGMT 関数を呼び出すことによって返される時間ではなく、H1 の相場履歴の分析によって「真の」GMT に基づいてタイムゾーンの適切な時間を推定します。

XAUUSD シンボルがサーバーの TZ/DST の推定に使用されている場合、ストラテジー・テスターでは dst 切り替えが 1 時間遅くなります。



I.ローカルタイムゾーンの操作

現在時刻を取得するには?

RefreshTime() メソッドは 、タイムゾーンの現在時刻を 更新します。 現在時刻を取得する方法を示す例を見て みましょう

   Print("\n========== Get the current time in a timezone ==========");

   CTimeZoneInfo tz(ZONE_ID_TOKYO);
   tz.RefreshTime(); // 現在のタイムゾーン情報を入力する

   Print("Name()      : ", tz.Name());
   Print("TimeLocal() : ", tz.TimeLocal());
   Print("ToString()  : ", tz.ToString());

出力 します:

   // タイムゾーンの現在時刻を取得 ===============
   // 名前() :東京
   // TimeLocal() : 2024.02.28 19:58:50
   // ToString() :2024.02.28 19:58:50 GMT+9 [東京] (水)


もっと情報が必要ですか?

   Print("\n========== More information about a timezone ==========");

   CTimeZoneInfo tz(ZONE_ID_NEWYORK);
   tz.RefreshTime();

   Print("Name()                  : ", tz.Name());
   Print("TimeUTC()               : ", tz.TimeUTC());
   Print("TimeLocal()             : ", tz.TimeLocal());
   Print("TimeGMTOffset()         : ", tz.TimeGMTOffset());
   Print("TimeDaylightSavings()   : ", tz.TimeDaylightSavings());
   Print("ToString()              : ", tz.ToString());
   datetime dst_start, dst_end;
   tz.GetDaylightSwitchTimes(dst_start, dst_end);
   Print("dst_start               : ", dst_start);
   Print("dst_end                 : ", dst_end);
   Print("GetDaylightNextSwitch() : ", tz.GetDaylightNextSwitch());

を出力します:

   // タイムゾーンに関する詳細情報
   // 名前() :ニューヨーク
   // TimeUTC() : 2024.03.17 16:50:38
   // TimeLocal() : 2024.03.17 12:50:38
   // TimeGMTOffset() : -14400
   // TimeDaylightSavings() : 3600
   // ToString() :2024.03.17 12:50:38 GMT-4 [ニューヨーク] (DST)
   // dst_start : 2024.03.10 02:00:00
   // dst_end : 2024.11.03 02:00:00
   // GetDaylightNextSwitch() : 2024.11.03 02:00:00

注意

- TimeUTC() メソッドは UTC 時間を返します。これは GMT 時間と同じです。

- TimeLocal() メソッドは、このタイムゾーンのローカル時間 (RefreshTime またはSetLocalTime メソッドを呼び出した結果変更された可能性があります) を返します。

- TimeGMTOffset() メソッドは、このタイムゾーンのローカル時間と GMT 時間の現在の差を秒単位で返します。返されるオフセットには、現在のタイムゾーンのサマータイム調整も含まれます。GMT オフセットは、そのタイムゾーンが GMT の東 (前方) にある場合は正の値となり、 GMT の西 (後方) にある場合は負の値となります。

-TimeDaylightSavings() メソッドは、夏時間が有効なゾーンで夏時間への切り替えが行われた場合は、夏時間 (DST) の調整値を秒単位で返します。冬時間 (標準時間) に切り替わった場合 (またはタイムゾーンがサマータイムをサポートしていない場合)、0 を返します。


組み込みのカスタム・タイムゾーンを後で使用するために設定するには?

CTimeZoneInfoクラスにはSetCustomTimeZone メソッドがあります。後で、ZONE_ID_CUSTOM識別子を通してカスタム・タイムゾーンを使用することができます。 ここでは、組み込みのカスタム・タイムゾーンを、指定された名前、グリニッジ標準時(GMT)からのオフセット、およびデイライト・スケジュール識別子に設定する方法を示す例を見てみましょう。

   Print("\n========== Configure the built-in custom timezone ==========");

   string        name  = "Custom+3";               // カスタムタイムゾーン名
   int           baseGMTOffset  = 10800;           // カスタムタイムゾーンの基本GMTオフセット(秒単位)
   ENUM_ZONE_ID  daylightRuleId = ZONE_ID_LONDON;  // カスタムタイムゾーンの夏時間スケジュール

   bool success = CTimeZoneInfo::SetCustomTimeZone(name, baseGMTOffset, daylightRuleId);

   Print("Parameter 'name'            : ", name);
   Print("Parameter 'baseGMTOffset'   : ", baseGMTOffset);
   Print("Parameter 'daylightRuleId'  : ", EnumToString(daylightRuleId));
   Print("SetCustomTimeZone() returns : ", success);

出力

   // ========== Configure the built-in custom timezone ==========
   // パラメータ 'name' :カスタム+3
   // パラメータ 'baseGMTOffset' : 10800
   // パラメータ 'daylightRuleId' :ZONE_ID_LONDON
   // SetCustomTimeZone() が返す値 : true


すべてのタイムゾーンで現在時刻を取得

すべてのタイムゾーンの現在時刻を取得する方法を示す例を見てみましょう。

   Print("\n========== Get Current Time in All Timezones ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime();

      PrintFormat("%-12s:  %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());
     }

を出力します:

   // すべてのタイムゾーンで現在時刻を取得
   // シドニー:2024.02.28 21:58|Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST)
   // 東京 : 2024.02.28 19:58 | 2024.02.28 19:58:50 GMT+9 [東京]
   // フランクフルト : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 【フランクフルト
   // ロンドン : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 【ロンドン
   // ニューヨーク : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 【ニューヨーク
   // UTC : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC]
   // ホーム : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [ホーム]
   // FXOpen-MT5 : 2024.02.28 12:58 | 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] [FXOpen-MT5


これは、静的メソッドGetCurrentTimeForPlace() を使う別の方法でも可能です。これは、プレーンな mql の日付 変数を文字列 ( TimeToString に似ています ) にフォーマットするものですが、曜日、日付、時刻、タイムゾーン名、オフセットが含まれます。これらの静的メソッドを呼び出すためにオブジェクトを作成する必要はありません。

   Print("\n========== GetCurrentTimeForPlace() ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      datetime time = CTimeZoneInfo::GetCurrentTimeForPlace(id);

      PrintFormat("Time        :  %s | %s", TimeToString(time), CTimeZoneInfo::FormatTimeForPlace(time, id));
     }

出力 します:

   // ============= GetCurrentTimeForPlace()
   // 時間:2024.02.28 21:58|Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST)
   // 時刻 : 2024.02.28 19:58 | 2024.02.28 19:58:50 GMT+9 [東京]
   // 時刻 : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 [フランクフルト]
   // Time : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 【ロンドン
   // Time : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 【ニューヨーク
   // Time : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC]
   // Time : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [ホーム]
   // Time : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5].


タイムゾーンのローカル時刻を設定するには?

SetLocalTime() メソッドは 指定したローカル時間を 設定します。 タイムゾーンのローカル時間を設定する方法を例で見てみましょう。

   Print("\n========== Set the local time for a timezone ==========");

   CTimeZoneInfo tz(ZONE_ID_NEWYORK);

   if(tz.SetLocalTime(D'2021.07.15 09:31'))
      PrintFormat("%-12s:  %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());

   if(tz.SetLocalTime(D'2022.01.23 17:04'))
      PrintFormat("%-12s:  %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());

   if(tz.SetLocalTime(D'2023.03.12 02:21'))
      PrintFormat("%-12s:  %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());

を出力します:

   // ========== Set the local time for a timezone ==========
   // ニューヨーク : 2021.07.15 09:31 | 2021.07.15 09:31:00 GMT-4 [ニューヨーク] (DST)
   // ニューヨーク : 2022.01.23 17:04 | 2022.01.23(日) 17:04:00 GMT-5 【ニューヨーク
   // >>エラー:2023.03.12 02:21という時刻はニューヨークには存在しません。これは夏時間が1時間スキップされたためです。

最後に表示されるエラーメッセージの原因については、次の段落で説明します。


夏時間(DST):

サマータイムとは、季節による時間変更のことで、1年のうち一部の期間は標準時より早く設定されます。

https://www.timeanddate.com/time/dst/transition.html を 参照。

(「夏時間スキップ」、「冬時間ウィンドバック」)

春に夏時間が始まると、私たちの時計は一定時間、通常は1時間進められる。つまり、時計が1時間スキップされる。秋になると、夏時間は終了し、時計は再び標準時に戻ります。


夏時間開始の例

(存在しない時間)

米国では、夏時間は常に現地時間の午前2時に始まります。標準時が1:59:59になった瞬間、時計は3:00:00に進みます。つまり、2:00:00から2:59:59までの1時間は、切り替えの夜には存在しない。



II.タイムゾーン情報の取得

1.UTCオフセットと現在の夏時間オフセット

タイムゾーン名、UTCオフセット、および夏時間が適用されている場合の現在の夏時間オフセットを取得する方法を示す例を見てみましょう。

   Print("\n========== UTC offset and current DST offset ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime(); // 現在のタイムゾーン情報を入力する

      PrintFormat("%-12s: GMT%+g | DST%+g", tz.Name(), tz.TimeGMTOffset()/3600., tz.TimeDaylightSavings()/3600.);
     }

を出力します:

   // UTCオフセットと現在の夏時間オフセット
   // シドニー:GMT+11 | 夏時間+1
   // 東京:GMT+9|夏時間+0
   // フランクフルト:GMT+1|夏時間+0
   // ロンドン:GMT+0 | DST+0
   // ニューヨークGMT-4 | 夏時間+1
   // utc : gmt+0 | dst+0
   // ホーム :GMT+2 | DST+0
   // FXOpen-MT5 :GMT+2 | DST+0

注意

- TimeGMTOffset() メソッドは、このタイムゾーンのローカル時間と GMT 時間の現在の差を、冬時間または夏時間への切り替えを考慮して秒単位で返します。返されるオフセットには、現在のタイムゾーンのサマータイム調整が含まれます。GMT オフセットは、そのタイムゾーンが GMT の東 (前方) にある場合は正の値となり、 GMT の西 (後方) にある場合は負の値となります。

-TimeDaylightSavings() メソッドは 、夏時間が有効なゾーンで夏時間への切り替えが行われた場合は、夏時間 (DST) の調整値を秒単位で返します。冬時間 (標準時間) に切り替わった場合 (またはタイムゾーンが夏時間をサポートしていない場合)、0 を返します。


2.現在の年のDST切り替え時間

DST情報を取得する方法を示す例を見てみよう。

   Print("\n========== DST switch times for the current year ==========");

   datetime dst_start, dst_end;

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime(); // 現在のタイムゾーン情報を入力する

      //--- サマータイムを採用しているタイムゾーンのみ。
      if(tz.GetDaylightSwitchTimes(dst_start, dst_end))
        {
         PrintFormat("%-12s:  DST starts on %s |  DST ends on %s", tz.Name(), TimeToString(dst_start), TimeToString(dst_end));
        }
     }

を出力します:

   // 夏時間の当年切り替え時間
   // シドニー:夏時間開始は2024.04.07 03:00|夏時間終了は2024.10.06 02:00
   // フランクフルト:夏時間開始 2024.03.31 02:00 | 夏時間終了 2024.10.27 03:00
   // ロンドン:夏時間開始 2024.03.31 01:00 | 夏時間終了 2024.10.27 02:00
   // ニューヨーク:夏時間開始:2024.03.10 02:00|夏時間終了:2024.11.03 02:00

3.次の夏時間の切り替え時刻

次に夏時間が切り替わる時刻を取得する方法の例を見てみましょう。

   Print("\n========== Time of the next DST switch ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime();

      datetime nxswitch = tz.GetDaylightNextSwitch();

      //--- サマータイムを採用しているタイムゾーンのみ。
      if(nxswitch)
        {
         PrintFormat("%-12s:  Time: %s |  dstNextSwitch: %s", tz.Name(), TimeToString(tz.TimeLocal()), TimeToString(nxswitch));
        }
     }

出力されます:

   // 次のサマータイム切り替え時刻
   // シドニー:時刻:2024.02.28 21:58|dstNextSwitch:2024.04.07 03:00
   // フランクフルト:時刻:2024.02.28 11:58|dstNextSwitch:2024.03.31 02:00
   // ロンドン : 時刻: 2024.02.28 10:58 | dstNextSwitch: 2024.03.31 01:00
   // ニューヨーク : 時刻: 2024.02.28 05:58 | dstNextSwitch: 2024.03.10 02:00


4.夏時間リスト

このライブラリにあるすべてのタイムゾーンの夏時間情報を、ある年の範囲で取得する方法の例を見てみましょう。

   Print("\n========== DST List ==========");

   datetime dst_start, dst_end;
   int delta_start, delta_end;  // 時計は秒単位で変化する

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo timezone(id);

      PrintFormat("========= %s Summer Time (DST) =========", timezone.Name());
      for(int year=2008; year<=2030; year++)
        {
         //--- サマータイムを採用しているタイムゾーンのみ。
         if(CTimeZoneInfo::GetDaylightSwitchTimes(id, year, dst_start, dst_end))
           {
            CTimeZoneInfo::GetDaylightSwitchDeltas(id, year, delta_start, delta_end);

            PrintFormat("DST starts on %s (%+d) and ends on %s (%+d)",TimeToString(dst_start), delta_start/3600, TimeToString(dst_end), delta_end/3600);
           }
        }

     }

出力されます:

   // 夏時間リスト
   // シドニー夏時間(サマータイム
   // 夏時間は2008.04.06 03:00(-1)に始まり、2008.10.05 02:00(+1)に終わる。
   // 夏時間は2009.04.05 03:00(-1)に始まり、2009.10.04 02:00(+1)に終わる。
   // 夏時間は2010.04.04 03:00(-1)に開始し、2010.10.03 02:00(+1)に終了します。
   // 夏時間は2011.04.03 03:00(-1)に始まり、2011.10.02 02:00(+1)に終わる。
   // 夏時間は2012.04.01 03:00(-1)に始まり、2012.10.07 02:00(+1)に終わる。
   // ...
   // ...
   // ...

5.サーバーの GMT オフセット(現在)

ブローカーの GMT オフセットは、ブローカーの時間が GMT より何秒進んでいるかを示し、ブローカーオフセット = TimeTradeServer() - TimeGMT()となります。正の値は、サーバー時間が GMT より進んでいることを示します。 ブローカーの現在の GMT オフセットを取得する方法を示す例を見てみましょう。

   Print("\n========== Current GMT offset of the broker ========== ");

   CTimeZoneInfo broker(ZONE_ID_BROKER);
   broker.RefreshTime();

   Print("Name()          : ", broker.Name());
   Print("TimeLocal()     : ", broker.TimeLocal());  // ブローカー時間
   Print("ToString()      : ", broker.ToString());
   Print("TimeGMTOffset() : ", broker.TimeGMTOffset());

を出力します:

   // ブローカーの現在のGMTオフセット
   // Name() :ICMarketsSC-Demo
   // TimeLocal() : 2024.03.08 06:33:06
   // ToString() :金, 2024.03.08 06:33:06 GMT+2 [ICMarketsSC-Demo]
   // TimeGMTOffset() : 7200

注: TimeGMTOffset() の重要な注意 点は、 dst 補正 (UTC+DST) を含む utc オフセットを返すことです。正の値は、サーバー時刻が GMT よりも先 (東) にあることを示します。


6.サーバーの GMT オフセット (過去のもの)

サーバーの過去のGMTオフセットは、チャート上のサーバー週の最初のバーの出現時刻と、ニューヨーク時間の 日曜日午後5時に対応するUTC時刻との差として計算することができます。 ブローカーの過去のGMTオフセットを取得する方法を示す例を見てみましょう。この例では、ブローカーの過去の時間としてチャートのローソク足の時間を使用します。

   Print("\n========== Past GMT offsets of the broker (chart candles) ==========");

   datetime bartimes[];
   int copied = CopyTime(Symbol(), PERIOD_D1, D'2022.03.18', 9, bartimes);
   if(copied<=0)
      Print("CopyTime() failed.");

   for(int i =0; i < copied; i++)
     {
      datetime t = bartimes[i];

      CTimeZoneInfo broker(ZONE_ID_BROKER);
      broker.SetLocalTime(t);

      PrintFormat("bar #%i  Time: %s |  offset: %5d (GMT%+g) |  %s",
                  i+1,
                  TimeToString(broker.TimeLocal()),
                  broker.TimeGMTOffset(),
                  broker.TimeGMTOffset()/3600.0,
                  broker.ToString());
     }

出力:

   // ========== Past GMT offsets of the broker (chart candles) ==========
   // 時刻: 2022.03.08 00:00 | オフセット: 7200 (GMT+2) | 2022.03.08(火) 00:00:00 GMT+2 [ICMarketsSC-Demo]。
   // bar #2 Time: 2022.03.09 00:00 | offset: 7200 (GMT+2) | Wed, 2022.03.09 00:00:00 GMT+2 [ICMarketsSC-Demo]。
   // bar #3 Time: 2022.03.10 00:00 | offset: 7200 (GMT+2) | Thu, 2022.03.10 00:00:00 GMT+2 [ICMarketsSC-Demo]。
   // 時刻: 2022.03.11 00:00 | オフセット: 7200 (GMT+2) | 2022.03.11 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #5 Time: 2022.03.14 00:00 | offset: 10800 (GMT+3) | Mon, 2022.03.14 00:00:00 GMT+3 [ICMarketsSC-Demo]。
   // bar #6 Time: 2022.03.15 00:00 | offset: 10800 (GMT+3) | Tue, 2022.03.15 00:00:00 GMT+3 [ICMarketsSC-Demo]。
   // bar #7 Time: 2022.03.16 00:00 | offset: 10800 (GMT+3) | Wed, 2022.03.16 00:00:00 GMT+3 [ICMarketsSC-Demo]。
   // bar #8 Time: 2022.03.17 00:00 | offset: 10800 (GMT+3) | Thu, 2022.03.17 00:00:00 GMT+3 [ICMarketsSC-Demo]。
   // bar #9 Time: 2022.03.18 00:00 | offset: 10800 (GMT+3) | 2022.03.18 00:00:00 GMT+3 [ICMarketsSC-Demo]

バー#5に あるように、サーバーは+2冬時間から+3夏時間に切り替わり、切り替わる時間は米国の夏時間スケジュール(3月の第2日曜日)に従っている。D1ローソク足は週に5本あり、土曜日と日曜日はローソク足がないこれらのサーバーの時間は年間を通して常にニューヨークより7時間進んでおり、NY+7と表される。NYは冬は-5、夏は-4である ことに注意。

これは、過去のサーバーのGMTオフセット(過去のGMTオフセット)を決定できるコードベース上の最初のライブラリである。計算で実装されたアルゴリズムは非常に高速かつ正確で、可能な限り異なるブローカーと互換性があります(異なるGMTオフセットまたはDSTスケジュールを持つ多数のブローカーでテスト)。



III.タイムゾーン間の変換

現在のローカルタイムを別のタイムゾーンに変換する

このタイムゾーン・インスタンスの設定ローカル時間を特定のタイムゾーンに変換するには、ConvertLocalTime() メソッドを使用します。このメソッドは、指定したタイムゾーンの新しい時刻を返します。

例として、"現在" のローカル時間を特定のタイムゾーンに変換する方法を示します。

   Print("\n========== Convert current local time in Sydney to New York ==========");

   CTimeZoneInfo sydney(ZONE_ID_SYDNEY);
   sydney.RefreshTime();

   datetime localtime = sydney.TimeLocal();
   datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK);

   PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString());
   PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));

を出力します:

   // シドニーの現地時間をニューヨークに変換する。
   // 2024.02.28 21:58|Wed, 2024.02.28 21:58:50 GMT+11 [シドニー] (DST)
   // 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 【ニューヨーク


特定のローカル時間を別のタイムゾーンに変換する

特定の現地時刻を特定のタイムゾーンに変換する例を見てみましょう。

   Print("\n========== Convert a specific local time in Sydney to New York ==========");

   CTimeZoneInfo sydney(ZONE_ID_SYDNEY);
   sydney.SetLocalTime(D'2016.05.21 14:47:08');

   datetime localtime = sydney.TimeLocal();
   datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK);

   PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString());
   PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));

出力

   // シドニーの現地時間をニューヨークに変換する。
   // 2016.05.21 14:47 | Sat, 2016.05.21 14:47:08 GMT+10 [シドニー]
   // 2016.05.21 00:47|Sat, 2016.05.21 00:47:08 GMT-4 [ニューヨーク] (DST)


すべてのタイムゾーンで現在のローカル時間をブローカー時間に変換

すべてのタイムゾーンで現在のローカル時間をブローカー時間に変換する方法を示す例を見てみましょう。

   Print("\n========== Convert the current local time in all timezones to the broker time ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      datetime localtime = CTimeZoneInfo::GetCurrentTimeForPlace(id);
      datetime converted = CTimeZoneInfo::ConvertTimeForPlace(localtime, id, ZONE_ID_BROKER);

      PrintFormat("%-49s | %s", CTimeZoneInfo::FormatTimeForPlace(localtime, id), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_BROKER));
     }

を出力します:

   // ========== Convert the current local time in all timezones to the broker time ==========
   // 2024.02.28(水) 21:58:50 GMT+11 [シドニー] (DST) | 2024.02.28(水) 12:58:50 GMT+2 [FXOpen-MT5] [FXOpen-MT5
   // 2024.02.28 Wed, 19:58:50 GMT+9 [東京] | 2024.02.28 Wed, 12:58:50 GMT+2 [FXOpen-MT5] [東京
   // 2024.02.28(水) 11:58:50 GMT+1 [フランクフルト] | 2024.02.28(水) 12:58:50 GMT+2 [FXOpen-MT5
   // 2024.02.28(水) 10:58:50 GMT+0 [ロンドン] | 2024.02.28(水) 12:58:50 GMT+2 [FXOpen-MT5]。
   // 2024.02.28(水) 05:58:50 GMT-5 【ニューヨーク】|2024.02.28(水) 12:58:50 GMT+2 【FXOpen-MT5
   // 2024.02.28(水) 10:58:50 GMT+0 [UTC] | 2024.02.28(水) 12:58:50 GMT+2 [FXOpen-MT5].
   // Wed, 2024.02.28 12:58:50 GMT+2 [Home] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
   // Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]



IV.ローカルセッション時間の操作

A.CTimeZoneInfo クラス

CSessionHours クラスではなく、親クラスであるCTimeZoneInfo クラスを使用することは、より多くの コーディングを必要とし、エラーが発生しやすいため、好ましくないことに注意してください。すべてのタイムゾーンでFXのセッション時間を取得し、ブローカーの時間に変換する方法を示す例を見てみましょう。

   Print("\n======= Local Session Hours (CTimeZoneInfo Class) =======");

   const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK};

   for(int i = 0; i < ArraySize(ids); i++)
     {
      ENUM_ZONE_ID id = ids[i];

      CTimeZoneInfo tz(id);
      tz.RefreshTime();

      datetime localtime = tz.TimeLocal();

      //--- セッションの時間を現地時間の午前8時から午後5時までとする。
      datetime beginlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "08:00");
      datetime endlocal   = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "17:00");

      //--- ブローカー時間への変換
      tz.SetLocalTime(beginlocal);
      datetime beginbroker = tz.ConvertLocalTime(ZONE_ID_BROKER);

      tz.SetLocalTime(endlocal);
      datetime endbroker = tz.ConvertLocalTime(ZONE_ID_BROKER);

      //--- タイムゾーンにおける現地曜日
      MqlDateTime st;
      TimeToStruct(localtime, st);
      int dow = st.day_of_week;

      //string state_str = ((dow != SATURDAY && dow != SUNDAY) && (localtime >= beginlocal && localtime < endlocal)) ?「open" : "closed";
      string state_str = ((dow != SATURDAY && dow != SUNDAY) && (TimeTradeServer() >= beginbroker && TimeTradeServer() < endbroker)) ? "open" : "closed";

      PrintFormat("%-12s:  %s |  %s  [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str);
     }

   Print("-----------------------------------");
   Print("broker time :  ", TimeTradeServer());
   Print("broker time :  ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER));

を出力します:

   // ローカル・セッション時間(CTimeZoneInfoクラス) ===========
   // シドニー : 2024.02.28 Wed, 23:00:00 GMT+2 [FXOpen-MT5] | 2024.02.29 Thu, 08:00:00 GMT+2 [FXOpen-MT5] [セッションクローズ]
   // 東京 : 2024.02.28(Wed) 01:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28(Wed) 10:00:00 GMT+2 [FXOpen-MT5] [セッションクローズ
   // フランクフルト : 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [セッションオープン]
   // ロンドン : 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [セッションオープン]
   // ニューヨーク : 2024.02.28(Wed) 15:00:00 GMT+2 [FXOpen-MT5] | 2024.02.29(Thu) 00:00:00 GMT+2 [FXOpen-MT5] [セッションオープン
   // -----------------------------------
   // ブローカー時間 : 2024.02.28 15:32:30
   // ブローカー時間 : 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5].



B.CSessionHours クラス

目的: 指定された場所のローカル取引セッション時間にアクセスするためのクラス。

CTimeZoneInfo クラスから派生します。

: 新しいCSessionHours オブジェクトのデフォルトのセッション時間は、現地時間の午前 8 時か ら午後 5 時に設定されています。これらのデフォルト値は、必要に応じてオーバーライドできます。


CSessionHours オブジェクトの操作

オブジェクトの使用例を見てみよう。

   Print("\n========== Working with CSessionHours Objects  ==========");

   CSessionHours tz(ZONE_ID_SYDNEY);
   tz.RefreshTime(); // タイムゾーンとセッション情報を入力する

   //--- 親から
   Print("Name()                : ", tz.Name());
   Print("TimeUTC()             : ", tz.TimeUTC());
   Print("TimeLocal()           : ", tz.TimeLocal());
   Print("ToString()            : ", tz.ToString());
   //--- クラスから
   Print("BeginLocalTime()      : ", tz.BeginLocalTime());
   Print("EndLocalTime()        : ", tz.EndLocalTime());
   Print("CheckLocalSession()   : ", tz.CheckLocalSession());
   Print("SecRemainingSession() : ", tz.SecRemainingSession());
   Print("SecondsToString()     : ", CSessionHours::SecondsToString(tz.SecRemainingSession()));

オブジェクトを出力します:

   // CSessionHoursオブジェクトの操作
   // 名前() :シドニー
   // TimeUTC() : 2024.02.28 10:58:50
   // TimeLocal() : 2024.02.28 21:58:50
   // ToString() :Wed, 2024.02.28 21:58:50 GMT+11 [シドニー] (DST)
   // BeginLocalTime() : 2024.02.28 08:00:00
   // EndLocalTime() : 2024.02.28 17:00:00
   // CheckLocalSession() : false
   // SecRemainingSession() :0
   // SecondsToString() : 00:00:00


ローカルセッション時間

CSessionHours はより少ないコードでより多くの機能を提供します。CSessionHours クラスを使用して、すべてのタイムゾーンにおける外国為替セッション時間を 取得し、ブローカーの時間に変換する方法を示す例を見てみましょう。ブローカーの時刻への変換はオプションのステップであり、 各セッションの開始時刻と終了時刻を チェックする際には 必要ないことに注意してください。

   Print("\n======= Local Session Hours (CSessionHours Class) =======");

   const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK};

   for(int i = 0; i < ArraySize(ids); i++)
     {
      ENUM_ZONE_ID id = ids[i];

      CSessionHours tz(id);
      tz.RefreshTime();

      //--- デフォルトのセッション時間は、現地時間の午前8時~午後5時に設定されています。
      datetime beginlocal = tz.BeginLocalTime();
      datetime endlocal   = tz.EndLocalTime();

      //--- ブローカー時間への変換
      datetime beginbroker = CTimeZoneInfo::ConvertTimeForPlace(beginlocal, id, ZONE_ID_BROKER);
      datetime endbroker = CTimeZoneInfo::ConvertTimeForPlace(endlocal, id, ZONE_ID_BROKER);

      string state_str = tz.CheckLocalSession() ? "open, ends in " + CSessionHours::SecondsToString(tz.SecRemainingSession()) : "closed";

      PrintFormat("%-12s:  %s |  %s  [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str);
     }

   Print("-----------------------------------");
   Print("broker time :  ", TimeTradeServer());
   Print("broker time :  ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER));
   Print("Fx close    :  ", CTimeZoneInfo::FormatTimeForPlace(CSessionHours::ForexCloseTime(), ZONE_ID_BROKER));
   int sec = CSessionHours::SecRemainingForex();
   Print("closes in   :  ", sec, " sec = ", CSessionHours::SecondsToString(sec));

を出力する必要があります:

   // ローカル・セッション時間(CSessionHoursクラス) ===============
   // シドニー : 2024.02.28 Wed, 23:00:00 GMT+2 [FXOpen-MT5] | 2024.02.29 Thu, 08:00:00 GMT+2 [FXOpen-MT5] [セッションクローズ]
   // 東京 : 2024.02.28(Wed) 01:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28(Wed) 10:00:00 GMT+2 [FXOpen-MT5] [セッションクローズ
   // フランクフルト : 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [セッションオープン、02:27:29に終了]。
   // ロンドン : 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [セッションオープン、03:27:29に終了]。
   // ニューヨーク : 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [セッションオープン、08:27:29に終了]。
   // -----------------------------------
   // ブローカー時間 : 2024.02.28 15:32:30
   // ブローカー時間 : 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5].
   // Fx close : 2024.03.02 00:00:00 GMT+2 [FXOpen-MT5].
   // クローズ・イン:203249秒=2日08時27分29秒


デフォルトのローカルセッション時間を上書きする方法

CSessionHours クラスのデフォルトのセッション時間をオーバーライドする方法を示す例を見てみましょう。

   Print("\n=========== Override the default session hours ===========");

   CSessionHours frankfurt(ZONE_ID_FRANKFURT);

   // デフォルトのセッション時間を変更する
   frankfurt.BeginLocalTime(9, 0);
   frankfurt.EndLocalTime(19, 0);

   frankfurt.RefreshTime(); // 新しいセッション時間を入力する

   datetime beginlocal = frankfurt.BeginLocalTime();
   datetime endlocal   = frankfurt.EndLocalTime();

   PrintFormat("new session hours  :  %s | %s", CTimeZoneInfo::FormatTimeForPlace(beginlocal, ZONE_ID_FRANKFURT), CTimeZoneInfo::FormatTimeForPlace(endlocal, ZONE_ID_FRANKFURT));
   PrintFormat("current local time :  %s", frankfurt.ToString());

出力されます:

   // デフォルトのセッション時間をオーバーライドする。
   // 新しいセッション時間 : 2024.02.28 09:00:00 GMT+1 [フランクフルト] | 2024.02.28 19:00:00 GMT+1 [フランクフルト]
   // 現在の現地時間 : 2024.02.28 11:58:50 GMT+1 [フランクフルト]


週末に決済ポジションをチェックする方法

SecRemainingForex() 静的メソッドは、今週のFX市場がクローズするまでの残り時間を秒単位で返します。このメソッドは、OnTick() イベントハンドラから(あるいは、 週末直前にティックが来ない場合は OnTimer()から )呼び出して 、クローズ条件を繰り返しチェックする必要があります。週末にどのように終値をチェックするか、例を見てみましょう。

   Print("\n======= Check For Closing Positions at Weekend =======");

   int InpHours   = 2;   // 週末の数時間前
   int InpMinutes = 30;  // 週末の数分前

   int sec = CSessionHours::SecRemainingForex();
   PrintFormat("Time remaining till the weekend : %s", CSessionHours::SecondsToString(sec));
   PrintFormat("Close all if remaining time becomes %s or less.", CSessionHours::SecondsToString(InpHours * 3600 + InpMinutes * 60));

   // 残り時間が目標に達したかチェックする
   if(sec <= InpHours * 3600 + InpMinutes * 60)
     {
      // CloseAll();
     }

別の方法として、絶対時間を使って前の条件をチェックすることもできる:

   // ブローカーの時間が目標に達したかチェックする。
   if(TimeTradeServer() >= CSessionHours::ForexCloseTime() - (InpHours * 3600 + InpMinutes * 60))
     {
      // CloseAll();
     }

出力されます:

   // ======= Check For Closing Positions at Weekend =======
   // 週末までの残り時間 : 3日 03:32:27
   // 残り時間が02:30:00以下になったらすべて閉じる。




週の終わり - ブローカーのタイムゾーンとサマータイムスケジュール

外国為替市場は、日曜日のニューヨーク時間17:00(冬はGMT-5、夏はGMT-4)にオープンし、金曜日の同じ時間にクローズします。 ニューヨークのオープン時間は、冬は日曜日の午後10:00 UTC(夏は日曜日の午後9:00 UTC)に対応します。外国為替市場の終了時刻は、冬は金曜日の午後10時(UTC)(夏は午後9時(UTC))。金と銀のスポット市場は通常1時間後に始まる

各FXブローカーにはタイムゾーンとサーバー時間があります。したがって、取引週の開始時間(H1ローソク足)はブローカーによって異なり、サンフランシスコ(GMT-8)のブローカーのサーバー 時間では 日曜日の午後2 時から、シドニー(GMT+11)のブローカーのサーバー 時間では 月曜日の午前9 時まで変動します。取引週の終わりも、金曜の午後2時(サーバー時間)から土曜の午前9時(サーバー時間)まで様々です

各ブローカーは、夏時間(DST)を自由に選択できます。そして、夏時間は必ずしもそのタイムゾーンで同じではありません。時々、彼らはEUのDSTの代わりにEUのタイムゾーンと米国のDSTを使用してそれを混在させる。米国のスケジュールに従っていないブローカーの場合、週の開始(および終了)のサーバー時間は、同じブローカーで年間を通じて±1時間異なります。 ForexCloseTime() メソッドは、ニューヨークの金曜日17:00のクローズ時間をブローカーの時間に変換することで、これらのブローカー間およびブローカー内の変動を処理し、時間のオフセットとサマータイムを考慮して、正確な結果を提供します。

したがって、+2のタイムゾーンを使用すると(米国スケジュールの夏には+3)、週に5つのD1ローソク足があることを意味します。年間を通して土曜日と日曜日にはキャンドルがありません。単純に、 これらのサーバーの時刻は常にニューヨークより7時間進んでおり、NY+7と表されます。 これは圧倒的に最も一般的な設定ですが、あまり一般的でないバリエーションもたくさんあります。



サンプル・インジケータ TestIndi.mq5


iForexSessions - MetaTrader 5用インディケータ

外国為替市場のセッションをハイライト

https:// www.mql5.com/en/code/48842


リンク

世界時計: https://www.timeanddate.com/worldclock/

タイムゾーンコンバーター: https://www.timeanddate.com/worldclock/converter-classic.html


更新情報

2024.03.01 - v.1.40 :CTimeZoneInfoクラスの冗長なコードを削除(テスト中に使用)、CSessionHoursクラスにメソッドを追加、新しい変更を反映するためにTestIndi.mq5を更新。

2024.03.03 - v.1.45 :ローカルセッション時間の操作 - CTimeZoneInfoクラス」のサンプルコードを更新しました。

2024.03.08 - v.1.50 : CTimeZoneInfoクラスに2つの内部メソッドHistoryBrokerOffsetと FirstBarOfWeekを 追加。過去のサーバー時間の取り扱い(UTCオフセット、テキストフォーマット、変換など)。

2024.03.15 - v.1.56 : シドニーのセッション時間が年間を通してどのように変動しているかを表示するスクリプト "SydneySession_Script.mq5 "を追加。

2024.03.30 - v.1.65 : ブローカーGMTオフセットを修正。現在、ライブラリーはGOLDチャート上のH1バーのみをスキャンしています。

2024.04.01 - v.1.67 :取引週の最初の1時間におけるブローカーGMTオフセットの計算における潜在的な問題を修正。

2024.04.03 - v.1.70 : ブローカーGMTオフセットをハッシュマップにキャッシュし、(インジケーター等からの)検索を高速化。ブローカー・オフセット・キャッシュは1取引週につき1エントリーを含む。

2024.04.08 - v.1.72 : ライブラリのパフォーマンスを少なくとも2-3倍改善。GetNthSunday メソッド 内でStringToTimeの代わりにStructToTimeを使用するようになりました。

2024.04.09 - v.1.75 : GMT+0ブローカーにおけるクリスマス休暇中のブローカーGMTオフセットの計算における潜在的な問題を修正。

2024.04.11 - v.1.77 :GetDaylightSwitchTimes メソッドの 高速化。静的配列を使って現在の年のスイッチ時間を記憶するようにしました。

2024.04.12 - v.1.80 : ゴールド取引を提供していないブローカーのGMTオフセットの計算の問題を修正。

2024.04.15 - v.1.82 : CTimeZoneInfoクラスにSetCustomTimeZone メソッドを追加しました。このメソッドを使用すると、指定された名前、GMTオフセット、およびDST識別子で組み込みのカスタムタイムゾーンを設定できます。カスタム・タイム・ゾーンには、ZONE_ID_CUSTOMを介してアクセスできます。

2024.04.16 - v.1.85 : 内部メソッドGetNthSundayをより最適化されたGetMonthTimeメソッドに置き換えました。

2024.04.17 - v.1.87 :TimeYear内部メソッドをより最適化されたGetYear メソッドに置き換え。

2024.04.18 - v.1.88 :日付コンポーネント(年、月、日)からdatetime値を構築するCreateDateTime 内部メソッドを追加。これはStructToTime関数を呼び出すよりも100-120倍高速です。

2024.10.21 - v.1.90 : EURUSDシンボルへのフォールバックでGOLDシンボルの検出を改善。

2024.10.22 - v.1.93 : ライブ取引において、週末のサーバーのGMTオフセットの決定を高速化。

2024.10.26 - v.1.95 :つの新しい静的メソッドを追加:TimeGMTOffset()TimeDaylightSavings()HistoryBrokerOffset()メソッドの名前をTimeServerGMTOffset()に変更。

2024.10.28 - v.1.97 :マクロ本体内でのパラメータの二重評価を避けるため、時間を扱うマクロをすべて関数に変換。その他の行のコードクリーンアップ。

2024.10.30 - v.1.98 :一部のブローカーにおいて、XAUEURクォートからのGMTオフセットの見積もりが間違っていた問題を修正。

2024.11.01 - v.1.99 :サーバーのTZ/DSTを推定するためのゴールドシンボルのデフォルト読み込みをオフにするオプションを追加。CTimeZoneInfo:: SetUsingGoldSymbol() に'false'を指定して呼び出すと、代わりに現在のチャートのシンボルが使用されます。

2024.11.13 - v.2.00 : オンラインサーバーのTZ/DSTとストラテジーストラテジーの推定を改善(TimeGMTライブラリーは不要になりました)。コンストラクタは場所と時間のパラメータを受け付けます。datetime型のデータを扱うための新しいパブリックメソッド。エラー処理とデバッグ・サポートの改善。

2024.11.14 - v.2.02 :サーバータイムゾーンオブジェクトでXAUUSD,H1の相場履歴にアクセスしようとした時のエラーERR_HISTORY_NOT_FOUND (4401)を修正。

2024.11.17 - v.2.03 : 軽微なバグフィックス。

2024.11.23 - v.2.04 : マイナーな改良とバグフィックス。

2024.12.05 - v.2.05 :新しい静的メソッドDaylightSavingsSupported(placeId)を追加。

2024.12.12 - v.2.10 : HistoryServerGMTOffset()関数とHistoryServerDaylightSavings()関数のパフォーマンス改善、およびその他のマイナーコード変更。

2024.12.14 - v.2.11 : FindSymbol()関数のパフォーマンス向上。

2024.12.17 - v.2.12 :HistoryServerGMTOffset() および HistoryServerDaylightSavings() 関数のさらなる最適化。

2024.12.24 - v.2.13 : HistoryServerGMTOffset() および HistoryServerDaylightSavings() 関数の潜在的な問題を修正しました。

2025.01.12 - v.2.15 : HistoryServerDaylightSavings()関数において、ストラテジーテスターに読み込まれた履歴よりも前の相場履歴を検索してしまう問題を修正。

2025.10.13 - v.2.17 : マイナーな改良とバグフィックス。


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

CVD (Cumulative Volume Delta) CVD (Cumulative Volume Delta)

MT5用の軽量CVD(累積出来高デルタ) - M1ベース、オプションのリセットで売り買いの圧力をローソク足で表示します。

ErrorDescription - 更新されたライブラリ ErrorDescription - 更新されたライブラリ

このライブラリは、MetaQuotes社が公開しているErrorDescription.mqhライブラリのアップデート版で、いくつかの機能が含まれている。

キーボード キーボード

キーボードのデータを扱う

Class For Working With Databases In A Simplified Manner Class For Working With Databases In A Simplified Manner

イージーデータベース