日付や時刻のフィルターと組み合わせるとバリエーション豊かに
年末年始や時刻での仕掛けフィルターを作ってきましたので、ついでに曜日のフィルター機能も紹介します。
こちらも簡単に実現できてしまいます。関数ではないので、サンプルEAを直接載せておきます。
001 | //+------------------------------------------------------------------+ |
002 | //| Sample.mq4 | |
003 | //| Copyright (c) 2015, りゅーき | |
004 | //| https://autofx100.com/ | |
005 | //+------------------------------------------------------------------+ |
006 | #property copyright "Copyright (c) 2015, りゅーき" |
007 | #property link "https://autofx100.com/" |
008 | #property version "1.00" |
009 |
010 | //+------------------------------------------------------------------+ |
011 | //| ライブラリ | |
012 | //+------------------------------------------------------------------+ |
013 | #include <stderror.mqh> |
014 | #include <stdlib.mqh> |
015 | #include <WinUser32.mqh> |
016 | #include <Original/Basic.mqh> |
017 | #include <Original/DateAndTime.mqh> |
018 | #include <Original/LotSizing.mqh> |
019 | #include <Original/OrderHandle.mqh> |
020 | #include <Original/OrderReliable.mqh> |
021 |
022 | //+------------------------------------------------------------------+ |
023 | //| EAパラメータ設定情報 | |
024 | //+------------------------------------------------------------------+ |
025 | extern string Note01 = "=== General ==================================================" ; |
026 | extern int MagicNumber = 7777777; |
027 | extern int SlippagePips = 5; |
028 | extern string Comments = "" ; |
029 | extern double FixLotSize = 0.01; |
030 |
031 | extern string Note02 = "=== Entry ====================================================" ; |
032 | extern string Note02_1 = "--- DayOfWeek Trade ------------------------------------------" ; |
033 | extern bool Monday = true ; |
034 | extern bool Tuesday = true ; |
035 | extern bool Wednesday = true ; |
036 | extern bool Thursday = true ; |
037 | extern bool Friday = true ; |
038 |
039 | //+------------------------------------------------------------------+ |
040 | //| グローバル変数 | |
041 | //+------------------------------------------------------------------+ |
042 | // 共通 |
043 | double gPipsPoint = 0.0; |
044 | int gSlippage = 0; |
045 | color gArrowColor[6] = {Blue, Red, Blue, Red, Blue, Red}; //BUY: Blue, SELL: Red |
046 | int gPrvBars = 0; |
047 |
048 | //+------------------------------------------------------------------+ |
049 | //| Expert initialization function | |
050 | //+------------------------------------------------------------------+ |
051 | int OnInit() |
052 | { |
053 | gPipsPoint = currencyUnitPerPips(Symbol()); |
054 | gSlippage = getSlippage(Symbol(), SlippagePips); |
055 |
056 | gPrvBars = Bars; |
057 |
058 | return (INIT_SUCCEEDED); |
059 | } |
060 |
061 | //+------------------------------------------------------------------+ |
062 | //| Expert deinitialization function | |
063 | //+------------------------------------------------------------------+ |
064 | void OnDeinit( const int reason) |
065 | { |
066 | } |
067 |
068 | //+------------------------------------------------------------------+ |
069 | //| Expert tick function | |
070 | //+------------------------------------------------------------------+ |
071 | void OnTick() |
072 | { |
073 | int currentBars = Bars; |
074 |
075 | // ----------------------------------------------------------------- |
076 | // 仕掛けフィルター |
077 | // ----------------------------------------------------------------- |
078 | // 新しい足を生成した時ではない場合は、仕掛けない |
079 | if (currentBars == gPrvBars){ |
080 | gPrvBars = currentBars; |
081 | return ; |
082 | } |
083 |
084 | // 指定曜日は、仕掛けない |
085 | if ((DayOfWeek() == 1 && Monday == false ) || |
086 | (DayOfWeek() == 2 && Tuesday == false ) || |
087 | (DayOfWeek() == 3 && Wednesday == false ) || |
088 | (DayOfWeek() == 4 && Thursday == false ) || |
089 | (DayOfWeek() == 5 && Friday == false )){ |
090 | gPrvBars = currentBars; |
091 | return ; |
092 | } |
093 |
094 | // ----------------------------------------------------------------- |
095 | // 仕掛け |
096 | // ----------------------------------------------------------------- |
097 | // 成行注文 |
098 | int ticket = orderSendReliable(Symbol(), OP_BUY, FixLotSize, Ask, gSlippage, 0.0, 0.0, Comments, MagicNumber, 0, gArrowColor[OP_BUY]); |
099 |
100 | // 本来はticketの値によって後続の処理を制御する必要があるが、簡単のため、ここでは無視 |
101 |
102 | gPrvBars = currentBars; |
103 | } |
1本の足で1回だけエントリーする機能も混ざっていますが(仕掛けフィルターの1つ目のブロック)、ティックごとにエントリーするのを避けるためだけに入れていますので、無視してください。
仕掛けフィルターの2つ目のブロックが指定曜日のみトレードする機能の本体部分です。なお、gPrvBars = currentBars;は1本の足で1回だけエントリーする機能に必要な命令なので、1本の足で1回だけエントリーするわけではない場合は削除してください。
DayOfWeek()はサーバの曜日を取得する標準関数で、0が日曜で、それ以降、1(月)、2(火)・・・6(土)となります。
土日は元々トレードできませんから、月曜~金曜までで十分です。
各曜日のパラメータをtrueにすると、その曜日はトレードします。falseにすると、トレードしません。