Advertisement
Guest User

Ocn_FastNMAvsNMA_NMS

a guest
Aug 21st, 2012
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.96 KB | None | 0 0
  1. // Ocn_FastNMAvsNMA_NMS version 1.00
  2. #property  copyright "NMA & NMS algorithms © jim sloman, for metatrader programmed by udc"
  3. #property  link      "udc@seznam.cz"
  4.  
  5. #property indicator_separate_window
  6. #property indicator_buffers 5
  7. #property indicator_color1 Magenta
  8. #property indicator_color2 Lime
  9. #property indicator_color3 Silver
  10. #property indicator_color4 Silver
  11. #property indicator_color5 Silver
  12. #property indicator_level1 0
  13. #property indicator_levelcolor Gray
  14. #property indicator_levelstyle 2
  15.  
  16. extern int    NMA_period           = 40;
  17. extern int    FastNMA_period       = 40;
  18. extern int    FastNMA_LB_min       = 8;
  19. extern int    NMS_period           = 40;
  20. extern bool   Show_ZH              = true;
  21. extern double ZH_displacement      = 0;
  22. extern int    ZH_symbol            = 119;
  23. extern bool   HistogramInsteadLine = false;
  24. extern bool   Show_SD              = false;
  25. extern int    SD_len               = 30;
  26. extern double SD_up                = 2;
  27. extern double SD_dn                = 2;
  28. extern bool   Show_SD_1line_only   = false;
  29. extern bool   Show_SD_3lines_up    = true;
  30. extern bool   Show_SD_3lines_dn    = true;
  31. extern bool   Show_SD_3lines_md    = true;
  32. extern bool   Zero_SD_3lines_when_ZH = false;
  33.  
  34. double FastNMAvsNMA_NMS[];
  35. double ZH[];
  36. double SD[];
  37. double SD2[];
  38. double SD3[];
  39. double NMA[];
  40. double FastNMA[];
  41. double FastNMAvsNMA[];
  42.  
  43. int init()
  44. {
  45.   string name = "FastNMAvsNMA_NMS(" + NMA_period + ", " + FastNMA_period + ", " + FastNMA_LB_min + ", " + NMS_period + ")";
  46.   IndicatorShortName(name);
  47.   IndicatorBuffers(8);
  48.   SetIndexBuffer(0, FastNMAvsNMA_NMS);
  49.   SetIndexLabel(0, name);
  50.   if(HistogramInsteadLine) SetIndexStyle(0, DRAW_HISTOGRAM);
  51.   else                     SetIndexStyle(0, DRAW_LINE);
  52.   SetIndexBuffer(1, ZH);
  53.   SetIndexLabel(1, "FastNMAvsNMA_NMS_ZH");
  54.   SetIndexStyle(1, DRAW_ARROW);
  55.   SetIndexArrow(1, ZH_symbol);
  56.   SetIndexBuffer(2, SD);
  57.   SetIndexBuffer(3, SD2);
  58.   SetIndexBuffer(4, SD3);
  59.   if(Show_SD_1line_only)
  60.     {
  61.     SetIndexLabel(2, "FastNMAvsNMA_NMS_SD(" + SD_len + ")");
  62.     SetIndexLabel(3, "unused");
  63.     SetIndexLabel(4, "unused");
  64.     }
  65.   else
  66.     {
  67.     if(Show_SD_3lines_up) SetIndexLabel(2, "FastNMAvsNMA_NMS_SD_up(" + SD_len + ")");
  68.     else                  SetIndexLabel(2, "unused");
  69.     if(Show_SD_3lines_dn) SetIndexLabel(3, "FastNMAvsNMA_NMS_SD_dn(" + SD_len + ")");
  70.     else                  SetIndexLabel(3, "unused");
  71.     if(Show_SD_3lines_md) SetIndexLabel(4, "FastNMAvsNMA_NMS_SD_md(" + SD_len + ")");
  72.     else                  SetIndexLabel(4, "unused");
  73.     }
  74.   SetIndexBuffer(5, NMA);
  75.   SetIndexBuffer(6, FastNMA);
  76.   SetIndexBuffer(7, FastNMAvsNMA);
  77.   return(0);
  78. }
  79.  
  80. int start()
  81. {
  82.   int limit, i, ii, counted_bars = IndicatorCounted()-1;
  83.   int max = MathMax(NMA_period, FastNMA_period);
  84.   double nmasum, nmaabssum, nmaratio, nmmnum, maxnmm, fastnmasum, fastnmaabssum, fastnmaratio, temp, nms2;
  85.   bool nmadone, fastnmadone;
  86.  
  87.   if(Bars <= max+NMS_period) return(0);
  88.   if(counted_bars < 0) counted_bars = 0;
  89.   if(counted_bars > max) limit = Bars - counted_bars;
  90.   else                   limit = Bars - max - 1;
  91.  
  92.   for(i = limit; i >= 0; i--)
  93.     {
  94.     if(i == Bars - max - 1) { NMA[i+1] = Close[i+1]; FastNMA[i+1] = Close[i+1]; }
  95.     nmaratio = 0; maxnmm = 0; fastnmaratio = 0;
  96.     int NMA_LB_max;
  97.     for(ii = 1; ii <= FastNMA_period; ii++)
  98.       {
  99.       nmmnum = (MathLog(Close[i]) - MathLog(Close[i+ii])) / MathSqrt(ii);
  100.       if(MathAbs(nmmnum) > maxnmm) { maxnmm = MathAbs(nmmnum); NMA_LB_max = ii; }
  101.       }
  102.     if(NMA_LB_max < FastNMA_LB_min) NMA_LB_max = FastNMA_LB_min;
  103.     nmasum = (MathLog(Close[i]) - MathLog(Close[i+1])) + (MathLog(Close[i+1]) - MathLog(Close[i+2])) * (MathSqrt(2)-1);
  104.     fastnmasum = nmasum;
  105.     nmadone = false; fastnmadone = false; ii = 2;
  106.     while( !(nmadone) || !(fastnmadone) )
  107.       {
  108.       temp = (MathLog(Close[i+ii]) - MathLog(Close[i+ii+1])) * (MathSqrt(ii+1) - MathSqrt(ii));
  109.       if(ii >= NMA_period) nmadone=true;
  110.       else                 nmasum += temp;
  111.       if(ii >= NMA_LB_max) fastnmadone=true;
  112.       else                 fastnmasum += temp;
  113.       ii++;
  114.       }
  115.     nmaabssum = MathAbs(nmasum);
  116.     fastnmaabssum = MathAbs(fastnmasum);
  117.     nmasum = 0; fastnmasum = 0;
  118.     nmadone = false; fastnmadone = false; ii = 0;
  119.     while( !(nmadone) || !(fastnmadone) )
  120.       {
  121.       temp = MathAbs(MathLog(Close[i+ii]) - MathLog(Close[i+ii+1]));
  122.       if(ii >= NMA_period) nmadone=true;
  123.       else                 nmasum += temp;
  124.       if(ii >= NMA_LB_max) fastnmadone=true;
  125.       else                 fastnmasum += temp;
  126.       ii++;
  127.       }
  128.     if(nmasum != 0) nmaratio = nmaabssum / nmasum;
  129.     if(fastnmasum != 0) fastnmaratio = fastnmaabssum / fastnmasum;
  130.     NMA[i] = NMA[i+1] + (Close[i] - NMA[i+1]) * nmaratio;
  131.     FastNMA[i] = FastNMA[i+1] + (Close[i] - FastNMA[i+1]) * fastnmaratio;
  132.     FastNMAvsNMA[i] = FastNMA[i] - NMA[i];
  133.     }
  134.  
  135.   for(i = limit; i >= 0; i--)
  136.     if(i < Bars - max - 1 - NMS_period)
  137.       {
  138.       nms2 = 0;
  139.       for(ii = 1; ii <= NMS_period; ii++)
  140.         {
  141.         double oLRSlope = 0, SumXY = 0, SumY = 0, SumX, SumXSqr, Divisor;
  142.         if(ii > 1)
  143.           {
  144.           SumX = ii * (ii - 1) * 0.5;
  145.           SumXSqr = ii * (ii - 1) * (2 * ii - 1) * 1/6;
  146.           Divisor = (SumX * SumX) - ii * SumXSqr;
  147.           for(int iii = 0; iii < ii; iii++)
  148.             {
  149.             SumXY += iii * FastNMAvsNMA[i+iii];
  150.             SumY += FastNMAvsNMA[i+iii];
  151.             }
  152.           oLRSlope = (ii * SumXY - SumX * SumY) / Divisor;
  153.           }
  154.         nms2 += oLRSlope * MathSqrt(ii);
  155.         }
  156.       FastNMAvsNMA_NMS[i] = nms2 * 100;
  157.       if(Show_ZH) { if(FastNMAvsNMA_NMS[i] == 0) ZH[i] = ZH_displacement; else ZH[i] = EMPTY_VALUE; }
  158.       }
  159.  
  160.   if(Show_SD)
  161.     for(i = limit; i >= 0; i--)
  162.       if(i < Bars - max - 1 - NMS_period - SD_len)
  163.         {
  164.         if(Show_SD_1line_only)
  165.           {
  166.           if(FastNMAvsNMA_NMS[i] == 0)     SD[i] = 0;
  167.           else if(FastNMAvsNMA_NMS[i] > 0) SD[i] = iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  168.           else if(FastNMAvsNMA_NMS[i] < 0) SD[i] = iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  169.           }
  170.         else
  171.           {
  172.           if((Zero_SD_3lines_when_ZH) && (FastNMAvsNMA_NMS[i] == 0))
  173.             {
  174.             if(Show_SD_3lines_up) SD[i] = 0;
  175.             if(Show_SD_3lines_dn) SD2[i] = 0;
  176.             if(Show_SD_3lines_md) SD3[i] = 0;
  177.             }
  178.           else
  179.             {
  180.             if(Show_SD_3lines_up) SD[i] = iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  181.             if(Show_SD_3lines_dn) SD2[i] = iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  182.             if(Show_SD_3lines_md) SD3[i] = (iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_up, 0, MODE_UPPER, i)+
  183.                                             iBandsOnArray(FastNMAvsNMA_NMS, 0, SD_len, SD_dn, 0, MODE_LOWER, i) ) / 2;
  184.             }
  185.           }
  186.         }
  187.  
  188.   return(0);
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement