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

You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
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" ) ;