窓開けを避けるために週末に決済
通常、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をご覧ください。
