- Indicators: FX5_MACD_Divergence
- Indicators: Open Interest Online © Indicator
- Indicator help
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); } }
- www.mql5.com
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.
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.
Hello, I want to use following indicator on EA to open buy/sell orders..
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); }
- 2021.03.08
- www.mql5.com
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; }
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.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use