さらに強いEAを作るのに時間で制御するEAを作ることになるんだけど、MT4はサマータイムという仕様があって例えば、日本時間の8月の9時55分が仲値の時刻です。その時のMT4のGMT+3なので3時55分です。同じ3時55分で12月に仲値かというと1時間ズレて10時55分になります。開発を進めるとちょっとしたハードルになると思います。
去年の今頃は色々ググって実装してみたけど今はChatgptがあるので一発で出せます。
MQL4で夏時間ならtrueを返却する関数を作ってください。 アメリカの夏時間は3月第二日曜日から、11月の第一日曜日までです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
bool isDST() { datetime now = TimeLocal(); int year = TimeYear(now); int month = TimeMonth(now); int day = TimeDay(now); int dayOfWeek = TimeDayOfWeek(now); int hours = TimeHour(now); if (month < 3 || month > 11) { return false; } if (month > 3 && month < 11) { return true; } // US DST starts at 2:00 am on the second Sunday in March if (month == 3) { int dstStart = 14 - dayOfWeek; if (day >= dstStart) { return true; } else { return false; } } // US DST ends at 2:00 am on the first Sunday in November if (month == 11) { int dstEnd = 7 - dayOfWeek; if (day < dstEnd) { return true; } else { return false; } } return false; } |
この関数は、現在の日時を取得し、アメリカの夏時間の期間にあるかどうかを判定しています。
month
が3から11の間である場合、夏時間の期間内である可能性があります。そのため、month
が3より大きくかつ11より小さい場合は、夏時間であると判断してtrue
を返します。
month
が3または11である場合は、それぞれ夏時間が始まる日と夏時間が終わる日を計算し、現在の日付がその範囲内にあるかどうかを判定します。その結果に応じてtrue
またはfalse
を返します。注意点として、この関数は地域によって異なる夏時間のルールには対応していません。アメリカの夏時間のルールに従っているため、他の地域で使用する場合は適切に変更する必要があります。
Chatgpt
こんな感じで一発で出せました。ただこれだと、TimeLocal()を使っているのでPCの時間を取得しているんだよね。
なのでこれを
バックテストで使えるようにするには?
上記の
isDST()
関数をバックテストで使用する場合、現在の日時ではなく過去の日時を取得する必要があります。バックテスト中に現在の日時を取得するには、
TimeCurrent()
関数を使用します。また、テスト中であることを確認するには、IsTesting()
関数を使用します。以下は、バックテスト中に過去の日時を取得して夏時間の期間を判定する
ChatgptisDST()
関数の例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
bool isDST(datetime dateTime) { int year = TimeYear(dateTime); int month = TimeMonth(dateTime); int day = TimeDay(dateTime); int dayOfWeek = TimeDayOfWeek(dateTime); int hours = TimeHour(dateTime); if (month < 3 || month > 11) { return false; } if (month > 3 && month < 11) { return true; } // US DST starts at 2:00 am on the second Sunday in March if (month == 3) { int dstStart = 14 - dayOfWeek; if (day >= dstStart) { return true; } else { return false; } } // US DST ends at 2:00 am on the first Sunday in November if (month == 11) { int dstEnd = 7 - dayOfWeek; if (day < dstEnd) { return true; } else { return false; } } return false; } void OnTick() { if (IsTesting()) { // バックテスト中であれば、現在の日時ではなく過去の日時を取得する datetime now = Time[0]; if (isDST(now)) { // 夏時間の期間内の処理 } else { // 夏時間の期間外の処理 } } else { // リアルタイムトレードの場合の処理 if (isDST(TimeLocal())) { // 夏時間の期間内の処理 } else { // 夏時間の期間外の処理 } } } |
あとはこれを使って気に入らなければChatgptに書いてもらうを繰り返すことでいつの間にかEAが完成しているのである(おわり)
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…