最近のトレーディングにおいて、MetaTrader 5の経済カレンダーを使ったバックテストは非常に重要です。しかし、ここで注意が必要なのは、MetaTrader 5に内蔵されている経済カレンダーが歴史的な価格データと完全に同期していないという点です。
各バーの形成時にサーバーで有効だったタイムゾーンに従って、価格はタイムスタンプが付けられます。バーが形成されると、そのタイムスタンプは変更されず、経済カレンダーは現在のサーバーのタイムゾーンに基づいて過去、現在、未来のイベント情報を提供します。
多くのブローカーが特定のタイムゾーンスケジュールに従っているため、夏時間の切り替えなどにより、歴史的なイベントのタイムスタンプが関連するバーに対して1時間ずれることがあります。これが年間の約半分の期間にわたって発生するのです。
さらに、ブローカーが夏時間の切り替え以上に大きくタイムゾーンを変更することもあります。この場合、歴史的な価格データは経済イベントの発生時刻に対して数時間ずれて表示されることがあります。
ニュースは異なる国から発信され、各国の夏時間スケジュールが異なるため、サーバーが異なるスケジュールに位置している場合、ニュースリリースのタイミングがチャート上で「飛び跳ねる」ことがあります。特に春と秋の数週間では顕著です。
オンラインではあまり重要に思えないかもしれませんが、もしニュースベースの戦略をテストしたい場合はどうでしょうか?
MetaTraderのテスターではカレンダーがネイティブにサポートされていないと言われていますが、多くのトレーダーはニューストレードを好むため、ニュースに注意を払うことが重要です。だからこそ、カレンダーを外部ストレージ(ファイルやデータベース)にエクスポートし、テスターにインポートすることが理にかなっています。
このプロセスを簡素化するために、アルゴトレーディングの書籍で紹介されたカレンダーアーカイブツールが役立ちます。
ここで私たちは、歴史的な価格データと歴史的なイベントの非同期問題に直面します。この問題は、書籍では解決されていませんでしたが、今では拡張版のCalendarCache.mqhと、表示用インジケーターCalendarMonitorCachedTZ.mq5によって解決されました。このインジケーターは、書籍のCalendarMonitorCached.mq5を少し変更したものです。
このインジケーターは、ニュースイベントを監視し、過去のイベントと今後のイベントを動的に更新するチャート上のテーブルを表示します。
時間補正に関する作業は、別の公開ライブラリTimeServerDST.mqhで裏方で行われます。時間補正の動作を理解するために、スクリプトCalendarCSVForDates.mq5を使用し、補正ありとなしのCSVファイルを並べて比較できます。
このライブラリは、両方のプログラムのソースコードに組み込まれています。
#include <TimeServerDST.mqh> // カレンダーキャッシュを有効にするためにタイムゾーン修正のサポートを含める #include <MQL5Book/CalendarFilterCached.mqh> #include <MQL5Book/CalendarCache.mqh>
元のインジケーターと同様に、CalendarCacheFileという文字列入力があります。ここにカレンダーファイルの名前を指定して、読み書きができます。
インジケーターが空のCalendarCacheFileでオンラインチャートに接続されると、内蔵カレンダーをリアルタイムで使用します。
特定の名前がCalendarCacheFileに指定され、ファイルが存在しない場合、インジケーターはカレンダーの記録をキャッシュファイルにエクスポートし(ファイルを作成し)、終了します。この段階でタイムスタンプの補正が必要です(下のFixCachedTimesBySymbolHistoryを参照)。
既存のキャッシュファイルの名前がCalendarCacheFileに指定されると、キャッシュを読み込み、内蔵カレンダーと同様にそのコピーで作業します。これは特にテスターに便利です。

テスターでは、追加のファイルを指定する必要があることを忘れないでください。この場合、準備したオンラインカレンダーファイルをディレクティブ#property tester_fileに指定するか、カレンダーファイルを共通フォルダC:/Users/<ユーザー>/AppData/Roaming/MetaQuotes/Terminal/Common/に配置する必要があります。
もちろん、キャッシュはバックテストや最適化中にEAにも読み込むことができます。
入力文字列FixCachedTimesBySymbolHistoryは次のように処理されます。
空であれば、インジケーターは時間補正なしでキャッシュを保存します。
エクスポート中に時間補正を有効にするには、サーバーの歴史的なタイムゾーンを経験的に特定するために使用されるシンボルを指定する必要があります。これはH1の価格データに基づいて機能し、推奨シンボルは「XAUUSD」または「EURUSD」です。
この入力を使用することで、インジケーターの新しいバージョンにはわずか数行が追加されました:
if(StringLen(FixCachedTimesBySymbolHistory))
cache[].adjustTZonHistory(FixCachedTimesBySymbolHistory, true);
adjustTZonHistoryメソッドは、タイムスタンプの調整のためにCalendarCacheクラスに特別に導入され、その実装はTimeServerDST.mqhの内部を使用します。
このメソッドはオンラインでのみ呼び出す必要があります(テスター内では呼び出さないでください)。通常、メソッドは内蔵カレンダーから埋め込まれたキャッシュオブジェクトに対して、埋め込まれた後すぐに呼び出されるべきです。そうでない場合、キャッシュがカレンダーファイルから読み込まれている場合や、メソッドがすでに呼び出されている場合、キャッシュの内容はすでに調整されている可能性があります。そのため、補正を再度適用すると、間違ったタイムスタンプが得られます。
第2のパラメータ(true)は、メソッドが適用された変更の境界を書き込むよう指示します。これにより、以下のようなログが生成されます:
時間補正は2021.07.19 00:30:00に開始されました。 2021.07.19 00:30:00: 148786 -10800 diff=-3600 2021.07.08 01:50:00: 135918 -7200 OK 2022.03.14 04:30:00: 161085 -10800 diff=-3600 2022.11.07 04:00:00: 165962 -7200 OK 2023.03.13 01:50:00: 168500 -10800 diff=-3600 2023.11.06 01:50:00: 169270 -7200 OK 2024.03.11 01:50:00: 181258 -10800 diff=-3600 2024.11.04 02:30:00: 208469 -7200 OK
各行には、新しい不一致が検出されたイベントの時間とID、イベント時のサーバー時間オフセット、カレンダーキャッシュ時のサーバー時刻のバイアスを排除するために適用すべきすべての後続のタイムスタンプに対する差分が含まれています。
添付されたmqhファイル(CalendarFilter.mqh、CalendarCache.mqh、QuickSortStructT(Ref).mqh)は、書籍の元のバージョンと比較してバグ修正と改善が含まれています。
アップデート
2024年11月11日 - CalendarFilter.mqh、CalendarCache.mqhの小さなバグ修正と更新。
2024年11月22日 - CalendarCache.mqhの小さなバグ修正と改善。