Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #property indicator_separate_window
- #property indicator_buffers 3
- #property indicator_color1 Magenta
- #property indicator_color2 Yellow
- #property indicator_color3 Aqua
- #property indicator_level1 0
- #property indicator_levelcolor Gray
- #property indicator_levelstyle 2
- extern int NMC2_period = 40;
- extern bool Use_NMR_instead_NMM = false;
- extern int NMA_period = 40;
- extern int NMA_LB_min = 8;
- double NMC2[];
- double NMC2_NMA[];
- double NMC2_FastNMA[];
- int init()
- {
- string whichone = "NMM";
- if(Use_NMR_instead_NMM) whichone = "NMR";
- IndicatorShortName("NMC2_with_Ocn_MAs(" + NMC2_period + ", using " + whichone + ", " + NMA_period + ", " + NMA_LB_min + ")");
- IndicatorBuffers(3);
- SetIndexBuffer(0, NMC2);
- SetIndexLabel(0, "NMC2(" + NMC2_period + ", using " + whichone + ")");
- SetIndexBuffer(1, NMC2_NMA);
- SetIndexLabel(1, "NMC2_NMA(" + NMA_period + ")");
- SetIndexBuffer(2, NMC2_FastNMA);
- SetIndexLabel(2, "NMC2_FastNMA(" + NMA_period + ", " + NMA_LB_min + ")");
- return(0);
- }
- int start()
- {
- int limit, i, ii, counted_bars = IndicatorCounted();
- double nms, nmm, nmr, nms2, nmm2, nmr2, whichone, avg, sign, sum, abssum, ratio, nmc2num, maxnmc2;
- if(Bars <= NMC2_period) return(0);
- if(counted_bars < 0) counted_bars = 0;
- if(counted_bars > NMC2_period) limit = Bars - counted_bars;
- else limit = Bars - NMC2_period - 1;
- for(i = limit; i >= 0; i--)
- {
- nms2 = 0; nmm2 = 0; nmr2 = 0;
- for(ii = 1; ii <= NMC2_period; ii++)
- {
- double oLRSlope = 0, SumXY = 0, SumY = 0, SumX, SumXSqr, Divisor;
- if(ii > 1)
- {
- SumX = ii * (ii - 1) * 0.5;
- SumXSqr = ii * (ii - 1) * (2 * ii - 1) * 1/6;
- Divisor = (SumX * SumX) - ii * SumXSqr;
- for(int iii = 0; iii < ii; iii++)
- {
- SumXY += iii * MathLog(Close[i+iii]);
- SumY += MathLog(Close[i+iii]);
- }
- oLRSlope = (ii * SumXY - SumX * SumY) / Divisor;
- }
- nms2 += oLRSlope * MathSqrt(ii);
- nmm2 += (MathLog(Close[i]) - MathLog(Close[i+ii])) / MathSqrt(ii);
- nmr2 += (MathLog(Close[i+ii-1]) - MathLog(Close[i+ii])) * (MathSqrt(ii) - MathSqrt(ii-1));
- }
- nms = nms2 * 100;
- nmm = (nmm2 / NMC2_period) * 1000;
- nmr = nmr2 * 1000;
- if(Use_NMR_instead_NMM) whichone = nmr;
- else whichone = nmm;
- avg = ((MathAbs(nms) * whichone) + (MathAbs(whichone) * nms)) / 2;
- if(avg > 0) sign = 1;
- else if(avg < 0) sign = -1;
- else sign = 0;
- NMC2[i] = sign * MathSqrt(MathAbs(avg));
- }
- for(i = limit; i >= 0; i--)
- if(i < Bars - NMC2_period - 1 - NMA_period)
- {
- ratio = 0;
- sum = (NMC2[i] - NMC2[i+1]) + (NMC2[i+1] - NMC2[i+2]) * (MathSqrt(2)-1);
- for(ii = 2; ii < NMA_period; ii++)
- sum += (NMC2[i+ii] - NMC2[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
- abssum = MathAbs(sum);
- sum = 0;
- for(ii = 0; ii < NMA_period; ii++)
- sum += MathAbs(NMC2[i+ii] - NMC2[i+ii+1]);
- if(sum != 0) ratio = abssum / sum;
- NMC2_NMA[i] = NMC2_NMA[i+1] + (NMC2[i] - NMC2_NMA[i+1]) * ratio;
- }
- for(i = limit; i >= 0; i--)
- if(i < Bars - NMC2_period - 1 - NMA_period)
- {
- maxnmc2 = 0; ratio = 0;
- int NMA_LB_max;
- for(ii = 1; ii <= NMA_period; ii++)
- {
- nmc2num = (NMC2[i] - NMC2[i+ii]) / MathSqrt(ii);
- if(MathAbs(nmc2num) > maxnmc2) { maxnmc2 = MathAbs(nmc2num); NMA_LB_max = ii; }
- }
- if(NMA_LB_max < NMA_LB_min) NMA_LB_max = NMA_LB_min;
- sum = (NMC2[i] - NMC2[i+1]) + (NMC2[i+1] - NMC2[i+2]) * (MathSqrt(2)-1);
- for(ii = 2; ii < NMA_LB_max; ii++)
- sum += (NMC2[i+ii] - NMC2[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
- abssum = MathAbs(sum);
- sum = 0;
- for(ii = 0; ii < NMA_LB_max; ii++)
- sum += MathAbs(NMC2[i+ii] - NMC2[i+ii+1]);
- if(sum != 0) ratio = abssum / sum;
- NMC2_FastNMA[i] = NMC2_FastNMA[i+1] + (NMC2[i] - NMC2_FastNMA[i+1]) * ratio;
- }
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement