Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Ocn_FastNMAvsNMA_MTF version 1.10
- #property copyright "NMA algorithm © jim sloman, for metatrader programmed by udc"
- #property link "[email protected]"
- #property indicator_separate_window
- #property indicator_buffers 4
- #property indicator_color1 Magenta
- #property indicator_color2 Silver
- #property indicator_color3 Silver
- #property indicator_color4 Silver
- #property indicator_level1 0
- #property indicator_levelcolor Gray
- #property indicator_levelstyle 2
- extern int TF = 0;
- extern int NMA_period = 40;
- extern int FastNMA_period = 40;
- extern int FastNMA_LB_min = 8;
- 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 ValuesInPips = false;
- extern int MaxBars = 0;
- double FastNMAvsNMA[];
- double SD[];
- double SD2[];
- double SD3[];
- int NMAmtfbars;
- double NMAmtf[][3];
- double FastNMAvsNMAmtf[];
- double point;
- int init()
- {
- string tf = "";
- if(TF == PERIOD_M1) tf = "_M1";
- else if(TF == PERIOD_M5) tf = "_M5";
- else if(TF == PERIOD_M15) tf = "_M15";
- else if(TF == PERIOD_M30) tf = "_M30";
- else if(TF == PERIOD_H1) tf = "_H1";
- else if(TF == PERIOD_H4) tf = "_H4";
- else if(TF == PERIOD_D1) tf = "_D1";
- else if(TF == PERIOD_W1) tf = "_W1";
- else if(TF == PERIOD_MN1) tf = "_MN1";
- else TF = Period();
- string indiname = "FastNMAvsNMA" + tf;
- string name = indiname + "(" + NMA_period + ", " + FastNMA_period + ", " + FastNMA_LB_min + ")";
- IndicatorShortName(name);
- IndicatorBuffers(4);
- SetIndexBuffer(0, FastNMAvsNMA);
- SetIndexLabel(0, name);
- SetIndexBuffer(1, SD);
- SetIndexBuffer(2, SD2);
- SetIndexBuffer(3, SD3);
- if(Show_SD_1line_only)
- {
- SetIndexLabel(1, indiname + "_SD(" + SD_len + ")");
- SetIndexLabel(2, "unused");
- SetIndexLabel(3, "unused");
- }
- else
- {
- if(Show_SD_3lines_up) SetIndexLabel(1, indiname + "_SD_up(" + SD_len + ")");
- else SetIndexLabel(1, "unused");
- if(Show_SD_3lines_dn) SetIndexLabel(2, indiname + "_SD_dn(" + SD_len + ")");
- else SetIndexLabel(2, "unused");
- if(Show_SD_3lines_md) SetIndexLabel(3, indiname + "_SD_md(" + SD_len + ")");
- else SetIndexLabel(3, "unused");
- }
- point = Point;
- if(MarketInfo("EURUSD", MODE_POINT) == 0.00001) point *= 10;
- int bars = Bars;
- if( (MaxBars > 0) && (MaxBars < bars) ) bars = MaxBars;
- NMAmtfbars = MathMin(bars * Period() / TF, iBars(NULL, TF));
- ArrayResize(NMAmtf, NMAmtfbars); ArrayInitialize(NMAmtf, 0);
- ArrayResize(FastNMAvsNMAmtf, NMAmtfbars); ArrayInitialize(FastNMAvsNMAmtf, 0); ArraySetAsSeries(FastNMAvsNMAmtf, true);
- return(0);
- }
- int start()
- {
- int limit, i, ii, counted_bars = IndicatorCounted()-1, bars = Bars, nearestbar;
- double nmasum, nmaabssum, nmaratio, nmmnum, maxnmm, fastnmasum, fastnmaabssum, fastnmaratio, temp;
- bool nmadone, fastnmadone;
- if( (MaxBars > 0) && (MaxBars < bars) ) bars = MaxBars;
- if(counted_bars <= 1) limit = bars - 1;
- else limit = bars - counted_bars;
- if(limit < 1) limit = 1;
- NMAmtfcalc();
- for(i = limit; i >= 0; i--)
- {
- nearestbar = iBarShift(NULL, TF, Time[i]);
- if(nearestbar < iBars(NULL, TF) - MathMax(NMA_period, FastNMA_period))
- {
- FastNMAvsNMA[i] = FastNMAvsNMAmtf[nearestbar];
- if( (Show_SD) && (nearestbar < iBars(NULL, TF) - MathMax(NMA_period, FastNMA_period) - SD_len) )
- {
- if(Show_SD_1line_only)
- {
- if(FastNMAvsNMAmtf[nearestbar] == 0) SD[i] = 0;
- else if(FastNMAvsNMAmtf[nearestbar] > 0) SD[i] = iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_up, 0, MODE_UPPER, nearestbar);
- else if(FastNMAvsNMAmtf[nearestbar] < 0) SD[i] = iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_dn, 0, MODE_LOWER, nearestbar);
- }
- else
- {
- if(Show_SD_3lines_up) SD[i] = iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_up, 0, MODE_UPPER, nearestbar);
- if(Show_SD_3lines_dn) SD2[i] = iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_dn, 0, MODE_LOWER, nearestbar);
- if(Show_SD_3lines_md) SD3[i] = (iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_up, 0, MODE_UPPER, nearestbar)+
- iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_dn, 0, MODE_LOWER, nearestbar) ) / 2;
- }
- }
- }
- }
- return(0);
- }
- void NMAmtfcalc()
- {
- int i, ii, iii, NMAoldestbar = NMAmtfbars-1 - MathMax(NMA_period, FastNMA_period);
- bool found;
- for(i = NMAoldestbar; i >= 2; i--)
- if(NMAmtf[i][0] != iTime(NULL, TF, i))
- {
- if(i == NMAoldestbar)
- {
- found = false; ii = 1;
- while( !(found) && (i-ii >= 0) )
- if(NMAmtf[i-ii][0] == iTime(NULL, TF, i)) found = true;
- else ii++;
- if(found)
- {
- for(iii = i; iii >= 0; iii--)
- if(iii-ii >= 0)
- {
- NMAmtf[iii][0] = NMAmtf[iii-ii][0];
- NMAmtf[iii][1] = NMAmtf[iii-ii][1];
- NMAmtf[iii][2] = NMAmtf[iii-ii][2];
- FastNMAvsNMAmtf[iii] = FastNMAvsNMAmtf[iii-ii];
- }
- else
- {
- NMAmtf[iii][0] = 0;
- NMAmtf[iii][1] = 0;
- NMAmtf[iii][2] = 0;
- FastNMAvsNMAmtf[iii] = 0;
- }
- }
- else
- {
- NMAmtf[i+1][1] = iClose(NULL, TF, i+1);
- NMAmtf[i+1][2] = iClose(NULL, TF, i+1);
- NMAmtf[i][0] = iTime(NULL, TF, i); NMAcalc(i);
- }
- }
- else
- {
- NMAmtf[i][0] = iTime(NULL, TF, i); NMAcalc(i);
- }
- }
- NMAmtf[1][0] = iTime(NULL, TF, 1); NMAcalc(1);
- NMAmtf[0][0] = iTime(NULL, TF, 0); NMAcalc(0);
- }
- void NMAcalc(int i)
- {
- int ii;
- double nmasum, nmaabssum, nmaratio, nmmnum, maxnmm, fastnmasum, fastnmaabssum, fastnmaratio, temp;
- bool nmadone, fastnmadone;
- nmaratio = 0; maxnmm = 0; fastnmaratio = 0;
- int NMA_LB_max;
- for(ii = 1; ii <= FastNMA_period; ii++)
- {
- nmmnum = (MathLog(iClose(NULL, TF, i)) - MathLog(iClose(NULL, TF, 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(iClose(NULL, TF, i)) - MathLog(iClose(NULL, TF, i+1))) + (MathLog(iClose(NULL, TF, i+1)) - MathLog(iClose(NULL, TF, i+2))) * (MathSqrt(2)-1);
- fastnmasum = nmasum;
- nmadone = false; fastnmadone = false; ii = 2;
- while( !(nmadone) || !(fastnmadone) )
- {
- temp = (MathLog(iClose(NULL, TF, i+ii)) - MathLog(iClose(NULL, TF, 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(iClose(NULL, TF, i+ii)) - MathLog(iClose(NULL, TF, 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;
- NMAmtf[i][1] = NMAmtf[i+1][1] + (iClose(NULL, TF, i) - NMAmtf[i+1][1]) * nmaratio;
- NMAmtf[i][2] = NMAmtf[i+1][2] + (iClose(NULL, TF, i) - NMAmtf[i+1][2]) * fastnmaratio;
- FastNMAvsNMAmtf[i] = NMAmtf[i][2] - NMAmtf[i][1]; if(ValuesInPips) FastNMAvsNMAmtf[i] = FastNMAvsNMAmtf[i] / point;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement