need a little help with this indicator
No problem:
//+------------------------------------------------------------------+ //| ADX Smoothed.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| https://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, MetaQuotes Software Corp." #property link "https://www.metaquotes.net/" #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 DarkBlue #property indicator_color2 FireBrick #property indicator_color3 DarkGreen #property indicator_level1 25 //---- input parameters extern int per=14; extern double alpha1=0.25; extern double alpha2=0.33; extern int PriceType=0; //---- buffers double DiPlusFinal[]; double DiMinusFinal[]; double ADXFinal[]; double DIPlusLead[]; double DIMinusLead[]; double ADXLead[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators IndicatorBuffers(6); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,DiPlusFinal); SetIndexLabel(0,"Di Plus"); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,DiMinusFinal); SetIndexLabel(1,"Di Minus"); SetIndexStyle(2,DRAW_LINE); SetIndexBuffer(2,ADXFinal); SetIndexLabel(2,"ADX"); SetIndexBuffer(3,DIPlusLead); SetIndexBuffer(4,DIMinusLead); SetIndexBuffer(5,ADXLead); IndicatorDigits(2); IndicatorShortName("ADX("+per+")smothed"); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int i,k,limit; double DIPlus, DIMinus, ADX, DIPlus1, DIMinus1, ADX1; //---- if (counted_bars==0) limit=Bars-per-1; if (counted_bars>0) limit=Bars-counted_bars; for (i=limit;i>=0;i--) { DIPlus=iADX(NULL,0,per,PriceType,MODE_PLUSDI,i); DIMinus=iADX(NULL,0,per,PriceType,MODE_MINUSDI,i); ADX=iADX(NULL,0,per,PriceType,MODE_MAIN,i); DIPlus1=iADX(NULL,0,per,PriceType,MODE_PLUSDI,i+1); DIMinus1=iADX(NULL,0,per,PriceType,MODE_MINUSDI,i+1); ADX1=iADX(NULL,0,per,PriceType,MODE_MAIN,i+1); DIPlusLead[i]=2*DIPlus + (alpha1 - 2) * DIPlus1 + (1 - alpha1) * DIPlusLead[i+1]; DIMinusLead[i] = 2*DIMinus + (alpha1 - 2) * DIMinus1 + (1 - alpha1) * DIMinusLead[i+1]; ADXLead[i] = 2*ADX + (alpha1 - 2) * ADX1 + (1 - alpha1) * ADXLead[i+1]; } for (i=limit;i>=0;i--) { DiPlusFinal[i] = alpha2*DIPlusLead[i] + (1 - alpha2) * DiPlusFinal[i+1]; DiMinusFinal[i] = alpha2*DIMinusLead[i] + (1 - alpha2) * DiMinusFinal[i+1]; ADXFinal[i] = alpha2*ADXLead[i] + (1 - alpha2) * ADXFinal[i+1]; } //---- return(0); } //+------------------------------------------------------------------+
Hi Rosh, many thanks! take care ;-)
Rosh,
Please correct me if I am wrong.
You are using the following loop to calculate the smoothed ADX values:
for (i=limit;i>=0;i--) {
DIPlus=iADX(NULL,0,per,PriceType,MODE_PLUSDI,i);
DIMinus=iADX(NULL,0,per,PriceType,MODE_MINUSDI,i);
ADX=iADX(NULL,0,per,PriceType,MODE_MAIN,i);
DIPlus1=iADX(NULL,0,per,PriceType,MODE_PLUSDI,i+1);
DIMinus1=iADX(NULL,0,per,PriceType,MODE_MINUSDI,i+1);
ADX1=iADX(NULL,0,per,PriceType,MODE_MAIN,i+1);
DIPlusLead[i]=2*DIPlus + (alpha1 - 2) * DIPlus1 + (1 - alpha1) * DIPlusLead[i+1];
DIMinusLead[i] = 2*DIMinus + (alpha1 - 2) * DIMinus1 + (1 - alpha1) * DIMinusLead[i+1];
ADXLead[i] = 2*ADX + (alpha1 - 2) * ADX1 + (1 - alpha1) * ADXLead[i+1];
}
Now, assume limit = 50. So for i=50 you do your calcs and find the value for ADXLead[50] and ADXLead[51]. Next you do the same for i=49, and you calculate values for ADXLead[49] and ADXLead[50]. Now, this seems like repainting. So, am I correct in assuming that this indicator will repaint?
Please correct me if I am wrong.
You are using the following loop to calculate the smoothed ADX values:
for (i=limit;i>=0;i--) {
DIPlus=iADX(NULL,0,per,PriceType,MODE_PLUSDI,i);
DIMinus=iADX(NULL,0,per,PriceType,MODE_MINUSDI,i);
ADX=iADX(NULL,0,per,PriceType,MODE_MAIN,i);
DIPlus1=iADX(NULL,0,per,PriceType,MODE_PLUSDI,i+1);
DIMinus1=iADX(NULL,0,per,PriceType,MODE_MINUSDI,i+1);
ADX1=iADX(NULL,0,per,PriceType,MODE_MAIN,i+1);
DIPlusLead[i]=2*DIPlus + (alpha1 - 2) * DIPlus1 + (1 - alpha1) * DIPlusLead[i+1];
DIMinusLead[i] = 2*DIMinus + (alpha1 - 2) * DIMinus1 + (1 - alpha1) * DIMinusLead[i+1];
ADXLead[i] = 2*ADX + (alpha1 - 2) * ADX1 + (1 - alpha1) * ADXLead[i+1];
}
Now, assume limit = 50. So for i=50 you do your calcs and find the value for ADXLead[50] and ADXLead[51]. Next you do the same for i=49, and you calculate values for ADXLead[49] and ADXLead[50]. Now, this seems like repainting. So, am I correct in assuming that this indicator will repaint?
In MQL indexis of bars incrementing in history. So, to calculate value of indicator
on 50 index I use the value of 51 index (which more dept in history) and repainting
is absent absolutely. Do you understand me? (my English is not very bad?)
Rosh,
I understood your point. Thanks.
Thus, to do this kind of calculations, we have to count down the way you have to avoid repainting.
Thanks again for the nice pointer.
I understood your point. Thanks.
Thus, to do this kind of calculations, we have to count down the way you have to avoid repainting.
Thanks again for the nice pointer.
Rosh:
No problem:
Dear Coders,No problem:
unfortunately i`m not be proficient in MetaTrader programming language,
so i need a little your help, please.
I would like to add the alert when the lines cross ( lines DarkBlue and FireBrick ) and the DarkGreen's
line above 25.
Files:
adx_smoothed.mq4
4 kb
Length( 14 ),
ADXTrend( 25 ), alpha1(0.25), alpha2(0.33);
DMIPlus( 0 ), DMIMinus( 0 ), DMI( 0 ), ADX( 0 ),
DIPlusLead(0), DIMinusLead(0), DIPlusFinal(0), DIMinusFinal(0),
ADXLead(0), ADXFinal(0);
DIPlusFinal = alpha2*DIPlusLead + (1 - alpha2) * DIPlusFinal[1];
DIMinusFinal = alpha2*DIMinusLead + (1 - alpha2) * DIMinusFinal[1];
ADXFinal = alpha2*ADXLead + (1 - alpha2) * ADXFinal[1];
Plot3( ADXFinal, "ADX" ) ;