Bitcoin 裁定取引と自動取引 abitra.netのブログ

Bitcoinの自動売買のあれこれ

MQL4(MT4) 夏時間、冬時間をバックテストで反映させる。プログラムである程度自動だけど計算方式は手動。

バイナリーオプションの自動売買でバックテストで集計していて重要になってくるのが時間帯。
FXの場合も時間帯である程度特徴が表れると考えられるがバイナリーオプションはさらに顕著かなーと。

バイナリーはエントリーはいつでも出来るけど締めが決まっているので時間帯の勝率計算は重要。

ただ今までは正直夏、冬のどちらか一方で諦めてましたw 時差7時間に統一して集計していた感じ。
本当はあかんのでしょうけど勝率100%ってのは絶対ないし、ある程度勝率が高ければOKでしょ。1時間のズレやし。って感じ。

ですが先日バイナリーオプションの師匠から日本時間の特定のある足の勝率はどう?って感じの事を言われたので検証してみました。

ある時間のある足は1日に一回しかないので夏時間、冬時間を計算してやる必要があります。

バックテストで夏時間冬時間を反映させる方法を検索しても中々見つからない中で力ずくで夏時間を判定している方がおり参考にさせて頂きました。
"MT4のEAバックテストでサマータイムを正確に計算する"
https://auto-ts.net/archives/1926

力ずくと書いていますが個人的に好きな方法です。一発で何やってるか分かるし他に方法なさそうやんし、しゃーないやんw
(でも他に良い方法あればこっそり教えて下さいw)

datetime time_x = 25200; // 7*60*60 7時間後(冬)の設定,  21600 6*60*60 時間後(夏)の設定


bool IsSummerTime(){
   //3月第2日曜日午前2時〜11月第1日曜日午前2時
   switch(Year()){
      case 2005: if(StringToTime("2005.3.13")<= Time[0] && Time[0] <=StringToTime("2005.11.6"))time_x = 21600; break;
      case 2006: if(StringToTime("2006.3.12")<= Time[0] && Time[0] <=StringToTime("2006.11.5"))time_x = 21600; break;
      case 2007: if(StringToTime("2007.3.11")<= Time[0] && Time[0] <=StringToTime("2007.11.4"))time_x = 21600; break;
      case 2008: if(StringToTime("2008.3.9") <= Time[0] && Time[0] <=StringToTime("2008.11.2"))time_x = 21600; break;
      case 2009: if(StringToTime("2009.3.8") <= Time[0] && Time[0] <=StringToTime("2009.11.1"))time_x = 21600; break;
      case 2010: if(StringToTime("2010.3.14")<= Time[0] && Time[0] <=StringToTime("2010.11.7"))time_x = 21600; break;
      case 2011: if(StringToTime("2011.3.13")<= Time[0] && Time[0] <=StringToTime("2011.11.6"))time_x = 21600; break;
      case 2012: if(StringToTime("2012.3.11")<= Time[0] && Time[0] <=StringToTime("2012.11.4"))time_x = 21600; break;
      case 2013: if(StringToTime("2013.3.10")<= Time[0] && Time[0] <=StringToTime("2013.11.3"))time_x = 21600; break;
      case 2014: if(StringToTime("2014.3.9") <= Time[0] && Time[0] <=StringToTime("2014.11.2"))time_x = 21600; break;
      case 2015: if(StringToTime("2015.3.8") <= Time[0] && Time[0] <=StringToTime("2015.11.1"))time_x = 21600; break;
      case 2016: if(StringToTime("2016.3.13")<= Time[0] && Time[0] <=StringToTime("2016.11.6"))time_x = 21600; break;
      case 2017: if(StringToTime("2017.3.12")<= Time[0] && Time[0] <=StringToTime("2017.11.5"))time_x = 21600; break;
      case 2018: if(StringToTime("2018.3.11")<= Time[0] && Time[0] <=StringToTime("2018.11.4"))time_x = 21600; break;
      case 2019: if(StringToTime("2019.3.10")<= Time[0] && Time[0] <=StringToTime("2019.11.3"))time_x = 21600; break;
      case 2020: if(StringToTime("2020.3.8") <= Time[0] && Time[0] <=StringToTime("2020.11.1"))time_x = 21600; break;
      case 2021: if(StringToTime("2021.3.14")<= Time[0] && Time[0] <=StringToTime("2021.11.7"))time_x = 21600; break;
      case 2022: if(StringToTime("2022.3.13")<= Time[0] && Time[0] <=StringToTime("2022.11.6"))time_x = 21600; break;
      case 2023: if(StringToTime("2023.3.12")<= Time[0] && Time[0] <=StringToTime("2023.11.5"))time_x = 21600; break;
      case 2024: if(StringToTime("2024.3.10")<= Time[0] && Time[0] <=StringToTime("2024.11.3"))time_x = 21600; break;
      case 2025: if(StringToTime("2025.3.9") <= Time[0] && Time[0] <=StringToTime("2025.11.2"))time_x = 21600; break;
      case 2026: if(StringToTime("2026.3.8") <= Time[0] && Time[0] <=StringToTime("2026.11.1"))time_x = 21600; break;
      case 2027: if(StringToTime("2027.3.14")<= Time[0] && Time[0] <=StringToTime("2027.11.7"))time_x = 21600; break;
      case 2028: if(StringToTime("2028.3.12")<= Time[0] && Time[0] <=StringToTime("2028.11.5"))time_x = 21600; break;
      case 2029: if(StringToTime("2029.3.11")<= Time[0] && Time[0] <=StringToTime("2029.11.4"))time_x = 21600; break;
      case 2030: if(StringToTime("2030.3.10")<= Time[0] && Time[0] <=StringToTime("2030.11.3"))time_x = 21600; break;
      case 2031: if(StringToTime("2031.3.9") <= Time[0] && Time[0] <=StringToTime("2031.11.2"))time_x = 21600; break;
      case 2032: if(StringToTime("2032.3.14")<= Time[0] && Time[0] <=StringToTime("2032.11.7"))time_x = 21600; break;
      case 2033: if(StringToTime("2033.3.13")<= Time[0] && Time[0] <=StringToTime("2033.11.6"))time_x = 21600; break;
      case 2034: if(StringToTime("2034.3.12")<= Time[0] && Time[0] <=StringToTime("2034.11.5"))time_x = 21600; break;
      case 2035: if(StringToTime("2035.3.11")<= Time[0] && Time[0] <=StringToTime("2035.11.4"))time_x = 21600; break;
      case 2036: if(StringToTime("2036.3.9") <= Time[0] && Time[0] <=StringToTime("2036.11.2"))time_x = 21600; break;
      case 2037: if(StringToTime("2037.3.8") <= Time[0] && Time[0] <=StringToTime("2037.11.1"))time_x = 21600; break;
      case 2038: if(StringToTime("2038.3.14")<= Time[0] && Time[0] <=StringToTime("2038.11.7"))time_x = 21600; break;
   }
   return false;
}

やってることは単純。
ベースに7時間設定して特定の期間(夏時間)は6時間を返しているだけw
※時間を返しているのはCSVに日本時間を書き込んだり色々するため。単純な判断であれば0,1でOKかな。

ほぼブログ記事のコピーです。
記事を有難う。