私たちのファンページに参加してください
- ビュー:
- 59
- 評価:
- パブリッシュ済み:
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
TimeGMT() 関数
クライアント端末が動作しているコンピュータのローカル時刻から、サマータイムの 切り替えを考慮して計算された GMT を返す関数です。この関数には2つのバリエーションがあります。
パラメータなしで呼び出す
datetime TimeGMT();
MqlDateTime 型のパラメータを指定して呼び出す。
datetime TimeGMT( MqlDateTime& dt_struct // 構造体型の変数 );
ただし、 ストラテジー・テスターでの テストでは 、TimeGMT() は 常にTimeTradeServer()のシミュレートされたサーバー時間と等しくなります。
TimeGMT ライブラリ
このライブラリは、ストラテジーテスターでのテスト中に真のGMTを提供するためにTimeGMT()関数を修正します。このライブラリは、TimeGMTの2つのバージョン用のグローバルAPIフック(マクロ置換による)をインストールします。
class CTimeGMT { public: static datetime TimeGMT(void); static datetime TimeGMT(MqlDateTime &dt_struct); }
使用方法
ニュース・フィルターや時間制限を使用するエキスパート・アドバイザーをストラテジー・テスターでテストする前に、この行をコードの先頭にインクルードし、MetaEditorでソースを再コンパイルしてください。
#include "TimeGMT.mqh"
- オプションとして、デバッグメッセージを表示するには、#includeディレクティブの前にこの行を追加してください:
#define PRINT_GMT_DETAILS エキスパートアドバイザーやインジケーターには、他の修正や関数呼び出しは必要ありません。
- TimeGMTはストラテジーテスターが検出された場合のみ修正されます。
- この修正は、ストラテジーテスターで選択されたシンボルに対して機能します。
- 週末やクリスマス休暇中も計算エラーは発生しません。
- ストラテジーテスターの低オーバーヘッドと高速計算時間
ブローカー・オフセットの再計算は、エキスパート・アドバイザーの開始時および毎週日曜日と月曜日の深夜にのみ行われます。計算されたブローカー・オフセットはメモリにキャッシュされ、その後のTimeGMTの呼び出しに使用されます。
サーバーのTZ/DST推定用シンボルの選択
デフォルトでは、ライブラリはサーバーのタイムゾーンオフセットを推定するためにXAUUSDシンボルを検索してロードします。XAUUSDは、米国の夏時間とEUの夏時間のスケジュールが同期していない週(3月と10月下旬 )に、 より信頼性の高い結果を提供することができます(特に、EUの夏時間 スケジュールに従っているブローカーの場合)。オプションとして、ブローカーが米国の夏時間スケジュールに従っている場合、または全くスケジュールに従っていない場合は、チャートのシンボルを使用しても問題ありません。 XAUUSDの代わりに現在のチャートのシンボルを使用するには、CTimeGMT::SetUsingGoldSymbol()を'false'で呼び出します。
ブローカーの夏時間(DST)スケジュールを調べるには、次のスクリプトを使用できます: https: //www.mql5.com/en/code/48650
//+------------------------------------------------------------------+ //| XAUUSD(金)シンボルを使用するオプションを設定します。 //| H1引用履歴の分析によるサーバーのTZ/DST。 //| TRUE : ゴールド・シンボルを検索してロードする(デフォルト動作)。 //| FALSE : 現在のチャートのシンボルを使用する。 //+------------------------------------------------------------------+ void CTimeGMT::SetUsingGoldSymbol(const bool enabled = true);
注意:
副次的な効果として、XAUUSDはFXの1時間後に開始するため、ストラテジー・テスターではDSTの切り替えが1時間遅くなる。
TimeGMT_TestEA
ストラテジーテスターのライブラリを調べるために、デモのエキスパートアドバイザーをストラテジーテスターでテストします。
ストラテジーテスターでエキスパートアドバイザーを実行した結果です:
AUDUSD,M1 (ICMarketsSC-Demo): 1 minutes OHLC ticks generating AUDUSD,M1: testing of Experts\TimeGMT_TestEA.ex5 from 2023.03.05 00:00 to 2023.05.01 00:00 started with inputs: timer_hours=24 2023.03.05 00:00:00 TimeCurrent() = Sun, 2023.03.05 00:00:00 | TimeTradeServer() = Sun, 2023.03.05 00:00:00 | TimeGMT() = Sat, 2023.03.04 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.06 00:00:00 TimeCurrent() = Mon, 2023.03.06 00:00:00 | TimeTradeServer() = Mon, 2023.03.06 00:00:00 | TimeGMT() = Sun, 2023.03.05 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.07 00:00:00 TimeCurrent() = Tue, 2023.03.07 00:00:00 | TimeTradeServer() = Tue, 2023.03.07 00:00:00 | TimeGMT() = Mon, 2023.03.06 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.08 00:00:00 TimeCurrent() = Wed, 2023.03.08 00:00:00 | TimeTradeServer() = Wed, 2023.03.08 00:00:00 | TimeGMT() = Tue, 2023.03.07 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.09 00:00:00 TimeCurrent() = Thu, 2023.03.09 00:00:00 | TimeTradeServer() = Thu, 2023.03.09 00:00:00 | TimeGMT() = Wed, 2023.03.08 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.10 00:00:00 TimeCurrent() = Fri, 2023.03.10 00:00:00 | TimeTradeServer() = Fri, 2023.03.10 00:00:00 | TimeGMT() = Thu, 2023.03.09 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.11 00:00:00 TimeCurrent() = Fri, 2023.03.10 23:56:59 | TimeTradeServer() = Sat, 2023.03.11 00:00:00 | TimeGMT() = Fri, 2023.03.10 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.12 00:00:00 TimeCurrent() = Fri, 2023.03.10 23:56:59 | TimeTradeServer() = Sun, 2023.03.12 00:00:00 | TimeGMT() = Sat, 2023.03.11 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.13 00:00:00 TimeCurrent() = Mon, 2023.03.13 00:00:00 | TimeTradeServer() = Mon, 2023.03.13 00:00:00 | TimeGMT() = Sun, 2023.03.12 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.14 00:00:00 TimeCurrent() = Tue, 2023.03.14 00:00:00 | TimeTradeServer() = Tue, 2023.03.14 00:00:00 | TimeGMT() = Mon, 2023.03.13 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.15 00:00:00 TimeCurrent() = Wed, 2023.03.15 00:00:00 | TimeTradeServer() = Wed, 2023.03.15 00:00:00 | TimeGMT() = Tue, 2023.03.14 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.16 00:00:00 TimeCurrent() = Thu, 2023.03.16 00:00:00 | TimeTradeServer() = Thu, 2023.03.16 00:00:00 | TimeGMT() = Wed, 2023.03.15 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.17 00:00:00 TimeCurrent() = Fri, 2023.03.17 00:00:00 | TimeTradeServer() = Fri, 2023.03.17 00:00:00 | TimeGMT() = Thu, 2023.03.16 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.18 00:00:00 TimeCurrent() = Fri, 2023.03.17 23:56:59 | TimeTradeServer() = Sat, 2023.03.18 00:00:00 | TimeGMT() = Fri, 2023.03.17 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.19 00:00:00 TimeCurrent() = Fri, 2023.03.17 23:56:59 | TimeTradeServer() = Sun, 2023.03.19 00:00:00 | TimeGMT() = Sat, 2023.03.18 21:00:00 | BrokerOffset = 10800 (GMT+3)
アップデート
2024.03.30 - v.1.25 : ブローカーGMTオフセットを修正。現在、ライブラリーはGOLDチャートのH1バーのみをスキャンしています。
2024.04.09 - v.1.33 : GMT+0ブローカーにおけるクリスマス休暇中のブローカーGMTオフセット計算の潜在的問題を修正。
2024.04.12 - v.1.35 :金取引を提供していないいくつかのブローカーにおけるブローカーGMTオフセットの計算における問題を修正。
2024.07.07 - v.1.36 :いくつかのブローカーでGOLDシンボルの適切な検出の問題を修正。
2024.10.21 - v.1.40 : EURUSDシンボルへのフォールバックでGOLDシンボルの検出を改善。
2024.10.26 - v.1.47 :より良いエラー処理とデバッグコードを追加。HistoryBrokerOffset() メソッドを TimeServerGMTOffset() に改名。
2024.10.28 - v.1.49 :マクロ本体内でのパラメータの二重評価を避けるため、時間を扱うマクロをすべて関数に変換。その他の行のコードクリーンアップ。
2024.10.30 - v.1.50 : 一部のブローカーでXAUEURクォートからのGMTオフセットの見積もりが間違っていた問題を修正。
2024.11.23 - v.1.55 : サーバーのTZ/DSTを推定するためのゴールドシンボルのデフォルト読み込みをオフにするオプションを追加。CTimeGMT::SetUsingGoldSymbol()に'false'を指定して呼び出すと、代わりに現在のチャートのシンボルが使用されます。
2024.12.12 - v.1.60 : HistoryServerGMTOffset()関数のパフォーマンス向上とその他のマイナーコード変更。
2024.12.14 - v.1.61 : FindSymbol()関数のパフォーマンス向上。
2024.12.17 - v.1.62 : HistoryServerGMTOffset() 関数のさらなる最適化。
2024.12.24 - v.1.63 : HistoryServerGMTOffset()関数の潜在的な問題を修正。
ブローカーのタイムゾーンと夏時間スケジュール
グリニッジ標準時(GMT)は協定世界時(UTC)とも呼ばれ、時間の公式な世界基準として使用されています。タイムゾーンは、UTC - 3hまたはGMT - 3hのように表されることがよくあります。この例では、(-3h)はそのタイムゾーンがUTCまたはGMTから3時間遅れていることを意味します。UTC+3hまたはGMT +3hは、そのタイムゾーンがUTCまたはGMTより3時間進んでいることを意味します。現地時間とGMT(UTC)の時間差はGMTオフセットと呼ばれる。
外国為替市場は、日曜日のニューヨーク時間17:00(冬季はGMT-5:00、夏季はGMT-4:00)にオープンし、金曜日の同じ時間にクローズします。 ニューヨーク時間の日曜日17:00の外国為替市場の開始時間は、冬は日曜日のUTC午後10:00(夏は日曜日のUTC午後9:00)に対応します。外国為替市場の終了時刻は、冬は金曜日の午後10時(UTC)(夏は午後9時(UTC))です。金と銀のスポット市場は通常1時間後に始まる。
各FXブローカーにはタイムゾーンとサーバー時間があります。したがって、取引週の開始時間(H1ローソク足)はブローカーによって異なり、サンフランシスコ(GMT-8)のブローカーのサーバー 時間では 日曜日の午後2時から、シドニー(GMT+11)のブローカーのサーバー 時間では 月曜日の午前9時まで変動します。取引週の終わりも、金曜の午後2時(サーバー時間)から土曜の午前9時(サーバー時間)まで様々です。
各ブローカーは、夏時間(DST)を自由に選択できます。そして、夏時間は必ずしもそのタイムゾーンで同じではありません。時々、彼らはEUのDSTの代わりにEUのタイムゾーンと米国のDSTを使用してそれを混在させる。米国のスケジュールに従っていないブローカーの場合、週の開始(および終了)のサーバー時間は、年間を通じて同じブローカーで±1時間異なります。 このような変動に対応するため、 ブローカーオフセットの再計算を週単位で行い、ブローカーの夏時間の変更を時間通りに検出できるようにする必要があります。
したがって、+2(および米国のスケジュールで夏には+3)のタイムゾーンを使用すると、各週のローソク足が月曜日の深夜に開始し、週に5つのD1ローソク足があり、毎日のローソク足(およびH4)の開始は、新しいFX日の開始であることを意味します。各週は土曜日の真夜中直前に終了します。単純に、 これらのサーバーの時間は常にニューヨークより7時間進んでおり、NY+7として表されます。これは 圧倒的に 最も一般的な設定ですが、あまり一般的ではない多くのバリエーションがあります。
真のGMTの 計算の詳細
TimeGMT()の呼び出しがライブラリによってインターセプトされると、まずストラテジー・テスターで実行されていないかどうかをチェックし、それから元の関数を返す。ストラテジー・テスターが検出された場合、コードはブローカー・オフセットの計算を開始し(後述)、戻り値は単にクライアント端末の取引サーバーの現在時刻からこのオフセットを差し引いた結果となる。
true GMT = TimeTradeServer() - ServerGMTOffset (of the current trading week)
ServerGMTOffset'自体は、H1の相場履歴を分析することで、2つの既知の時刻の差として推定することができる:
1) 取引週の最初のバーがGOLD チャートに表示される時間(FstBarWk)、
2) 日曜日18:00のニューヨークのGOLD取引開始時間に対応するUTC時間 。
ServerGMTOffset = FstBarWk - UTC (NY Sun, 18:00)
BrokerOffsetの計算には、Carl SchreiberがDealing with time (2) で発表したアルゴリズムを最適化したものを使用しています。
https://www.timeanddate.com/time/change/usa/new-york。
- ニューヨークでは、夏時間は3月の第2日曜日の現地時間午前2:00に始まる。時計は1時間進んでGMT-4となるため、NYの日18:00に対応するUTC時刻は(日22:00 UTC)となる。
- ニューヨークのサマータイム終了(冬時間)は11月第1日曜日の現地時間午前2時であるため、時計は1時間進んでGMT-5となり、NY Sun, 18:00に対応するUTC時刻は(Sun, 23:00 UTC)となります。
例えば、GOLDチャートのFstBarWkがMon, 01:00に始まり、そのバーでニューヨークが冬で あれば、BrokerOffsetは次のように計算できます:
ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 23:00 UTC) = 2 hours (GMT+2)
また、ニューヨークが夏の 場合は、BrokerOffset:
ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 22:00 UTC) = 3 hours (GMT+3)
セッション時間からブローカーのサーバー時間への変換
トレーダーは、TimeGMT() を使ってセッション時間を対応するサーバー時間に変換し、特定の市場がいつ開 くか、または閉じるかを決定することができます。例えば、トレーダーがアジア(東京)セッションで取引したい場合、それに応じて取引時間を調整する必要があります。
1]ブローカーの取引サーバーのオフセットを決定する。
int ServerGMTOffset = TimeTradeServer() - TimeGMT();
2]特定の市場のローカル時間を対応するブローカーのサーバー時間に変換する。
datetime Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset 取引先のタイムゾーンが夏時間の場合は、式の第2項(xxx_GMTOffset)を+1時間する。
ストラテジーテスターでのテスト中、TimeGMT()は常にTimeTradeServer()のシミュレートされたサーバー時間と等しいため、セッション時間の変換がおかしくなります。 本ライブラリは、真のGMTを提供するためにTimeGMT()関数を修正し、ストラテジーテスターでのテスト中に変換されたセッション時間が正確になるようにします。
MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/48291
Simple Bar Timer
次のバーが来るまで残り時間を表示するスクリプトです。
Xから時間、Yから価格、またはその逆の関数
ChartXYToTimePriceおよびChartTimePriceToXYの代わりに使用する関数。
Statistical Zigzag
これは、ボラティリティのしきい値を通過することに基づいて、新しいジグザグの転換点を作成するジグザグです。
Historex: export the history of rates and ticks to CSV-files
これは、現在のチャートのシンボルのレートとティックを、MT5のエクスポート/インポート形式と互換性のあるCSVファイルにエクスポートするスクリプトです。
