年末年始以外にも応用可
年末年始はトレードしない機能を読者の方から作って欲しいと頼まれましたので早速作ってみました。
びっくりするぐらい簡単に実現できてしまいます。関数ではないので、サンプル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 = "--- New Year Trade -------------------------------------------"; extern int DecTradeEndDay = 24; extern int JanTradeStartDay = 8; //+------------------------------------------------------------------+ //| グローバル変数 | //+------------------------------------------------------------------+ // 共通 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((Month() == 12 && Day() > DecTradeEndDay) || (Month() == 1 && Day() < JanTradeStartDay)){ 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回だけエントリーするわけではない場合は削除してください。
Month()はサーバの日付(月)を取得する標準関数で、Day()は日付(日)を取得する標準関数です。
DecTradeEndDayとJanTradeStartDayは共にEAのパラメータで、それぞれ年末のトレード終了日、年始のトレード開始日を表しています。このサンプルの場合、12/25~1/7の間はトレードしないことになります。
これを応用すれば、年末年始に限らず、任意の期間のトレードを停止することが可能です。それはぜひご自身でチャレンジしてみてください。