bleh
[mqlkit.git] / VolatilyScalp.mq4
blobe9a44713975abcf2da4bb502df392c60eac98ed7
1 //+------------------------------------------------------------------+\r
2 //|                        VolatilyScalp                             |\r
3 //|                                                                  |\r
4 //|                                                                  |\r
5 //+------------------------------------------------------------------+\r
6 #property copyright "Ch1qho"\r
7 #property link      "ch1qho@yahoo.com"\r
8 #define Magic        514\r
9 \r
11 //--------TradingTime--------\r
12 extern  string  Time_Info   = "Base on Server Time";\r
13 extern  int     OpenHour    = 22; \r
14 extern  int     CloseHour   = 5;\r
16 extern  bool    MM        = true;\r
17 extern  int     Risk      = 50;  \r
18 extern  double  Lots      = 0.1; \r
19 extern  int     LotsDigit   = 2;\r
20 extern  int     Slippage    = 3;\r
21 extern  int     StopLoss        = 60;\r
22 //------------------------------------\r
23 extern string   Atr_Info   ="Read my manual before apply spesific filter";\r
24 extern bool     TradeLowRangeDay=true;\r
25 extern bool     TradeOutSideBand=true;\r
26 extern  double  MaxDayAtr   =250;\r
27 //-------------------------------------\r
28 extern string   EquityInfo ="It is better to set amount target when running on multiple pair";\r
29 extern double   EquityTarget=0;\r
30 extern bool     SecureMyEquityTarget=false;\r
31 //----------------------------------------------------------------------------\r
32 extern  int     MaxTradePerBar    = 1;  \r
33 extern  int     MaxTradePerPosition = 4;\r
35 extern  string  EAName  ="Volatily Scalp";\r
36 extern  string  Typical ="Sideway, counter trend system";\r
37 extern  string  Creator ="Ch1qho";\r
38 extern  string  Distribution="Donation";\r
39 extern  string  Version ="VS_EURCHF D_01";\r
40 extern string   email_YM          = "ch1qho@yahoo.com";\r
42 //----------------------------------------------------------------------------\r
43 int            TradePerBar = 0;\r
45 //---------------------------------------------------------------------------- \r
50 bool allowtrading=true;\r
52 double diff=0;\r
53 bool allowbuy=true;\r
54 bool allowsell=true;\r
55 double SignalFilter=0;\r
56 double spread=0;\r
57 double mypoint=0.01;\r
58 int BarCount=0;\r
59 //+------------------------------------------------------------------+\r
60 //| expert initialization function                                   |\r
61 //+------------------------------------------------------------------+\r
62 int init()\r
63 {\r
64    if(Digits==3){\r
65       mypoint=0.01;\r
66       spread=MarketInfo(Symbol(),MODE_SPREAD)/10;\r
67    }else if(Digits==5){\r
68       mypoint=0.0001;\r
69       spread=MarketInfo(Symbol(),MODE_SPREAD)/10;\r
70    }else{\r
71       mypoint=Point;\r
72       spread=MarketInfo(Symbol(),MODE_SPREAD);\r
73    }\r
74 }\r
75  \r
76 int start()\r
77 {\r
78 if(GetLastError()>1)Sleep(1000);// May this delay help to run on multiple pair \r
80 if(SecureMyEquityTarget&&EquityTarget>0&&AccountEquity()>=EquityTarget){\r
81    ForceCloseAll(Magic,OP_BUY);\r
82    ForceCloseAll(Magic,OP_SELL);\r
83    allowbuy=false;\r
84    allowsell=false;\r
85 }\r
87 double speed1=iCustom(Symbol(),0,"CK_Speed",20,50,2,0);\r
88 double speed2=iCustom(Symbol(),0,"CK_Speed",20,25,2,1);\r
89 double speed3=iCustom(Symbol(),0,"CK_Speed",5,50,0,1);\r
90 double speed4=iCustom(Symbol(),0,"CK_Speed",5,50,1,1);\r
91 double kcup=iCustom(Symbol(),0,"Keltner Channels",20,2,0,0);//1st upper\r
92 double kcdo=iCustom(Symbol(),0,"Keltner Channels",20,2,2,0);//1st lower\r
93 double kcup2=iCustom(Symbol(),0,"Keltner Channels",20,2,3,0);//2nd upper\r
94 double kcdo2=iCustom(Symbol(),0,"Keltner Channels",20,2,4,0);//2nd lower\r
95 double up1=iBands(Symbol(),0,20,2,0,PRICE_MEDIAN,MODE_UPPER,1);\r
96 double do1=iBands(Symbol(),0,20,2,0,PRICE_MEDIAN,MODE_LOWER,1);\r
97 double wpr1=iWPR(Symbol(),1,20,0);\r
98 double ma=iMA(Symbol(),0,20,0,0,PRICE_MEDIAN,0);\r
100 double sp1=spread*2;\r
101 double atrfilter=iATR(Symbol(),0,20,1)/mypoint;\r
103 SignalFilter=MathMax(atrfilter,spread*2);//this is for averaging level\r
104 if(BarCount != Bars){\r
105   TradePerBar = 0;\r
106   BarCount = Bars;\r
108 if(TotalOrder(Magic,OP_BUY)==MaxTradePerPosition)allowbuy=false;\r
109 if(TotalOrder(Magic,OP_SELL)==MaxTradePerPosition)allowsell=false;\r
110 if(speed2==1&&speed1==1){\r
111 //allowbuy=false;\r
112 //allowsell=false;\r
113 //ForceCloseAll(Magic,OP_BUY);\r
114 //ForceCloseAll(Magic,OP_SELL);\r
116 /*\r
117    No matter price accross ma or not, but wpr of 1 Minute show overbought/oversold\r
118 */\r
119 if(wpr1>-20){\r
120    if(TotalProfit(Magic,OP_BUY)>=SignalFilter){\r
121       ForceCloseAll(Magic,OP_BUY);//profit Accumulation first, if rich we close all same position\r
122       if(Close[0]<ma)allowbuy=false;\r
123   }\r
124   // CloseProfitOrder(Magic,OP_BUY,atrfilter,1,30000000);//otherwise, an open position has profit as much current atrfilter, close it.\r
126 if(wpr1<-80){\r
127  if(TotalProfit(Magic,OP_SELL)>=SignalFilter){\r
128    ForceCloseAll(Magic,OP_SELL);//profit Accumulation first, if rich we close all same position\r
129    if(Close[0]>ma)allowsell=false;\r
130  }\r
131   // CloseProfitOrder(Magic,OP_SELL,atrfilter,1,30000000);//otherwise, an open position has profit as much current atrfilter, close it.\r
134 /*\r
135    only if price accross ma\r
136 */\r
138 if(speed1==1){\r
139 if(Close[0]>ma){\r
140 ForceCloseAll(Magic,OP_BUY);\r
141 //   if(TotalProfit(Magic,OP_BUY)>=1)ForceCloseAll(Magic,OP_BUY);//profit Accumulation first, if rich we close all same position\r
142    //CloseProfitOrder(Magic,OP_BUY,1,1,30000000);//otherwise, an open position has profit as much 1 pips, close it.\r
145 if(Close[0]<ma){\r
146 ForceCloseAll(Magic,OP_SELL);\r
147   // if(TotalProfit(Magic,OP_SELL)>=1)ForceCloseAll(Magic,OP_SELL);\r
148   // CloseProfitOrder(Magic,OP_SELL,1,1,30000000);\r
151 if(Close[0]>kcup&&speed4==2){\r
152    ForceCloseAll(Magic,OP_BUY);\r
153    ForceCloseAll(Magic-1,OP_BUY);\r
155 //CloseProfitOrder(Magic,OP_BUY,-5,1,30000000);//we shoud make profit just after price accross ma\r
156 if(Close[0]<kcdo&&speed4==2){\r
157    ForceCloseAll(Magic,OP_SELL);\r
158    ForceCloseAll(Magic-1,OP_SELL);\r
160 if(Close[0]>kcup2){\r
161    ForceCloseAll(Magic,OP_BUY);\r
162    ForceCloseAll(Magic-1,OP_BUY);\r
164 //CloseProfitOrder(Magic,OP_BUY,-5,1,30000000);//we shoud make profit just after price accross ma\r
165 if(Close[0]<kcdo2){\r
166    ForceCloseAll(Magic,OP_SELL);\r
167    ForceCloseAll(Magic-1,OP_SELL);\r
169 //CloseProfitOrder(Magic,OP_SELL,-5,1,30000000);//we shoud make profit just after price accross ma\r
171 // choose your exit strategi after trading time has been passed\r
172 if(Tradetime()==0){\r
173 allowbuy=true;\r
174 allowsell=true;\r
175    if(TotalProfit(Magic,OP_BUY)>=1)ForceCloseAll(Magic,OP_BUY);\r
176    if(TotalProfit(Magic,OP_SELL)>=1)ForceCloseAll(Magic,OP_SELL);\r
179    \r
180    int            BUY_OpenPosition     = 0;\r
181    int            SELL_OpenPosition    = 0;\r
182    int            TOTAL_OpenPosition   = 0;\r
183    int            Ticket               = -1;\r
184    int            cnt                  = 0;\r
185    double         Last_BUY_OpenPrice   =0;\r
186    double         Last_SELL_OpenPrice   =0;\r
187    for (cnt = 0; cnt < OrdersTotal(); cnt++) \r
188    {\r
189       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);\r
190       if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderCloseTime()==0) \r
191       {\r
192          TOTAL_OpenPosition++;\r
193          if (OrderType() == OP_BUY) \r
194          {\r
195             BUY_OpenPosition++;\r
196             Last_BUY_OpenPrice = OrderOpenPrice();\r
197          }\r
198          if (OrderType() == OP_SELL) \r
199          {\r
200             SELL_OpenPosition++;\r
201             Last_SELL_OpenPrice = OrderOpenPrice();\r
202          }\r
203       }\r
204    }\r
205    \r
206  \r
207  \r
208   //////////////////////////////// //////////////////////////////////////////////////////////////////////////////////\r
209    if (Tradetime()==1){\r
210      if(AccountFreeMarginCheck(Symbol(),OP_BUY,GetLots())<=0 || GetLastError()==134)  {\r
211                  Print("Not Enough Money ");\r
212                  return(0);\r
213       }  \r
214       RefreshRates();\r
215   //////////////////////////////// //////////////////////////////////////////////////////////////////////////////////\r
216          if ((allowsell&&SELL_OpenPosition < MaxTradePerPosition)  && (TradePerBar < MaxTradePerBar) && ((Ask - Last_SELL_OpenPrice >= SignalFilter * mypoint) || SELL_OpenPosition < 1 ) && GetSignal(OP_SELL)==1){\r
217             Ticket = OrderSend(Symbol(),OP_SELL,GetLots(),Bid,Slippage,Bid + StopLoss * mypoint,0,"Volatily Scalp"+Symbol(),Magic,0,Red); \r
218               if (Ticket > 0) {\r
219                      TradePerBar++;\r
220                }\r
221                \r
222             \r
223           }\r
224      //////////////////////////////// //////////////////////////////////////////////////////////////////////////////////\r
225           if ((allowbuy&&BUY_OpenPosition < MaxTradePerPosition)  && (TradePerBar < MaxTradePerBar) && ((Last_BUY_OpenPrice - Bid >= SignalFilter * mypoint ) || BUY_OpenPosition < 1 ) && GetSignal(OP_BUY)==1){\r
226                             Ticket = OrderSend(Symbol(),OP_BUY,GetLots(),Ask,Slippage,Ask - StopLoss * mypoint, 0,"Volatily Scalp"+Symbol(),Magic,0,Blue); \r
227                   if (Ticket > 0) {\r
228                    \r
229                      TradePerBar++;\r
230                    \r
231                    }\r
232            }\r
233     }\r
234  /////////////////////locking funtion\r
236   return(0);\r
237 \r
239 //----------------------------------------------------------------------------- \r
240 int GetSignal(int OP)\r
242 int sideway =GetSignal3();\r
243 if(sideway==0)return(0);\r
245 double up=iBands(Symbol(),0,20,2,0,PRICE_MEDIAN,MODE_UPPER,0);\r
246 double do=iBands(Symbol(),0,20,2,0,PRICE_MEDIAN,MODE_LOWER,0);\r
247 /*\r
248 //Historical template, firs time i use fix envelopes \r
249 */\r
250 double evup=iEnvelopes(Symbol(),0,20,0,0,PRICE_MEDIAN,0.2,MODE_UPPER,0);\r
251 double evdo=iEnvelopes(Symbol(),0,20,0,0,PRICE_MEDIAN,0.2,MODE_LOWER,0);\r
253 double wpr=iWPR(Symbol(),0,20,0);\r
254 double wpr1=iWPR(Symbol(),1,20,0);\r
255 double ma=iMA(Symbol(),0,20,0,0,PRICE_MEDIAN,0);\r
257 double kcup=iCustom(Symbol(),0,"Keltner Channels",20,2,3,0);\r
258 double kcdo=iCustom(Symbol(),0,"Keltner Channels",20,2,4,0);\r
260 if (OP==OP_BUY) {\r
261    //if(wpr1<-80&&Bid<do&&do>evdo)return(1);\r
262    if (wpr1<-80&&Bid<=ma-(SignalFilter)*mypoint&&(Bid>do||Bid>kcdo)) return(1);//as long price not penetrate both bband and channel, go ahead\r
264 else if (OP==OP_SELL){\r
265    //if(wpr1>-20&&Bid>up&&up<evup)return(1);\r
266    if (wpr1>-20&&Bid>=ma+(SignalFilter)*mypoint&&(Bid<up||Bid<kcup)) return(1);//as long price not penetrate both bband and channel, go ahead\r
268 return(0);\r
270 //---------------------------------------------------------------------------------\r
272 //----------------------------------------------------------------------------- \r
273 int GetSignal3()\r
277 double bbup=iBands(Symbol(),1440,20,2,0,PRICE_MEDIAN,MODE_UPPER,1);\r
278 double bbdo=iBands(Symbol(),1440,20,2,0,PRICE_MEDIAN,MODE_LOWER,1);\r
279 double dailyatr=iATR(Symbol(),1440,5,0)/mypoint;\r
281 double speed1=iCustom(Symbol(),0,"CK_Speed",20,50,0,0);\r
282 double speed2=iCustom(Symbol(),0,"CK_Speed",20,50,0,1);\r
283 double speed5=iCustom(Symbol(),0,"CK_Speed",5,50,0,0);\r
284 double speed6=iCustom(Symbol(),0,"CK_Speed",20,50,2,1);\r
285 double speed3=iCustom(Symbol(),0,"CK_Speed",5,50,0,0);\r
286 double speed4=iCustom(Symbol(),0,"CK_Speed",5,50,0,1);\r
288 double range=(iHigh(Symbol(),1440,1)-iLow(Symbol(),1440,1))/mypoint;\r
290 if(SignalFilter>=StopLoss) return(0);\r
292 if(dailyatr>=MaxDayAtr)return(0);\r
294 if(!TradeOutSideBand) if(iClose(Symbol(),1440,1)>bbup||iClose(Symbol(),1440,1)<bbdo)return(0);\r
296 if(!TradeLowRangeDay)if(range<(dailyatr/2))return(0);\r
298    if(speed1==0&&speed2==0&&speed3==0&&speed4==0)return(1);\r
299 return(0);\r
301 //---------------------------------------------------------------------------------\r
303 //----------------------------------------------------------------------------- \r
305 //----------------------------------------------------------------------------- \r
306 void ForceCloseAll(int magic, int cmd) \r
307 \r
308    for (int cnt = OrdersTotal()-1 ; cnt >= 0; cnt--) \r
309    { \r
310       OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); \r
311       if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic && OrderCloseTime()==0) \r
312       { \r
313             if(OrderType()==cmd)  {\r
314                OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Blue); \r
315              }\r
316            \r
317       } \r
318    } \r
320 //----------------------------------------------------------------------------- \r
321 int Tradetime() \r
323    int TradingTime=0;\r
324   if(OpenHour>CloseHour){\r
325      if (Hour() <= CloseHour || Hour() >= OpenHour)TradingTime=1;\r
326    }\r
327    if(OpenHour<CloseHour){\r
328       if(Hour()>=OpenHour&&Hour()<=CloseHour)TradingTime=1;\r
329    }\r
330    if(OpenHour==CloseHour){\r
331       if(Hour()==OpenHour)TradingTime=1;\r
332    }\r
333    if (DayOfWeek() == 5 && Hour() >8)TradingTime=0;//No friday trade\r
334    if  (DayOfWeek()==1&&Hour()<2)TradingTime=0;//No trade for first 2 hours on Monday\r
335    if(DayOfYear()<7)TradingTime=0;//No Trade First week of Year \r
336    if(Month()==12&&Day()>20)TradingTime=0;//No trade after 20 December\r
337    return(TradingTime); \r
339 //----------------------------------------------------------------------------- \r
341 double GetLots() \r
343    double lots,MD,RM,FMM,MinLots,LotSize; int lotsdigit;\r
344    LotSize = MarketInfo(Symbol(), MODE_LOTSIZE);\r
345    MD = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); \r
346    RM = NormalizeDouble(MarketInfo(Symbol(), MODE_MARGINREQUIRED), 4);\r
347    FMM = (RM+5)*100;\r
348    if(LotsDigit==0)\r
349    {\r
350       if (MD==0.01) lotsdigit=2;\r
351       else lotsdigit=1;\r
352       LotsDigit=lotsdigit;\r
353    }\r
354    if (MM==true) lots = NormalizeDouble((AccountFreeMargin()*Risk/LotSize)/MaxTradePerPosition,LotsDigit);\r
355    else lots=Lots;\r
356    MinLots=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);\r
357    double MaxLots =NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);   \r
358    //if (LotsDigit == 2) MinLots = 0.01; \r
359    if (lots < MinLots) lots = MinLots;  \r
360    if (lots > MaxLots) lots = MaxLots;     \r
361    return (lots);      \r
363 //----------------------------------------------------------------------------- \r
365 //----------------------------------------------------------------------------- \r
367 //----------------------------------------------------------------------------- \r
368 /*\r
369    int magic= magicn umber\r
370    int cmd= OP_BUY or OP_SELL\r
371    int target= Target for profit in pip\r
372    double diff=Minimum Minute in Market\r
373    double diff=Maximum Minute in Market\r
374    \r
375 */\r
376 bool CloseProfitOrder(int magic, int cmd, int target, double diff, double diff2){\r
377    bool result=false;\r
378    int todelete=0;\r
379    for(int i=OrdersTotal()-1;i>=0;i--){\r
380    int profit=0;\r
381       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){\r
382          if(OrderType()==cmd&&OrderMagicNumber()==magic&&OrderSymbol()==Symbol()){\r
383             if(OrderType()==OP_BUY){\r
384                profit=(OrderClosePrice()-OrderOpenPrice())/mypoint;\r
385              }\r
386             if(OrderType()==OP_SELL){\r
387                profit=(OrderOpenPrice()-OrderClosePrice())/mypoint;\r
388              }\r
389             if(profit>=target&& (TimeCurrent()-OrderOpenTime())>=diff*60&&(TimeCurrent()-OrderOpenTime())<=diff2*60){\r
390                result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(OrderClosePrice(),Digits),3,CLR_NONE);\r
391                  \r
392             }\r
393             \r
394          }\r
395       }\r
396    }\r
397    return(result);\r
399 ////////////////////////////////////////////////////////////////////////////////////////////////\r
400 /*\r
401    return value= TotalProfit int pips\r
402 */\r
403 int TotalProfit(int magic,int cmd){\r
404    int result=0;\r
405    double harga1;\r
406    for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)\r
407         {\r
408          OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);\r
409          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic)\r
410            {\r
411             if(cmd==OP_BUY&&cmd==OrderType()){\r
412                result=result+((OrderClosePrice()-OrderOpenPrice())/mypoint);\r
413             }\r
414             if(cmd==OP_SELL&&cmd==OrderType()){\r
415                result=result+((OrderOpenPrice()-OrderClosePrice())/mypoint);\r
416             }  \r
417            }\r
418          }\r
419   return(result);   \r
422 int TotalOrder(int magic,int cmd){\r
423    int result=0;\r
424    \r
425    for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)\r
426         {\r
427          OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);\r
428          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic)\r
429            {\r
430             if(cmd==OrderType()){\r
431                result++;\r
432             }\r
433             \r
434            }\r
435          }\r
436   return(result);   \r