日付や時刻のフィルターと組み合わせるとバリエーション豊かに
年末年始や時刻での仕掛けフィルターを作ってきましたので、ついでに曜日のフィルター機能も紹介します。
こちらも簡単に実現できてしまいます。関数ではないので、サンプル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にすると、トレードしません。