LEARN / GOLD DAWN BREAK / 3
業者の時計で「前の日」がずれる
このEAの「前の日」は、業者のパソコンの時計(サーバー時刻)で区切ります。この時計は業者ごとに違うので、同じEAでも、業者によって注文の値段と時刻が変わります。
このしくみの面白いところ
EAを何も変えなくても、業者を変えるだけで、注文を置く値段と時刻が変わります。前の日の高値・安値は、「どこからどこまでを1日とするか」で変わるからです。
実際に、同じEAを同じ2023〜24年で試すと、業者によって結果が分かれました。逆に言えば、自分の業者で試し直せば、その業者での動き方を自分の目で確かめられます。時刻のそろえ方を変える改造の余地がある、ということでもあります。
業者ごとの時計
| 業者 | 業者の時計 | 午前2時は日本時間で | 「前の日」の区切り(世界標準時) |
|---|---|---|---|
| Exness | 世界標準時と同じ(夏時間なし) | 11時 | 0時〜24時 |
| XM | 冬は2時間・夏は3時間進んでいる | 冬 9時・夏 8時 | 冬 前日22時〜・夏 前日21時〜 |
| XS | 記録なし(不明) | 不明 | 不明 |
出所:当方で持っている各業者の1分足データに記録した、業者の時計と世界標準時(UTC)との差。XS は記録していないため不明としています。
月曜の「前の日」も、業者で変わります。当方の Exness の1分足には、日曜(世界標準時)の夜に約2時間分の足がありました(2023〜25年、日曜1日あたり真ん中の値で115本)。そのため Exness では、月曜の「前の日」が、日曜の短い時間の足になると考えられます。XM の1分足には日曜の足がなく、月曜の「前の日」は金曜です。EAを動かして記録を見る形での確認は、まだしていません。
同じ期間で、業者によって結果が分かれた
金(XAUUSD)の5分足で、業者の実際の値動きの記録を使って試しました(バックテスト)。0.01ロット・資金100万円・レバレッジ500倍。Exness の行は2022年を含みます。データがそろっている期間が業者ごとに違うため、期間はそろっていません。
EAも設定も同じです。違うのは業者だけです。業者が違うと、値段そのもの、スプレッド(売値と買値の差)、値段が更新される細かさ、そして時計が変わります。
時計の違いが原因なのか
時計の違いが、理由のひとつかもしれません。ただし、まだ確かめていません。上に書いたように、業者の違いは時計だけではありません。どれがどれだけ効いているのかは、まだ分けて調べていません。この結果だけで、「XM では使えない」「Exness なら大丈夫」とは言えません。
自分の業者で試し直す
- 業者の時計が、世界標準時から何時間ずれているかを確かめます。MT5 で
TimeTradeServer()とTimeGMT()の差を出すとわかります。夏時間で変わる業者は、夏と冬の両方で確かめます。 - ストラテジーテスター(MT5 に付いている、過去の値動きで試す機能)で動かします。銘柄は業者の金(XAUUSD・GOLD など)、時間足は5分足、モデルは「リアルティックに基づいたすべてのティック」(実際の値動きの記録をそのまま使う設定)を選びます。
- 注文の遅れは「遅延なし」と「ランダム遅延」の両方で試します。ランダム遅延は、試すたびに結果が少し変わります。数回試して、結果の幅で見ます。
- 期間は 2025.01.01〜2026.09.01 と 2023.01.01〜2025.01.01 です。ロットは0.01(最初の設定のまま)、資金 1,000,000 JPY、レバレッジ 1:500。
- 結果の「ヒストリー品質」が100%かを確かめます。実際の値動きの記録がない期間は、テスターが値動きを作って埋めます。100%なら、記録がそろっています。
MqlDateTime dt;
TimeToStruct(TimeCurrent(), dt);
datetime today = TimeCurrent() - (dt.hour * 3600 + dt.min * 60 + dt.sec);
if(dt.hour == InpSetupHour && dt.min == InpSetupMinute && g_lastSetupDay != today)
{
CancelOwnPendingOrders();
if(!(InpSkipFriday && dt.day_of_week == 5))
DailySetup();
g_lastSetupDay = today;
}
// ...
最初の2行で、業者の時計を読んでいます(TimeCurrent() は、最後に届いた値段の、業者の時計での時刻です)。日本時間や世界標準時に直す処理はありません。
today の行で、その日の0時(業者の時計)を出しています。今日まだ注文を置いていなければ、1日1回だけ次へ進みます。
次へ進むと、まず CancelOwnPendingOrders() で、このEAが出した古い予約注文を消します。金曜(day_of_week == 5)でなければ、DailySetup() で新しく2本置きます(1ページ目のプログラムの一部 1)。
業者の時計の差をそろえて比べたいなら、ここで使う時刻を世界標準時に直す改造が考えられます。その改造は、このEAには入っていません。
経過の公開
このEAは、公開フォワード(EAを動かし続けて、その経過を公開する検証)で検証中です。フォワード実績の「検証中」の区画で経過を見られます。
動かすだけなら、マイページで GOLD DAWN BREAK を受け取ってください。
全部読みたい・直したい・別の通貨で試したい場合は、ソースコード単品か、EA開発システム+全EAソースコードです。