Need help with XO clean_mtf + alerts + lines 2 indicator for call buffer problem in EA

 

Do you know this indicator.  XO clean_mtf + alerts + lines 2 

//------------------------------------------------------------------
//------------------------------------------------------------------
#property copyright ""
#property link      ""

#property indicator_separate_window
#property indicator_buffers    2
#property indicator_color1     LimeGreen
#property indicator_color2     PaleVioletRed
#property indicator_width1     2
#property indicator_width2     2
#property indicator_level1     0

//
//
//
//
//

extern ENUM_TIMEFRAMES TimeFrame         = PERIOD_CURRENT;
extern double          BoxPeriod         = 6.5;
extern bool            alertsOn          = true;
extern bool            alertsOnCurrent   = true;
extern bool            alertsMessage     = true;
extern bool            alertsSound       = false;
extern bool            alertsNotify      = true;
extern bool            alertsEmail       = true;
extern bool            ShowLines         = false;
extern string          LinesIdentifier   = "XOLines1";
extern color           LinesColorForUp   = LimeGreen;
extern color           LinesColorForDown = Red;
extern ENUM_LINE_STYLE LinesStyle        = STYLE_DOT;

//
//
//
//
//

double Hi[];
double Lo[];
double no[];
double kr[];
double trend[];

//
//
//
//
//

string indicatorFileName;
bool   returnBars;

//------------------------------------------------------------------
//                                                                  
//------------------------------------------------------------------

int init()
{  
   IndicatorBuffers(5);   
      SetIndexBuffer(0,kr); SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexLabel(0,"XO Up");
      SetIndexBuffer(1,no); SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexLabel(1,"XO Down");
      SetIndexBuffer(2,Hi);
      SetIndexBuffer(3,Lo);
      SetIndexBuffer(4,trend);

      //
      //
      //
      //
      //
      
         indicatorFileName = WindowExpertName();
         returnBars        = (TimeFrame==-99);
         TimeFrame         = MathMax(TimeFrame,_Period);

      //
      //
      //
      //
      //
      
   IndicatorShortName(timeFrameToString(TimeFrame)+" XO ("+DoubleToStr(BoxPeriod,2)+")");
   return(0);
}


//
//
//
//
//

int deinit()
{
   int lookForLength = StringLen(LinesIdentifier);
   for (int i=ObjectsTotal(); i>=0; i--)
      {
         string name = ObjectName(i);
         if (StringSubstr(name,0,lookForLength)==LinesIdentifier) ObjectDelete(name);
      }
   return(0);
}


//------------------------------------------------------------------
//
//------------------------------------------------------------------

int start()
{
   int counted_bars=IndicatorCounted();
      if(counted_bars<0) return(-1);
      if(counted_bars>0) counted_bars--;
           int limit=MathMin(Bars-counted_bars,Bars-1);
           if (returnBars) { kr[0] = limit+1; return(0); }
         
   //
   //
   //
   //
   //
    
   if (TimeFrame == Period())
   {
     double pipMultiplier = 1; if(Digits==3 || Digits==5) pipMultiplier = 10;
     for(int i=limit; i>=0; i--)
     {         
        if (i>=(Bars-2)) { Hi[i+1]=Close[i]; Lo[i+1]=Close[i]; continue; }
           double cur      = Close[i];
                  Hi[i]    = Hi[i+1];
                  Lo[i]    = Lo[i+1];
                  no[i]    = no[i+1];
                  kr[i]    = kr[i+1];
                  trend[i] = trend[i+1];

                  if (cur > (Hi[i]+BoxPeriod*Point*pipMultiplier)) 
                  {
                       Hi[i]    = cur;
                       Lo[i]    = cur-BoxPeriod*Point*pipMultiplier;
                       kr[i]    = kr[i+1]+1;
                       no[i]    = 0;
                       trend[i] = 1;
                  }
                  if (cur < (Lo[i]-BoxPeriod*Point*pipMultiplier)) 
                  {
                       Lo[i]    = cur;
                       Hi[i]    = cur+BoxPeriod*Point*pipMultiplier;
                       no[i]    = no[i+1]-1;
                       kr[i]    = 0;
                       trend[i] = -1;
                  }
                  if (ShowLines)
                  {
                    deleteLine(i);
                       if (trend[i]!=trend[i+1])
                       if (trend[i]==1)
                             drawLine(i,LinesColorForUp);
                       else  drawLine(i,LinesColorForDown);
                  } 
      }                 
      manageAlerts();
      return(0);
   }
   
   //
   //
   //
   //
   //
   
   limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,TimeFrame,indicatorFileName,-99,0,0)*TimeFrame/Period()));
   for (i=limit;i>=0;i--)
   {
      int y = iBarShift(NULL,TimeFrame,Time[i]);
         kr[i]    = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,BoxPeriod,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsNotify,alertsEmail,false,0,y);
         no[i]    = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,BoxPeriod,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsNotify,alertsEmail,false,1,y);
         trend[i] = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,BoxPeriod,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsNotify,alertsEmail,false,4,y);
         if (ShowLines)
         {
            deleteLine(i);
            if (trend[i]!=trend[i+1])
            if (trend[i]==1)
                  drawLine(i,LinesColorForUp);
            else  drawLine(i,LinesColorForDown);
         }                  
   }
   return(0);         
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

void manageAlerts()
{
   if (alertsOn)
   {
      if (alertsOnCurrent)
           int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
      {
         if (trend[whichBar] == 1) doAlert(whichBar,"up");
         if (trend[whichBar] ==-1) doAlert(whichBar,"down");
      }         
   }
}

//
//
//
//
//

void doAlert(int forBar, string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   
   if (previousAlert != doWhat || previousTime != Time[forBar]) {
       previousAlert  = doWhat;
       previousTime   = Time[forBar];

       //
       //
       //
       //
       //

       message =  StringConcatenate(timeFrameToString(_Period)+" "+Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," XO trend changed to ",doWhat);
          if (alertsMessage) Alert(message);
          if (alertsNotify)  SendNotification(StringConcatenate(Symbol(), Period() ," XO " +" "+message));
          if (alertsEmail)   SendMail(StringConcatenate(Symbol(),"XO "),message);
          if (alertsSound)   PlaySound("alert2.wav");
   }
}

//+-------------------------------------------------------------------
//|                                                                  
//+-------------------------------------------------------------------
//
//
//
//
//

string sTfTable[] = {"M1","M5","M15","M30","H1","H4","D1","W1","MN"};
int    iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

string timeFrameToString(int tf)
{
   for (int i=ArraySize(iTfTable)-1; i>=0; i--) 
         if (tf==iTfTable[i]) return(sTfTable[i]);
                              return("");
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

void deleteLine(int i)
{
   ObjectDelete(LinesIdentifier+":"+Time[i]);
}
void drawLine(int i, color theColor)
{
   string name = LinesIdentifier+":"+Time[i];
   if (ObjectFind(name)<0)
       ObjectCreate(name,OBJ_VLINE,0,Time[i],0);
       ObjectSet(name,OBJPROP_COLOR,theColor);
       ObjectSet(name,OBJPROP_BACK,true);
       ObjectSet(name,OBJPROP_STYLE,LinesStyle);
}

I like it  signal .So I decide to call its buffer.


double xxoup = iCustom(NULL,0,"XO clean_mtf + alerts + lines 2",TimeFrame,0,0);
double xxodn = iCustom(NULL,0,"XO clean_mtf + alerts + lines 2",TimeFrame,1,0);


if(   xxoup >0 && xxodn == 0 ) return(buy);

if( xxoup == 0 && xxodn < 0  )  return(sell);          
          

I call its timeframe variable in parameter because I want to use its timeframe function .

But in real running ,it has false signals .I run with 1DAY timeframe in 1HR chart .
In up signal ,all buy and Down signal all sell.
But sell also open in up signals.vise versa.
Why it happen.
Can someone help me.




To clear its false signals .I edit DRAW_HISTOGRAM to DRAW_ARROW.

It up and down histogram also has value in zero line.

but I call as  

if(   xxoup >0 && xxodn == 0 ) return(buy);

I not still understand why it produce false signal.

Please suggest me.What is problem .

I like this indicator to catch whole trend .So I need to get solution.