EA trade execution out of synch with custom indicator signal

 
Hi all!

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;&#231;
  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



 
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"
Reason: