I think there is problem in custom indicator FX_FISH_2MA (I view it's source) See "MQL4: Tester in the Terminal MetaTrader 4: It Should Be Known"
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
I'm facing a problem with a simple EA based on a custom indicator (posted here by Kiko Segui). The idea is simply to enter/exit trades when the custom indicator crosses the zero line from below/above.
The problem is that the EA executes the trades with a delay of 5 bars, although the indicator line itself is displayed correctly on its separate indicator window.
Does anybody has an idea how this shift between crossing of zero-line of the indicator and the respective trade execution could be explained and hence what the solution would be?
I am fully aware of the problems which can arise e.g. from multiple null bar counts (like described in "MQL4: Multiple Null Bar Re-Сount in Some Indicators"), but this does not seem to be the problem in my case.
Here is the code of the EA:
//+------------------------------------------------------------------+ //| testEA.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| http://www.metaquotes.ru/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, MetaQuotes Software Corp." #property link "http://www.metaquotes.ru/" extern double stop = 100; double Lots = 0.1; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ // Open LONG positions int GoLong() { int cnt, ticket, total = OrdersTotal(); double Z = iCustom(Symbol(),PERIOD_M30,"FX_FISH_2MA",2,0); double Lots = 0.1; if(total < 1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-stop*Point,0,"Gekauft",123456,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { Print("BUY Order# ", ticket, " at price : ",OrderOpenPrice()); Print("Value of Z0 is: ", Z); } } else { Print("Error opening BUY order : ",GetLastError()); } return(0); } } // Closing of all LONG positions int ExitLong() { int cnt, ticket, total = OrdersTotal(); for(cnt=0; cnt<OrdersTotal(); cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType() == OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position } } } return(0); } //***************************************************************************************************** int start() { double Z; Z = iCustom("GBPJPY",PERIOD_M30,"FX_FISH_2MA",2,0); // Entry of position if( Z>0 ) // Open LONG position { GoLong(); } // Exit of position if( Z<0 ) // Close LONG position { ExitLong(); } return(0); } //*****************************************************************************************************And here is the code of the custom indicator used to generate the entry/exit signals:
// FX_FISH_2MA #property copyright "Copyright © 2005, Kiko Segui" #property link "webtecnic@terra.es" #property indicator_separate_window #property indicator_buffers 5 #property indicator_color1 SteelBlue #property indicator_color2 Orange #property indicator_color3 Black #property indicator_color4 Blue #property indicator_color5 Red double buffer1[]; double buffer2[]; double buffer3[]; double MA1buffer[]; double MA2buffer[]; extern int period=20; extern int price=0; // 0 or other = (H+L)/2 // 1 = Open // 2 = Close // 3 = High // 4 = Low // 5 = (H+L+C)/3 // 6 = (O+C+H+L)/4 // 7 = (O+C)/2 extern bool Mode_Fast= False; extern bool Signals= false; extern int MA1period=1, MA2period=1; extern string TypeHelp = "SMA- 0, EMA - 1, SMMA - 2, LWMA- 3"; extern string TypeHelp2 = "John Hyden settings TypeMA1=0, TypeMA2=3"; extern int TypeMA1=0; extern int TypeMA2=3; int init() { SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,1,SteelBlue); SetIndexBuffer(0,buffer1); SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,1,Orange); SetIndexBuffer(1,buffer2); SetIndexStyle(2,DRAW_LINE); SetIndexLabel(2,"line"); SetIndexBuffer(2,buffer3); SetIndexStyle(3,DRAW_LINE); SetIndexLabel(3,"MA1 "+MA1period); SetIndexStyle(4,DRAW_LINE); SetIndexLabel(4,"MA2 "+MA2period); SetIndexBuffer(3,MA1buffer); SetIndexBuffer(4,MA2buffer); return(0); } int deinit() { int i; double tmp; for (i=0;i<Bars;i++) { ObjectDelete("SELL SIGNAL: "+DoubleToStr(i,0)); ObjectDelete("BUY SIGNAL: "+DoubleToStr(i,0)); ObjectDelete("EXIT: "+DoubleToStr(i,0)); } return(0); } double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0; int buy=0,sell=0; int start() { int counted_bars=IndicatorCounted(); int i; int barras; double _price; double tmp; double MinL=0; double MaxH=0; double Threshold=0; if(counted_bars>0) counted_bars--; //barras = Bars;ç barras = Bars-counted_bars; if (Mode_Fast) barras = 100; i = 0; while(i<barras) { MaxH = High[Highest(NULL,0,MODE_HIGH,period,i)]; MinL = Low[Lowest(NULL,0,MODE_LOW,period,i)]; switch (price) { case 1: _price = Open[i]; break; case 2: _price = Close[i]; break; case 3: _price = High[i]; break; case 4: _price = Low[i]; break; case 5: _price = (High[i]+Low[i]+Close[i])/3; break; case 6: _price = (Open[i]+High[i]+Low[i]+Close[i])/4; break; case 7: _price = (Open[i]+Close[i])/2; break; default: _price = (High[i]+Low[i])/2; break; } Value = 0.33*2*((_price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1; Value=MathMin(MathMax(Value,-0.999),0.999); Fish = 0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1; buffer1[i]= 0; buffer2[i]= 0; if ( (Fish<0) && (Fish1>0)) { if (Signals) { ObjectCreate("EXIT: "+DoubleToStr(i,0),OBJ_TEXT,0,Time[i],_price); ObjectSetText("EXIT: "+DoubleToStr(i,0),"EXIT AT "+DoubleToStr(_price,4),7,"Arial",White); } buy = 0; } if ((Fish>0) && (Fish1<0)) { if (Signals) { ObjectCreate("EXIT: "+DoubleToStr(i,0),OBJ_TEXT,0,Time[i],_price); ObjectSetText("EXIT: "+DoubleToStr(i,0),"EXIT AT "+DoubleToStr(_price,4),7,"Arial",White); } sell = 0; } if (Fish > 0) { buffer1[i] = Fish; buffer3[i]= Fish; } if (Fish < 0) { buffer2[i] = Fish; buffer3[i]= Fish; } if (Fish == 0) { buffer2[i] = 0; buffer3[i]= 0; } tmp = i; if ((Fish<-Threshold) && (Fish>Fish1) && (Fish1<=Fish2)) { if (Signals) { ObjectCreate("SELL SIGNAL: "+DoubleToStr(i,0),OBJ_TEXT,0,Time[i],_price); ObjectSetText("SELL SIGNAL: "+DoubleToStr(i,0),"SELL AT "+DoubleToStr(_price,4),7,"Arial",Red); } sell = 1; } if ((Fish>Threshold) && (Fish<Fish1) && (Fish1>=Fish2)) { if (Signals) { ObjectCreate("BUY SIGNAL: "+DoubleToStr(i,0),OBJ_TEXT,0,Time[i],_price); ObjectSetText("BUY SIGNAL: "+DoubleToStr(i,0),"BUY AT "+DoubleToStr(_price,4),7,"Arial",Lime); } buy=1; } Value1 = Value; Fish2 = Fish1; Fish1 = Fish; i++; } for(i=0; i<barras; i++) MA1buffer[i]=iMAOnArray(buffer3,Bars,MA1period,0,TypeMA1,i); for(i=0; i<barras; i++) MA2buffer[i]=iMAOnArray(MA1buffer,Bars,MA2period,0,TypeMA2,i); return(0); } //+------------------------------------------------------------------+Any help to resolve this issue is greatly appreciated!
Thank you very much,
Roland