Help! Using indicator datas on EA

 
Hello, I want to use following indicator on EA to open buy/sell orders.. 

https://www.mql5.com/en/code/7116

I tried it using Icustom function stated on this indicator comments but it doesn't work. Could you please help?? Thank you in advance!


 
Show your code and explain what you mean by " it doesn't work"
 
Keith Watford:
Show your code and explain what you mean by " it doesn't work"

Hi,

First of all, thank you very much for your help.

Indicator code is this one:

(My EA code is next to indicator code)

https://www.mql5.com/en/code/7116

//+------------------------------------------------------------------+
//|                                               MACD_Histogram.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                         http://www.frankie-prasetio.blogspot.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.frankie-prasetio.blogspot.com"

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_color3 Silver
#property indicator_color4 Lime
#property indicator_color5 Red
#property indicator_level1 0
//----
#define arrowsDisplacement 0.0001
//---- input parameters
extern string separator1= "*** MACD Settings ***";
extern int FastMAPeriod = 12;
extern int SlowMAPeriod = 26;
extern int SignalMAPeriod= 9;
extern string separator2 = "*** Indicator Settings ***";
extern bool   drawIndicatorTrendLines=true;
extern bool   drawPriceTrendLines=true;
extern bool   displayAlert=true;

//---- buffers
double MACDLineBuffer[];
double SignalLineBuffer[];
double HistogramBuffer[];
double bullishDivergence[];
double bearishDivergence[];
//---- variables
double alpha=0;
double alpha_1=0;
//----
static datetime lastAlertTime;
static string   indicatorName;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(Digits+1);
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,MACDLineBuffer);
   SetIndexDrawBegin(0,SlowMAPeriod);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,SignalLineBuffer);
   SetIndexDrawBegin(1,SlowMAPeriod+SignalMAPeriod);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2);
   SetIndexBuffer(2,HistogramBuffer);
   SetIndexDrawBegin(2,SlowMAPeriod+SignalMAPeriod);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,233);
   SetIndexBuffer(3,bullishDivergence);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,234);
   SetIndexBuffer(4,bearishDivergence);


  
//---- name for DataWindow and indicator subwindow label
   indicatorName=("MACD("+FastMAPeriod+","+SlowMAPeriod+","+SignalMAPeriod+")");
   SetIndexLabel(2,"MACD");
   SetIndexLabel(3,"Signal");
   SetIndexLabel(4,"Histogr");
   IndicatorShortName(indicatorName);
//----
   alpha=2.0/(SignalMAPeriod+1.0);
   alpha_1=1.0-alpha;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      string label=ObjectName(i);
      if(StringSubstr(label,0,19)!="MACD_DivergenceLine")
         continue;
      ObjectDelete(label);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   if(counted_bars==0) limit-=1+5;

   CalculateIndicator(limit);
   
//----
   for(int i=limit; i>=0; i--)
     {
      MACDLineBuffer[i]=iMA(NULL,0,FastMAPeriod,0,MODE_EMA,PRICE_CLOSE,i) -
                        iMA(NULL,0,SlowMAPeriod,0,MODE_EMA,PRICE_CLOSE,i);
      SignalLineBuffer[i]= alpha*MACDLineBuffer[i]+alpha_1*SignalLineBuffer[i+1];
      HistogramBuffer[i] = MACDLineBuffer[i]-SignalLineBuffer[i];
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateIndicator(int countedBars)
  {
   for(int i=countedBars; i>=0; i--)
     {
      CalculateMACD(i);
      CatchBullishDivergence(i+2);
      CatchBearishDivergence(i+2);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateMACD(int i)
  {
   MACDLineBuffer[i]=iMA(NULL,0,FastMAPeriod,0,MODE_EMA,PRICE_CLOSE,i) -
                     iMA(NULL,0,SlowMAPeriod,0,MODE_EMA,PRICE_CLOSE,i);
   SignalLineBuffer[i]= alpha*MACDLineBuffer[i]+alpha_1*SignalLineBuffer[i+1];
   HistogramBuffer[i] = MACDLineBuffer[i]-SignalLineBuffer[i];
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CatchBullishDivergence(int shift)
  {
  
   if(IsIndicatorTrough(shift)==false)
      return;
   int currentTrough=shift;
     
   int lastTrough=GetIndicatorLastTrough(shift);
   if(lastTrough==-1) return;
//----   
   if(MACDLineBuffer[currentTrough]>MACDLineBuffer[lastTrough] && 
      Low[currentTrough]<Low[lastTrough])
     {
      bullishDivergence[currentTrough]=MACDLineBuffer[currentTrough]-
                                       arrowsDisplacement;
      //----
      if(drawPriceTrendLines==true)
         DrawPriceTrendLine(Time[currentTrough],Time[lastTrough],
                            Low[currentTrough],
                            Low[lastTrough],Lime,STYLE_SOLID);
      //----
      if(drawIndicatorTrendLines==true)
         DrawIndicatorTrendLine(Time[currentTrough],
                                Time[lastTrough],
                                MACDLineBuffer[currentTrough],
                                MACDLineBuffer[lastTrough],
                                Lime,STYLE_SOLID);
      //----
      if(displayAlert==true)
         DisplayAlert("Classical bullish divergence on: ",
                      currentTrough);
                      
                   
     }
//----   
   if(MACDLineBuffer[currentTrough]<MACDLineBuffer[lastTrough] && 
      Low[currentTrough]>Low[lastTrough])
     {
      bullishDivergence[currentTrough]=MACDLineBuffer[currentTrough]-
                                       arrowsDisplacement;
      //----
      if(drawPriceTrendLines==true)
         DrawPriceTrendLine(Time[currentTrough],Time[lastTrough],
                            Low[currentTrough],
                            Low[lastTrough],Lime,STYLE_DOT);
      //----
      if(drawIndicatorTrendLines==true)
         DrawIndicatorTrendLine(Time[currentTrough],
                                Time[lastTrough],
                                MACDLineBuffer[currentTrough],
                                MACDLineBuffer[lastTrough],
                                Lime,STYLE_DOT);
      //----
      if(displayAlert==true)
         DisplayAlert("Reverse bullish divergence on: ",
                      currentTrough);
                                       
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CatchBearishDivergence(int shift)
  {
   if(IsIndicatorPeak(shift)==false)
      return;
   int currentPeak=shift;
   int lastPeak=GetIndicatorLastPeak(shift);
   if(lastPeak==-1) return;
//----   
   if(MACDLineBuffer[currentPeak]<MACDLineBuffer[lastPeak] && 
      High[currentPeak]>High[lastPeak])
     {
      bearishDivergence[currentPeak]=MACDLineBuffer[currentPeak]+
                                     arrowsDisplacement;

      if(drawPriceTrendLines==true)
         DrawPriceTrendLine(Time[currentPeak],Time[lastPeak],
                            High[currentPeak],
                            High[lastPeak],Red,STYLE_SOLID);

      if(drawIndicatorTrendLines==true)
         DrawIndicatorTrendLine(Time[currentPeak],Time[lastPeak],
                                MACDLineBuffer[currentPeak],
                                MACDLineBuffer[lastPeak],Red,STYLE_SOLID);

      if(displayAlert==true)
         DisplayAlert("Classical bearish divergence on: ",
                      currentPeak);
                                                             
     }
   if(MACDLineBuffer[currentPeak]>MACDLineBuffer[lastPeak] && 
      High[currentPeak]<High[lastPeak])
     {
      bearishDivergence[currentPeak]=MACDLineBuffer[currentPeak]+
                                     arrowsDisplacement;
      //----
      if(drawPriceTrendLines==true)
         DrawPriceTrendLine(Time[currentPeak],Time[lastPeak],
                            High[currentPeak],
                            High[lastPeak],Red,STYLE_DOT);
      //----
      if(drawIndicatorTrendLines==true)
         DrawIndicatorTrendLine(Time[currentPeak],Time[lastPeak],
                                MACDLineBuffer[currentPeak],
                                MACDLineBuffer[lastPeak],Red,STYLE_DOT);
      //----
      if(displayAlert==true)
         DisplayAlert("Reverse bearish divergence on: ",
                      currentPeak);
                    
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsIndicatorPeak(int shift)
  {
   if(MACDLineBuffer[shift]>=MACDLineBuffer[shift+1] && MACDLineBuffer[shift]>MACDLineBuffer[shift+2] && 
      MACDLineBuffer[shift]>MACDLineBuffer[shift-1])
      return(true);
   else
      return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsIndicatorTrough(int shift)
  {
   if(MACDLineBuffer[shift]<=MACDLineBuffer[shift+1] && MACDLineBuffer[shift]<MACDLineBuffer[shift+2] && 
      MACDLineBuffer[shift]<MACDLineBuffer[shift-1])
      return(true);
   else
      return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetIndicatorLastPeak(int shift)
  {
   for(int i=shift+5; i<Bars-2; i++)
     {
      if(SignalLineBuffer[i] >= SignalLineBuffer[i+1] && SignalLineBuffer[i] >= SignalLineBuffer[i+2] &&
         SignalLineBuffer[i] >= SignalLineBuffer[i-1] && SignalLineBuffer[i] >= SignalLineBuffer[i-2])
        {
         for(int j=i; j<Bars-2; j++)
           {
            if(MACDLineBuffer[j] >= MACDLineBuffer[j+1] && MACDLineBuffer[j] > MACDLineBuffer[j+2] &&
               MACDLineBuffer[j] >= MACDLineBuffer[j-1] && MACDLineBuffer[j] > MACDLineBuffer[j-2])
               return(j);
           }
        }
     }
   return(-1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetIndicatorLastTrough(int shift)
  {
   for(int i=shift+5; i<Bars-2; i++)
     {
      if(SignalLineBuffer[i] <= SignalLineBuffer[i+1] && SignalLineBuffer[i] <= SignalLineBuffer[i+2] &&
         SignalLineBuffer[i] <= SignalLineBuffer[i-1] && SignalLineBuffer[i] <= SignalLineBuffer[i-2])
        {
         for(int j=i; j<Bars-2; j++)
           {
            if(MACDLineBuffer[j] <= MACDLineBuffer[j+1] && MACDLineBuffer[j] < MACDLineBuffer[j+2] &&
               MACDLineBuffer[j] <= MACDLineBuffer[j-1] && MACDLineBuffer[j] < MACDLineBuffer[j-2])
               return(j);
           }
        }
     }
   return(-1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DisplayAlert(string message,int shift)
  {
   if(shift<=2 && Time[shift]!=lastAlertTime)
     {
      lastAlertTime=Time[shift];
      Alert(message,Symbol()," , ",Period()," minutes chart");
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DrawPriceTrendLine(datetime x1,datetime x2,double y1,
                        double y2,color lineColor,double style)
  {
   string label="MACD_DivergenceLine.0# "+DoubleToStr(x1,0);
   ObjectDelete(label);
   ObjectCreate(label,OBJ_TREND,0,x1,y1,x2,y2,0,0);
   ObjectSet(label,OBJPROP_RAY,0);
   ObjectSet(label,OBJPROP_COLOR,lineColor);
   ObjectSet(label,OBJPROP_STYLE,style);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DrawIndicatorTrendLine(datetime x1,datetime x2,double y1,
                            double y2,color lineColor,double style)
  {
   int indicatorWindow=WindowFind(indicatorName);
   if(indicatorWindow<0)
      return;
   string label="MACD_DivergenceLine.0$# "+DoubleToStr(x1,0);
   ObjectDelete(label);
   ObjectCreate(label,OBJ_TREND,indicatorWindow,x1,y1,x2,y2,
                0,0);
   ObjectSet(label,OBJPROP_RAY,0);
   ObjectSet(label,OBJPROP_COLOR,lineColor);
   ObjectSet(label,OBJPROP_STYLE,style);
  }
//+------------------------------------------------------------------+



And here is my EA code:


// Modification des régles en incluant ordre grace au signal de l'incateur de divergences MACD


//+------------------------------------------------------------------+
//|                                                        TEST1.mq4 |
//|                                                           JEREMY |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright "JEREMY"
#property link      "https://www.mql5.com"
#property version   "1.00"



                               
int i;
double Prev_Value;
double Curr_Value;

int OnInit()
 { 
  return(0);
 }
void OnDeinit(const int reason)
 {   
 }
void OnTick()
 { 

  if (OrdersTotal()==0)


      Prev_Value=iCustom(Symbol(),0,"FX5_MACD_Divergence_V1.0","*** MACD Settings ***",12,26,9,"*** Indicator Settings ***",true,true,true,0,1);

      Curr_Value=iCustom(Symbol(),0,"FX5_MACD_Divergence_V1.0","*** MACD Settings ***",12,26,9,"*** Indicator Settings ***",true,true,true,0,0);


       if (Prev_Value!=EMPTY_VALUE && Curr_Value==EMPTY_VALUE) 
       {
       OrderSend(_Symbol,OP_BUY,0.3,Ask,1,Ask-300*_Point,Ask+300*_Point,NULL,0,0,Green);
        }
  }
     
FX5_MACD_Divergence
FX5_MACD_Divergence
  • www.mql5.com
This is another flavour of the original divergence indicator. It detects divergence between price and MACD indicator and gives Buy or Sell signals according to the divergence type.
 
Keith Watford:
Show your code and explain what you mean by " it doesn't work"

Topics concerning MT4 and MQL4 have their own section.

In future please post in the correct section.

I have moved your topic to the MQL4 and Metatrader 4 section.

 
Keith Watford:

Topics concerning MT4 and MQL4 have their own section.

In future please post in the correct section.

I have moved your topic to the MQL4 and Metatrader 4 section.

OK thank you! Sorry for this inconvenience. I did not notice it. 
 
jeremy fribourg:
Hello, I want to use following indicator on EA to open buy/sell orders.. 

https://www.mql5.com/en/code/7116

I tried it using Icustom function stated on this indicator comments but it doesn't work. Could you please help?? Thank you in advance!


       if (Prev_Value!=EMPTY_VALUE &&  Prev_Value>0 && Curr_Value==EMPTY_VALUE ) 
       {
       OrderSend(_Symbol,OP_BUY,0.3,Ask,3,Ask-300*_Point,Ask+300*_Point,NULL,0,0,Green);
        }
 

Still nothing for me.

I tried with differents Buffer index and nothing happened.

Please HELP.



here is my code:

// Modification des régles en incluant ordre grace au signal de l'incateur de divergences MACD


//+------------------------------------------------------------------+
//|                                                        TEST1.mq4 |
//|                                                           JEREMY |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright "JEREMY"
#property link      "https://www.mql5.com"
#property version   "1.00"


extern double Open_Loss_To_CloseTrades=-10;
extern double My_Money_Profit_Target=10;

int Slippage=100;                                 
int i;
double Prev_Value;
double Curr_Value;


int OnInit()
 { 
  return(0);
 }
void OnDeinit(const int reason)
 {   
 }
void OnTick()
 { 
  if (OrdersTotal()==0)


      Prev_Value=iCustom(Symbol(),0,"MACD_Histogram","*** Indicator Settings ***",12,26,9,"*** Indicator Settings ***",true,true,true,0,1);
      Curr_Value=iCustom(Symbol(),0,"MACD_Histogram","*** Indicator Settings ***",12,26,9,"*** Indicator Settings ***",true,true,true,0,0);
      
      if (Prev_Value!=EMPTY_VALUE &&  Prev_Value>0 && Curr_Value==EMPTY_VALUE ) 
       {
       OrderSend(_Symbol,OP_BUY,0.3,Ask,3,Ask-300*_Point,Ask+300*_Point,NULL,0,0,Green);
        }
     




   
     
Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2021.03.08
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

Check if the indicator values have been read out properly like so:

   ResetLastError();
   Prev_Value=iCustom(Symbol(),0,"MACD_Histogram","*** Indicator Settings ***",12,26,9,"*** Indicator Settings ***",true,true,true,0,1);
   Curr_Value=iCustom(Symbol(),0,"MACD_Histogram","*** Indicator Settings ***",12,26,9,"*** Indicator Settings ***",true,true,true,0,0);
   if(_LastError) { Print("failed to read indicator values, error ",_LastError); ExpertRemove(); return; }
 

Hello  lippmaje, I tried it.

I have nothing happening.

It seems no error dectected.


Please help :)

lippmaje
lippmaje
  • 2021.01.20
  • www.mql5.com
Trader's profile
 
jeremy fribourg:

Still nothing for me.

I tried with differents Buffer index and nothing happened.

Please HELP.



here is my code:

bracket are missing :

void OnTick()
 { 

  if (OrdersTotal()==0)
    { // missing 

      Prev_Value=iCustom(Symbol(),0,"FX5_MACD_Divergence_V1.0","*** MACD Settings ***",12,26,9,"*** Indicator Settings ***",true,true,true,0,1);

      Curr_Value=iCustom(Symbol(),0,"FX5_MACD_Divergence_V1.0","*** MACD Settings ***",12,26,9,"*** Indicator Settings ***",true,true,true,0,0);


       if (Prev_Value!=EMPTY_VALUE && Curr_Value==EMPTY_VALUE) // PUT != here
       {
       OrderSend(_Symbol,OP_BUY,0.3,Ask,1,Ask-300*_Point,Ask+300*_Point,NULL,0,0,Green);
        }
   }

 }
     

And as you are reading a line ... ( see your indicators buffers)

Prev_Value  and curr_value

will always be different of EMPTY VALUE

 

there is a problem with the name of the indicator, I downloaded it, and I have this name

FX5_MACD_Divergence_V1.0.

Reason: