日付や時刻のフィルターと組み合わせるとバリエーション豊かに
年末年始や時刻での仕掛けフィルターを作ってきましたので、ついでに曜日のフィルター機能も紹介します。
こちらも簡単に実現できてしまいます。関数ではないので、サンプルEAを直接載せておきます。
//+------------------------------------------------------------------+
//| Sample.mq4 |
//| Copyright (c) 2015, りゅーき |
//| https://autofx100.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2015, りゅーき"
#property link "https://autofx100.com/"
#property version "1.00"
//+------------------------------------------------------------------+
//| ライブラリ |
//+------------------------------------------------------------------+
#include <stderror.mqh>
#include <stdlib.mqh>
#include <WinUser32.mqh>
#include <Original/Basic.mqh>
#include <Original/DateAndTime.mqh>
#include <Original/LotSizing.mqh>
#include <Original/OrderHandle.mqh>
#include <Original/OrderReliable.mqh>
//+------------------------------------------------------------------+
//| EAパラメータ設定情報 |
//+------------------------------------------------------------------+
extern string Note01 = "=== General ==================================================";
extern int MagicNumber = 7777777;
extern int SlippagePips = 5;
extern string Comments = "";
extern double FixLotSize = 0.01;
extern string Note02 = "=== Entry ====================================================";
extern string Note02_1 = "--- DayOfWeek Trade ------------------------------------------";
extern bool Monday = true;
extern bool Tuesday = true;
extern bool Wednesday = true;
extern bool Thursday = true;
extern bool Friday = true;
//+------------------------------------------------------------------+
//| グローバル変数 |
//+------------------------------------------------------------------+
// 共通
double gPipsPoint = 0.0;
int gSlippage = 0;
color gArrowColor[6] = {Blue, Red, Blue, Red, Blue, Red}; //BUY: Blue, SELL: Red
int gPrvBars = 0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
gPipsPoint = currencyUnitPerPips(Symbol());
gSlippage = getSlippage(Symbol(), SlippagePips);
gPrvBars = Bars;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int currentBars = Bars;
// -----------------------------------------------------------------
// 仕掛けフィルター
// -----------------------------------------------------------------
// 新しい足を生成した時ではない場合は、仕掛けない
if(currentBars == gPrvBars){
gPrvBars = currentBars;
return;
}
// 指定曜日は、仕掛けない
if((DayOfWeek() == 1 && Monday == false) ||
(DayOfWeek() == 2 && Tuesday == false) ||
(DayOfWeek() == 3 && Wednesday == false) ||
(DayOfWeek() == 4 && Thursday == false) ||
(DayOfWeek() == 5 && Friday == false)){
gPrvBars = currentBars;
return;
}
// -----------------------------------------------------------------
// 仕掛け
// -----------------------------------------------------------------
// 成行注文
int ticket = orderSendReliable(Symbol(), OP_BUY, FixLotSize, Ask, gSlippage, 0.0, 0.0, Comments, MagicNumber, 0, gArrowColor[OP_BUY]);
// 本来はticketの値によって後続の処理を制御する必要があるが、簡単のため、ここでは無視
gPrvBars = currentBars;
}
1本の足で1回だけエントリーする機能も混ざっていますが(仕掛けフィルターの1つ目のブロック)、ティックごとにエントリーするのを避けるためだけに入れていますので、無視してください。
仕掛けフィルターの2つ目のブロックが指定曜日のみトレードする機能の本体部分です。なお、gPrvBars = currentBars;は1本の足で1回だけエントリーする機能に必要な命令なので、1本の足で1回だけエントリーするわけではない場合は削除してください。
DayOfWeek()はサーバの曜日を取得する標準関数で、0が日曜で、それ以降、1(月)、2(火)・・・6(土)となります。
土日は元々トレードできませんから、月曜~金曜までで十分です。
各曜日のパラメータをtrueにすると、その曜日はトレードします。falseにすると、トレードしません。
