Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Ocn_FastNMAvsNMA_NMS version 1.00
- #property copyright "NMA & NMS algorithms © jim sloman, for metatrader programmed by udc"
- #property link "udc@seznam.cz"
- #property indicator_separate_window
- #property indicator_buffers 5
- #property indicator_color1 Magenta
- #property indicator_color2 Lime
- #property indicator_color3 Silver
- #property indicator_color4 Silver
- #property indicator_color5 Silver
- #property indicator_level1 0
- #property indicator_levelcolor Gray
- #property indicator_levelstyle 2
- extern int NMA_period = 40;
- extern int FastNMA_period = 40;
- extern int FastNMA_LB_min = 8;
- extern int NMS_period = 40;
- extern bool Show_ZH = true;
- extern double ZH_displacement = 0;
- extern int ZH_symbol = 119;
- extern bool HistogramInsteadLine = false;
- extern bool Show_SD = false;
- extern int SD_len = 30;
- extern double SD_up = 2;
- extern double SD_dn = 2;
- extern bool Show_SD_1line_only = false;
- extern bool Show_SD_3lines_up = true;
- extern bool Show_SD_3lines_dn = true;
- extern bool Show_SD_3lines_md = true;
- extern bool Zero_SD_3lines_when_ZH = false;
- double FastNMAvsNMA_NMS[];
- double ZH[];
- double SD[];
- double SD2[];
- double SD3[];
- double NMA[];
- double FastNMA[];
- double FastNMAvsNMA[];
- int init()
- {
- string name = "FastNMAvsNMA_NMS(" + NMA_period + ", " + FastNMA_period + ", " + FastNMA_LB_min + ", " + NMS_period + ")";
- IndicatorShortName(name);
- IndicatorBuffers(8);
- SetIndexBuffer(0, FastNMAvsNMA_NMS);
- SetIndexLabel(0, name);
- if(HistogramInsteadLine) SetIndexStyle(0, DRAW_HISTOGRAM);
- else SetIndexStyle(0, DRAW_LINE);
- SetIndexBuffer(1, ZH);
- SetIndexLabel(1, "FastNMAvsNMA_NMS_ZH");
- SetIndexStyle(1, DRAW_ARROW);
- SetIndexArrow(1, ZH_symbol);
- SetIndexBuffer(2, SD);
- SetIndexBuffer(3, SD2);
- SetIndexBuffer(4, SD3);
- if(Show_SD_1line_only)
- {
- SetIndexLabel(2, "FastNMAvsNMA_NMS_SD(" + SD_len + ")");
- SetIndexLabel(3, "unused");
- SetIndexLabel(4, "unused");
- }
- else
- {
- if(Show_SD_3lines_up) SetIndexLabel(2, "FastNMAvsNMA_NMS_SD_up(" + SD_len + ")");
- else SetIndexLabel(2, "unused");
- if(Show_SD_3lines_dn) SetIndexLabel(3, "FastNMAvsNMA_NMS_SD_dn(" + SD_len + ")");
- else SetIndexLabel(3, "unused");
- if(Show_SD_3lines_md) SetIndexLabel(4, "FastNMAvsNMA_NMS_SD_md(" + SD_len + ")");
- else SetIndexLabel(4, "unused");
- }
- SetIndexBuffer(5, NMA);
- SetIndexBuffer(6, FastNMA);
- SetIndexBuffer(7, FastNMAvsNMA);
- return(0);
- }
- int start()
- {
- int limit, i, ii, counted_bars = IndicatorCounted()-1;
- int max = MathMax(NMA_period, FastNMA_period);
- double nmasum, nmaabssum, nmaratio, nmmnum, maxnmm, fastnmasum, fastnmaabssum, fastnmaratio, temp, nms2;
- bool nmadone, fastnmadone;
- if(Bars <= max+NMS_period) return(0);
- if(counted_bars < 0) counted_bars = 0;
- if(counted_bars > max) limit = Bars - counted_bars;
- else limit = Bars - max - 1;
- for(i = limit; i >= 0; i--)
- {
- if(i == Bars - max - 1) { NMA[i+1] = Close[i+1]; FastNMA[i+1] = Close[i+1]; }
- nmaratio = 0; maxnmm = 0; fastnmaratio = 0;
- int NMA_LB_max;
- for(ii = 1; ii <= FastNMA_period; ii++)
- {
- nmmnum = (MathLog(Close[i]) - MathLog(Close[i+ii])) / MathSqrt(ii);
- if(MathAbs(nmmnum) > maxnmm) { maxnmm = MathAbs(nmmnum); NMA_LB_max = ii; }
- }
- if(NMA_LB_max < FastNMA_LB_min) NMA_LB_max = FastNMA_LB_min;
- nmasum = (MathLog(Close[i]) - MathLog(Close[i+1])) + (MathLog(Close[i+1]) - MathLog(Close[i+2])) * (MathSqrt(2)-1);
- fastnmasum = nmasum;
- nmadone = false; fastnmadone = false; ii = 2;
- while( !(nmadone) || !(fastnmadone) )
- {
- temp = (MathLog(Close[i+ii]) - MathLog(Close[i+ii+1])) * (MathSqrt(ii+1) - MathSqrt(ii));
- if(ii >= NMA_period) nmadone=true;
- else nmasum += temp;
- if(ii >= NMA_LB_max) fastnmadone=true;
- else fastnmasum += temp;
- ii++;
- }
- nmaabssum = MathAbs(nmasum);
- fastnmaabssum = MathAbs(fastnmasum);
- nmasum = 0; fastnmasum = 0;
- nmadone = false; fastnmadone = false; ii = 0;
- while( !(nmadone) || !(fastnmadone) )
- {
- temp = MathAbs(MathLog(Close[i+ii]) - MathLog(Close[i+ii+1]));
- if(ii >= NMA_period) nmadone=true;
- else nmasum += temp;
- if(ii >= NMA_LB_max) fastnmadone=true;
- else fastnmasum += temp;
- ii++;
- }
- if(nmasum != 0) nmaratio = nmaabssum / nmasum;
- if(fastnmasum != 0) fastnmaratio = fastnmaabssum / fastnmasum;
- NMA[i] = NMA[i+1] + (Close[i] - NMA[i+1]) * nmaratio;
- FastNMA[i] = FastNMA[i+1] + (Close[i] - FastNMA[i+1]) * fastnmaratio;
- FastNMAvsNMA[i] = FastNMA[i] - NMA[i];
- }
- for(i = limit; i >= 0; i--)
- if(i < Bars - max - 1 - NMS_period)
- {
- nms2 = 0;
- for(ii = 1; ii <= NMS_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 * FastNMAvsNMA[i+iii];
- SumY += FastNMAvsNMA[i+iii];
- }
- oLRSlope = (ii * SumXY - SumX * SumY) / Divisor;
- }
- nms2 += oLRSlope * MathSqrt(ii);
- }
- FastNMAvsNMA_NMS[i] = nms2 * 100;
- if(Show_ZH) { if(FastNMAvsNMA_NMS[i] == 0) ZH[i] = ZH_displacement; else ZH[i] = EMPTY_VALUE; }
- }
- if(Show_SD)
- for(i = limit; i >= 0; i--)
- if(i < Bars - max - 1 - NMS_period - SD_len)
- {
- if(Show_SD_1line_only)
- {
- if(FastNMAvsNMA_NMS[i] == 0) SD[i] = 0;
- else if(FastNMAvsNMA_NMS[i] > 0) SD[i] = iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_up, 0, MODE_UPPER, i);
- else if(FastNMAvsNMA_NMS[i] < 0) SD[i] = iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
- }
- else
- {
- if((Zero_SD_3lines_when_ZH) && (FastNMAvsNMA_NMS[i] == 0))
- {
- if(Show_SD_3lines_up) SD[i] = 0;
- if(Show_SD_3lines_dn) SD2[i] = 0;
- if(Show_SD_3lines_md) SD3[i] = 0;
- }
- else
- {
- if(Show_SD_3lines_up) SD[i] = iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_up, 0, MODE_UPPER, i);
- if(Show_SD_3lines_dn) SD2[i] = iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
- if(Show_SD_3lines_md) SD3[i] = (iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_up, 0, MODE_UPPER, i)+
- iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_dn, 0, MODE_LOWER, i) ) / 2;
- }
- }
- }
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement