//+------------------------------------------------------------------+ //| ATR-GSV-exp.mq4 | //| Nick Bilak, beluck[AT]gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, Nick Bilak" #property link "http://www.mql4.info/" #include extern int expertId = 1; extern int TakeProfit=800; extern int StopLoss=60; extern bool FixedLot = true; //trigger to use MM extern double Lots = 1.0; extern double MinLot = 0.1; //minimum lot size extern double MaximumRisk = 3; //% risk. lot size will be calculated so that stoploss was equal to risk% of balance extern int LotRound = 1; //round to this number of decimals extern bool UseATR = true; extern bool UseGSV = false; extern int ATRBreakoutPeriod=2; extern int GSVBreakoutPeriod=4; extern double ATRPercentLong=20; extern double ATRPercentShort=10; extern double GSVPercentLong=150; extern double GSVPercentShort=120; extern bool UseATRfilter = true; extern int ATRfilterTF=PERIOD_D1; extern int ATRfilterPeriod=2; extern int ATRfilterBars=3; extern bool UseSMA = true; extern int SMAPeriod=200; extern bool UseRSI = true; extern int RSIPeriod=2; extern int RSIbelow=5; extern int RSIabove=95; extern int ExitHours=0; //0 - close of current bar extern bool Dayofweek_Monday=True; extern bool Dayofweek_Tueday=False; extern bool Dayofweek_Wednesday=False; extern bool Dayofweek_Thurday=True; extern bool Dayofweek_Friday=False; extern int slippage=3; //slippage for market order processing extern int OrderTriesNumber=2; //to repeate sending orders when got some error extern string EAName="ATR-GSV"; bool buysig,sellsig,closebuy,closesell; int lastsig,lastsigb,lastsigs,tries,co; double gsvb1,gsvs1,atr1,ag; void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; CheckForSignals(); co=CalculateCurrentOrders(); if (co>0) CheckForClose(); co=CalculateCurrentOrders(); CheckForOpen(); } //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders() { int ord; //---- for(int i=0;i0 && Time[0]-lastsig>=(ExitHours+1)*60*60) { closebuy=true; closesell=true; } if (DayOfWeek()==1 && !Dayofweek_Monday) return; if (DayOfWeek()==2 && !Dayofweek_Tueday) return; if (DayOfWeek()==3 && !Dayofweek_Wednesday) return; if (DayOfWeek()==4 && !Dayofweek_Thurday) return; if (DayOfWeek()==5 && !Dayofweek_Friday) return; //indicators variables //iGSV(int period, int mode, int shift) { gsvb1 = iGSV(GSVBreakoutPeriod, 1, 1); gsvs1 = iGSV(GSVBreakoutPeriod, -1, 1); atr1 = iATR(NULL,0,ATRBreakoutPeriod,1); double rsi1=iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,1); double rsi2=iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,2); double sma1=iMA(NULL,0,SMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); double atrf[],minatrf=999999; ArrayResize(atrf,ATRfilterBars); for (int i=0; i0) minatrf = MathMin(minatrf,atrf[i]); } if ((!UseSMA || Close[1]>sma1) && (!UseRSI || (rsi1rsi2 && rsi1>RSIabove)) && (!UseATRfilter || atrf[0]0 && (closebuy || closesell) ) { RemovePendings(); co=CalculateCurrentOrders(); } //---- sell conditions if(sellsig) { if (co==0 && lastsigs!=Time[0]) { //res = OpenAtMarket(OP_SELL,LotsRisk(StopLoss)); dl=0.001; if (UseATR) dl=Open[0]-atr1*ATRPercentShort/100.0; if (UseGSV) dl=Open[0]-gsvs1*GSVPercentShort/100.0; res = OpenStop(OP_SELLSTOP,LotsRisk(StopLoss), dl, StopLoss, TakeProfit); if (res>0) { lastsigs=Time[0]; lastsig=Time[0]; } } } //---- buy conditions if(buysig) { if (co==0 && lastsigb!=Time[0]) { //res = OpenAtMarket(OP_BUY,LotsRisk(StopLoss)); dh=9999; if (UseATR) dh=Open[0]+atr1*ATRPercentLong/100.0; if (UseGSV) dh=Open[0]+gsvs1*GSVPercentLong/100.0; res = OpenStop(OP_BUYSTOP,LotsRisk(StopLoss), dh, StopLoss, TakeProfit); if (res>0) { lastsigb=Time[0]; lastsig=Time[0]; } } } } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { bool bres; int tr; for(int i=0;i0) sl=openprice+SL*Point; if (TP>0) tp=openprice-TP*Point; col=Red; mail="sell stop at "+DoubleToStr(openprice,Digits); } else if (mode==OP_BUYSTOP) { if (prc>=Ask+stlev) openprice=prc; else openprice=Ask+stlev; if (SL>0) sl=openprice-SL*Point; if (TP>0) tp=openprice+TP*Point; col=Blue; mail="buy stop at "+DoubleToStr(openprice,Digits); } else return; Print(Ask," ",Bid," ",Symbol()," ",mode," ",lot," ",openprice," ",sl," ",tp," "); res=OrderSend(Symbol(),mode,lot,openprice,slippage,sl,tp,EAName+"_"+expertId,expertId,0,col); tries++; } if (res<=0) Print("Error opening pending order : ",ErrorDescription(GetLastError())); return(res); } bool CloseAtMarket(int ticket,double lot) { bool bres=false; int tr; tries=0; while (!bres && tries=shift; i--) { if (mode>0 && Open[i]>Close[i]) tr+=High[i]-Open[i]; if (mode<0 && Open[i]