週末指定時刻決済と指定分前からの仕掛け中止

窓開けを避けるために週末に決済

通常、FX業者は土日休みのため、ポジションを翌週に持ち越すと、窓開けで手痛い思いをすることがあります。それがイヤなら、週末にポジションを仕切る必要があります。

そこで、週末の指定時刻にポジションを決済する機能を紹介します。この機能を実現するにあたって、週末指定時刻になったかどうかを判断する関数を作成します。

//+------------------------------------------------------------------+
//|【関数】週末指定時刻決済判断                                      |
//|                                                                  |
//|【引数】 IN OUT  引数名             説明                          |
//|        --------------------------------------------------------- |
//|         ○      aHour              週末決済の指定時刻(時)      |
//|         ○      aMinute            週末決済の指定時刻(分)      |
//|         ○      aIsJapanTime       サーバーが日本時刻ならtrue    |
//|                                                                  |
//|【戻値】true :決済する                                           |
//|        false:決済しない                                         |
//|                                                                  |
//|【備考】なし                                                      |
//+------------------------------------------------------------------+
bool isWeekendExit(int aHour, int aMinute, bool aIsJapanTime)
{
  int dayOfWeek = DayOfWeek();
  int crntTime  = Hour() * 100 + Minute();
  int exitTime  = aHour  * 100 + aMinute;

  // 週末決済の曜日・時刻か? ※サーバーが日本時刻の場合、週末が土曜日になることに注意
  if((aIsJapanTime == false && dayOfWeek == 5) || (aIsJapanTime && dayOfWeek == 6)){
    if(crntTime >= exitTime){
      return(true);
    }
  }

  return(false);
}

上記の関数を「DateAndTime.mqh」に追加しました。

aIsJapanTimeというフラグを引数で渡しているのは、コメントにも記載していますが、サーバーが日本時刻の場合、週末が金曜日ではなく土曜日になるため、週末が何曜日になるのか判断するためです。通常は、サーバーは海外時刻だと思いますので、false(金曜日)で問題ないと思います。

DayOfWeek()は曜日を取得する標準関数です。日曜日が0、月曜日が1、土曜日が6になります。また、時と分を4桁の数字に換算して、時刻の大小を比較しています。例えば、23時30分なら2330となります。

さて、基本的には上記の関数を使えば、週末での指定時刻による決済は可能になるわけですが、決済の直前に、たまたま仕掛け条件に合致してしまい、ポジションを持ってしまうこともあり得ます。そうすると、ほぼ間違いなく負けることになります。

それでは面白くないですから、週末決済の指定時刻より一定時間前からは仕掛けられないような仕組みが欲しくなります。というわけで、週末指定時刻決済の指定分前になったかどうかを判断する関数を作成します。

//+------------------------------------------------------------------+
//|【関数】週末指定時刻決済の指定分前からの仕掛け中止判断            |
//|                                                                  |
//|【引数】 IN OUT  引数名             説明                          |
//|        --------------------------------------------------------- |
//|         ○      aHour              週末決済の指定時刻(時)      |
//|         ○      aMinute            週末決済の指定時刻(分)      |
//|         ○      aIsJapanTime       サーバーが日本時刻ならtrue    |
//|         ○      aEntryStopTime     週末決済の指定時刻より        |
//|                                    aEntryStopTime分前から        |
//|                                    は仕掛けない                  |
//|                                                                  |
//|【戻値】true :仕掛け不可                                         |
//|        false:仕掛け可                                           |
//|                                                                  |
//|【備考】なし                                                      |
//+------------------------------------------------------------------+
bool isWeekendStopEntry(int aHour, int aMinute, bool aIsJapanTime, int aEntryStopTime)
{
  int crntDayOfWeek = DayOfWeek();
  int crntTime = Hour() * 100 + Minute();
  int exitTime = aHour  * 100 + aMinute;

  // 不具合予防のため、仕掛けない時間の遡りは最大1日までとする
  // ⇒全てのバリエーションを検討するのが面倒だし、検討する価値もない
  if(aEntryStopTime >= 1440){
    aEntryStopTime = 1440; // = 24h * 60m/h
  }

  datetime tmpTime  = StrToTime(aHour + ":" + aMinute) - aEntryStopTime * 60;
  int stopTime      = TimeHour(tmpTime) * 100 + TimeMinute(tmpTime);
  int stopDayOfWeek = TimeDayOfWeek(tmpTime);

  // 仕掛けを中止する曜日・時刻か?
  if(aIsJapanTime){
    // 仕掛けを止めるのが当日の土曜日か? ※一致するということは当日だということ
    if(crntDayOfWeek == stopDayOfWeek){
      if(crntDayOfWeek == 6 && crntTime >= stopTime){
        return(true);
      }
    // 仕掛けを止めるのが前日の金曜日か? ※一致しないということは前日に跨いだということ
    }else{
      if((crntDayOfWeek == 5 && crntTime >= stopTime) || crntDayOfWeek == 6){
        return(true);
      }
    }
  }else{
    // 仕掛けを止めるのが当日の金曜日か? ※一致するということは当日だということ
    if(crntDayOfWeek == stopDayOfWeek){
      if(crntDayOfWeek == 5 && crntTime >= stopTime){
        return(true);
      }
    // 仕掛けを止めるのが前日の木曜日か? ※一致しないということは前日に跨いだということ
    }else{
      if((crntDayOfWeek == 4 && crntTime >= stopTime) || crntDayOfWeek == 5){
        return(true);
      }
    }
  }

  return(false);
}

サンプルEA

具体的な使い方はサンプルEAをご覧ください。

「週末指定時刻決済と指定分前からの仕掛け中止」のSample.mq4
サイズ: 2.0KB
バージョン: 1.0
公開:2019年10月16日

MT4の無料プログラミング講座

LINE公式アカウントを友だち追加して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG