Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #property indicator_separate_window
- #property indicator_buffers 6
- #property indicator_color1 Magenta
- #property indicator_color2 Lime
- #property indicator_color3 Silver
- #property indicator_color4 Silver
- #property indicator_color5 Yellow
- #property indicator_color6 Aqua
- #property indicator_level1 0
- #property indicator_levelcolor Gray
- #property indicator_levelstyle 2
- extern int NMM_ROC_period = 40;
- extern int NMM_ROC_LB = 3;
- extern int NMM_ROC_AvgLen = 3;
- extern bool Show_ZH = true;
- extern double ZH_displacement = 1;
- extern int ZH_symbol = 115;
- extern bool Show_SD = true;
- extern int SD_len = 30;
- extern double SD_up = 2;
- extern double SD_dn = 2;
- extern bool Show_SD_1line_only = true;
- extern bool Show_SD_2lines_up = true;
- extern bool Show_SD_2lines_dn = true;
- extern int NMA_period = 40;
- extern int NMA_LB_min = 8;
- extern bool Show_NMA = true;
- extern bool Show_FastNMA = true;
- double NMM_ROC[];
- double ZH[];
- double SD[];
- double SD2[];
- double NMM_ROC_NMA[];
- double NMM_ROC_FastNMA[];
- double NMM[];
- double NMM_ROCx[];
- int init()
- {
- string nmmrocname = "NMM_ROC(" + NMM_ROC_period + ", " + NMM_ROC_LB + ", " + NMM_ROC_AvgLen + ")";
- IndicatorShortName(nmmrocname);
- IndicatorBuffers(8);
- SetIndexBuffer(0, NMM_ROC);
- SetIndexLabel(0, nmmrocname);
- SetIndexBuffer(1, ZH);
- SetIndexLabel(1, "NMM_ROC_ZH");
- SetIndexStyle(1, DRAW_ARROW);
- SetIndexArrow(1, ZH_symbol);
- SetIndexBuffer(2, SD);
- SetIndexBuffer(3, SD2);
- if(Show_SD_1line_only)
- {
- SetIndexLabel(2, "NMM_ROC_SD(" + SD_len + ")");
- SetIndexLabel(3, "unused");
- }
- else
- {
- if(Show_SD_2lines_up) SetIndexLabel(2, "NMM_ROC_SD_up(" + SD_len + ")");
- else SetIndexLabel(2, "unused");
- if(Show_SD_2lines_dn) SetIndexLabel(3, "NMM_ROC_SD_dn(" + SD_len + ")");
- else SetIndexLabel(3, "unused");
- }
- SetIndexBuffer(4, NMM_ROC_NMA);
- SetIndexBuffer(5, NMM_ROC_FastNMA);
- if(Show_NMA) SetIndexLabel(4, "NMM_ROC_NMA(" + NMA_period + ")");
- else SetIndexLabel(4, "unused");
- if(Show_FastNMA) SetIndexLabel(5, "NMM_ROC_FastNMA(" + NMA_period + ", " + NMA_LB_min + ")");
- else SetIndexLabel(5, "unused");
- SetIndexBuffer(6, NMM);
- SetIndexBuffer(7, NMM_ROCx);
- return(0);
- }
- int start()
- {
- int limit, i, ii, counted_bars = IndicatorCounted();
- double nmm2, sum, abssum, ratio, nmmrocnum, maxnmmroc;
- if(Bars <= NMM_ROC_period + NMM_ROC_LB + NMM_ROC_AvgLen) return(0);
- if(counted_bars < 0) counted_bars = 0;
- if(counted_bars > NMM_ROC_period) limit = Bars - counted_bars;
- else limit = Bars - NMM_ROC_period - 1;
- for(i = limit; i >= 0; i--)
- {
- nmm2 = 0;
- for(ii = 1; ii <= NMM_ROC_period; ii++)
- nmm2 += (MathLog(Close[i]) - MathLog(Close[i+ii])) / MathSqrt(ii);
- NMM[i] = (nmm2 / NMM_ROC_period) * 1000;
- }
- for(i = limit; i >= 0; i--)
- if(i < Bars - NMM_ROC_period - 1 - NMM_ROC_LB)
- NMM_ROCx[i] = NMM[i] - NMM[i+NMM_ROC_LB];
- for(i = limit; i >= 0; i--)
- if(i < Bars - NMM_ROC_period - 1 - NMM_ROC_LB - NMM_ROC_AvgLen)
- {
- double WtdSum = 0;
- for(ii = 0; ii < NMM_ROC_AvgLen; ii++)
- WtdSum += (NMM_ROC_AvgLen - ii) * NMM_ROCx[i+ii];
- NMM_ROC[i] = WtdSum / ((NMM_ROC_AvgLen + 1) * NMM_ROC_AvgLen * 0.5);
- if(Show_ZH) { if(NMM_ROC[i] == 0) ZH[i] = ZH_displacement; else ZH[i] = EMPTY_VALUE; }
- }
- if(Show_SD)
- for(i = limit; i >= 0; i--)
- if(i < Bars - NMM_ROC_period - 1 - NMM_ROC_LB - NMM_ROC_AvgLen - SD_len)
- {
- if(Show_SD_1line_only)
- {
- if(NMM_ROC[i] == 0) SD[i] = 0;
- else if(NMM_ROC[i] > 0) SD[i] = iBandsOnArray(NMM_ROC, 0, SD_len, SD_up, 0, MODE_UPPER, i);
- else if(NMM_ROC[i] < 0) SD[i] = iBandsOnArray(NMM_ROC, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
- }
- else
- {
- if(NMM_ROC[i] == 0)
- {
- if(Show_SD_2lines_up) SD[i] = 0;
- if(Show_SD_2lines_dn) SD2[i] = 0;
- }
- else
- {
- if(Show_SD_2lines_up) SD[i] = iBandsOnArray(NMM_ROC, 0, SD_len, SD_up, 0, MODE_UPPER, i);
- if(Show_SD_2lines_dn) SD2[i] = iBandsOnArray(NMM_ROC, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
- }
- }
- }
- if(Show_NMA)
- for(i = limit; i >= 0; i--)
- if(i < Bars - NMM_ROC_period - 1 - NMM_ROC_LB - NMM_ROC_AvgLen - NMA_period)
- {
- ratio = 0;
- sum = (NMM_ROC[i] - NMM_ROC[i+1]) + (NMM_ROC[i+1] - NMM_ROC[i+2]) * (MathSqrt(2)-1);
- for(ii = 2; ii < NMA_period; ii++)
- sum += (NMM_ROC[i+ii] - NMM_ROC[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
- abssum = MathAbs(sum);
- sum = 0;
- for(ii = 0; ii < NMA_period; ii++)
- sum += MathAbs(NMM_ROC[i+ii] - NMM_ROC[i+ii+1]);
- if(sum != 0) ratio = abssum / sum;
- NMM_ROC_NMA[i] = NMM_ROC_NMA[i+1] + (NMM_ROC[i] - NMM_ROC_NMA[i+1]) * ratio;
- }
- if(Show_FastNMA)
- for(i = limit; i >= 0; i--)
- if(i < Bars - NMM_ROC_period - 1 - NMM_ROC_LB - NMM_ROC_AvgLen - NMA_period)
- {
- maxnmmroc = 0; ratio = 0;
- int NMA_LB_max;
- for(ii = 1; ii <= NMA_period; ii++)
- {
- nmmrocnum = (NMM_ROC[i] - NMM_ROC[i+ii]) / MathSqrt(ii);
- if(MathAbs(nmmrocnum) > maxnmmroc) { maxnmmroc = MathAbs(nmmrocnum); NMA_LB_max = ii; }
- }
- if(NMA_LB_max < NMA_LB_min) NMA_LB_max = NMA_LB_min;
- sum = (NMM_ROC[i] - NMM_ROC[i+1]) + (NMM_ROC[i+1] - NMM_ROC[i+2]) * (MathSqrt(2)-1);
- for(ii = 2; ii < NMA_LB_max; ii++)
- sum += (NMM_ROC[i+ii] - NMM_ROC[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
- abssum = MathAbs(sum);
- sum = 0;
- for(ii = 0; ii < NMA_LB_max; ii++)
- sum += MathAbs(NMM_ROC[i+ii] - NMM_ROC[i+ii+1]);
- if(sum != 0) ratio = abssum / sum;
- NMM_ROC_FastNMA[i] = NMM_ROC_FastNMA[i+1] + (NMM_ROC[i] - NMM_ROC_FastNMA[i+1]) * ratio;
- }
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement