작업 종료됨
![](https://c.mql5.com/i/avatar/avatar_na2.png)
![](https://c.mql5.com/i/avatar/avatar_na2.png)
명시
Hi, I am trying to create an EA that trades by RSI divergence, I tried coding it as below but when I run it in backtest, the backtest ends in less than a second. I would like a functional EA based on this code that all I need was to change the numerical parameters to make it work for me. My trade logic is simple, I would like to be able to trend when the latest PeakPrice > last PeakPrice (note: latest doesn't have to be current, but last means the one before the latest) && rsi(latest_peak)<rsi(last_peak) and when the latest TroughPrice< last TroughPrice && rsi(latest_trough)>rsi(last_trough). It would be great if you can include Zigzag in finding the Peak and Trough. Attached is the technical indicators I would like my EA to base on (it didn't include a Zigzag though).
//+------------------------------------------------------------------+ //| RSI EA.mq4 | //| Copyright 2015, MetaQuotes Software Corp. | //| http://free-bonus-deposit.blogspot.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, dXerof" #property link "http://free-bonus-deposit.blogspot.com" #property version "1.00" #property strict #define arrowsDisplacement 0.0003 input bool OpenBUY=True; input bool OpenSELL=True; input bool CloseBySignal=True; input double StopLoss=0; input double TakeProfit=0; input double TrailingStop=0; input int RSIperiod=14; input double BuyLevel=30; input double SellLevel=70; input bool AutoLot=True; input double Risk=1; input double ManualLots=0.1; input int MagicNumber=123; input string Koment="RSIea"; input int Slippage=10; input ENUM_APPLIED_PRICE RSI_applied_price = 0; //---- buffers double rsi[]; //---- //--- int OrderBuy,OrderSell; int ticket; int LotDigits; double Trail,iTrailingStop; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); OrderBuy=0; OrderSell=0; for(int cnt=0; cnt<OrdersTotal(); cnt++) { if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderComment()==Koment) { if(OrderType()==OP_BUY) OrderBuy++; if(OrderType()==OP_SELL) OrderSell++; if(TrailingStop>0) { iTrailingStop=TrailingStop; if(TrailingStop<stoplevel) iTrailingStop=stoplevel; Trail=iTrailingStop*Point; double tsbuy=NormalizeDouble(Bid-Trail,Digits); double tssell=NormalizeDouble(Ask+Trail,Digits); if(OrderType()==OP_BUY && Bid-OrderOpenPrice()>Trail && Bid-OrderStopLoss()>Trail) { ticket=OrderModify(OrderTicket(),OrderOpenPrice(),tsbuy,OrderTakeProfit(),0,Blue); } if(OrderType()==OP_SELL && OrderOpenPrice()-Ask>Trail && (OrderStopLoss()-Ask>Trail || OrderStopLoss()==0)) { ticket=OrderModify(OrderTicket(),OrderOpenPrice(),tssell,OrderTakeProfit(),0,Blue); } } } } double rsim1=iRSI(Symbol(),1,RSIperiod,PRICE_CLOSE,1); double rsim5=iRSI(Symbol(),5,RSIperiod,PRICE_CLOSE,1); double rsim15=iRSI(Symbol(),15,RSIperiod,PRICE_CLOSE,1); double rsim30=iRSI(Symbol(),30,RSIperiod,PRICE_CLOSE,1); double rsim60=iRSI(Symbol(),60,RSIperiod,PRICE_CLOSE,1); double rsid1=iRSI(Symbol(),1440,RSIperiod,PRICE_CLOSE,0); double rsid2=iRSI(Symbol(),1440,RSIperiod,PRICE_CLOSE,1); // double HTb=iCustom(Symbol(),0,"HalfTrend-1.02",0,0); //buy // double HTs=iCustom(Symbol(),0,"HalfTrend-1.02",1,0); //buy //--- open position int shift=4; if(IsTrough(shift) == true) { int currentTrough = shift; int lastTrough = GetLastTrough(shift); if(OpenBUY && OrderBuy<3 && rsi[currentTrough] > rsi[lastTrough] && Low[currentTrough] < Low[lastTrough])OPBUY(); } if(IsPeak(shift) == true) { int currentPeak = shift; int lastPeak = GetLastPeak(shift); if(OpenSELL && OrderSell<3 && rsi[currentPeak] < rsi[lastPeak] && High[currentPeak] > High[lastPeak])OPSELL(); } //--- close position by signal if(CloseBySignal) { if(OrderSell>0 && rsim30>70 && rsim60>70) CloseSell(); if(OrderBuy>0 && rsim30<30 && rsim60<30) CloseBuy(); } //--- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OPBUY() { double StopLossLevel; double TakeProfitLevel; if(StopLoss>0) StopLossLevel=Bid-StopLoss*Point; else StopLossLevel=0.0; if(TakeProfit>0) TakeProfitLevel=Ask+TakeProfit*Point; else TakeProfitLevel=0.0; ticket=OrderSend(Symbol(),OP_BUY,LOT(),Ask,Slippage,StopLossLevel,TakeProfitLevel,Koment,MagicNumber,0,DodgerBlue); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OPSELL() { double StopLossLevel; double TakeProfitLevel; if(StopLoss>0) StopLossLevel=Ask+StopLoss*Point; else StopLossLevel=0.0; if(TakeProfit>0) TakeProfitLevel=Bid-TakeProfit*Point; else TakeProfitLevel=0.0; //--- ticket=OrderSend(Symbol(),OP_SELL,LOT(),Bid,Slippage,StopLossLevel,TakeProfitLevel,Koment,MagicNumber,0,DeepPink); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseSell() { int total=OrdersTotal(); for(int y=OrdersTotal()-1; y>=0; y--) { if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber) { ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Black); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseBuy() { int total=OrdersTotal(); for(int y=OrdersTotal()-1; y>=0; y--) { if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==MagicNumber) { ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Black); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double LOT() { double lotsi; double ilot_max =MarketInfo(Symbol(),MODE_MAXLOT); double ilot_min =MarketInfo(Symbol(),MODE_MINLOT); double tick=MarketInfo(Symbol(),MODE_TICKVALUE); //--- double myAccount=AccountBalance(); //--- if(ilot_min==0.01) LotDigits=2; if(ilot_min==0.1) LotDigits=1; if(ilot_min==1) LotDigits=0; //--- if(AutoLot) { lotsi=NormalizeDouble((myAccount*Risk)/10000,LotDigits); } else { lotsi=ManualLots; } //--- if(lotsi>=ilot_max) { lotsi=ilot_max; } //--- return(lotsi); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CalculateRSI(int x1) { rsi[x1] = iRSI(Symbol(),PERIOD_CURRENT,RSIperiod,RSI_applied_price,x1); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool IsPeak(int shift) { if(iHigh(NULL,0,shift)>=iHigh(NULL,0,shift+1) && iHigh(NULL,0,shift+1)>=iHigh(NULL,0,shift+2) && iHigh(NULL,0,shift+2)>=iHigh(NULL,0,shift+3) && iHigh(NULL,0,shift)>=iHigh(NULL,0,shift-1) && iHigh(NULL,0,shift-1)>=iHigh(NULL,0,shift-2) && iHigh(NULL,0,shift-2)>=iHigh(NULL,0,shift-3)) return(true); else return(false); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool IsTrough(int shift) { if(iLow(NULL,0,shift)<=iLow(NULL,0,shift+1) && iLow(NULL,0,shift+1)<=iLow(NULL,0,shift+2) && iLow(NULL,0,shift+2)<=iLow(NULL,0,shift+3) && iLow(NULL,0,shift)<=iLow(NULL,0,shift-1) && iLow(NULL,0,shift-1)<=iLow(NULL,0,shift-2) && iLow(NULL,0,shift-2)<=iLow(NULL,0,shift-3)) return(true); else return(false); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int GetLastPeak(int shift) { for(int j = shift + 5; j < Bars; j++) { if(iHigh(NULL,0,j)>=iHigh(NULL,0,j+1) && iHigh(NULL,0,j+1)>=iHigh(NULL,0,j+2) && iHigh(NULL,0,j+2)>=iHigh(NULL,0,j+3) && iHigh(NULL,0,j)>=iHigh(NULL,0,j-1) && iHigh(NULL,0,j-1)>=iHigh(NULL,0,j-2) && iHigh(NULL,0,j-2)>=iHigh(NULL,0,j-3)) return(j); } return(-1); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int GetLastTrough(int shift) { for(int j = shift + 5; j < Bars; j++) { if(iLow(NULL,0,j)<=iLow(NULL,0,j+1) && iLow(NULL,0,j+1)<=iLow(NULL,0,j+2) && iLow(NULL,0,j+2)<=iLow(NULL,0,j+3) && iLow(NULL,0,j)<=iLow(NULL,0,j-1) && iLow(NULL,0,j-1)<=iLow(NULL,0,j-2) && iLow(NULL,0,j-2)<=iLow(NULL,0,j-3)) return(j); } return(-1); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+