Advertisement
Guest User

Ocn_NMC2x

a guest
Apr 8th, 2012
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.34 KB | None | 0 0
  1. #property indicator_separate_window
  2. #property indicator_buffers 6
  3. #property indicator_color1 Magenta
  4. #property indicator_color2 Lime
  5. #property indicator_color3 Silver
  6. #property indicator_color4 Silver
  7. #property indicator_color5 Yellow
  8. #property indicator_color6 Aqua
  9. #property indicator_level1 0
  10. #property indicator_levelcolor Gray
  11. #property indicator_levelstyle 2
  12.  
  13. extern int    NMC2_period         = 40;
  14. extern bool   Use_NMR_instead_NMM = false;
  15. extern bool   Show_ZH             = true;
  16. extern double ZH_displacement     = 1;
  17. extern int    ZH_symbol           = 115;
  18. extern bool   Show_SD             = true;
  19. extern int    SD_len              = 30;
  20. extern double SD_up               = 2;
  21. extern double SD_dn               = 2;
  22. extern bool   Show_SD_1line_only  = true;
  23. extern bool   Show_SD_2lines_up   = true;
  24. extern bool   Show_SD_2lines_dn   = true;
  25. extern int    NMA_period          = 40;
  26. extern int    NMA_LB_min          = 8;
  27. extern bool   Show_NMA            = true;
  28. extern bool   Show_FastNMA        = true;
  29.  
  30. double NMC2[];
  31. double ZH[];
  32. double SD[];
  33. double SD2[];
  34. double NMC2_NMA[];
  35. double NMC2_FastNMA[];
  36.  
  37. int init()
  38. {
  39.   string whichone = "NMM";
  40.   if(Use_NMR_instead_NMM) whichone = "NMR";
  41.   string nmc2name = "NMC2(" + NMC2_period + ", using " + whichone + ")";
  42.   IndicatorShortName(nmc2name);
  43.   IndicatorBuffers(6);
  44.   SetIndexBuffer(0, NMC2);
  45.   SetIndexLabel(0, nmc2name);
  46.   SetIndexBuffer(1, ZH);
  47.   SetIndexLabel(1, "NMC2_ZH");
  48.   SetIndexStyle(1, DRAW_ARROW);
  49.   SetIndexArrow(1, ZH_symbol);
  50.   SetIndexBuffer(2, SD);
  51.   SetIndexBuffer(3, SD2);
  52.   if(Show_SD_1line_only)
  53.     {
  54.     SetIndexLabel(2, "NMC2_SD(" + SD_len + ")");
  55.     SetIndexLabel(3, "unused");
  56.     }
  57.   else
  58.     {
  59.     if(Show_SD_2lines_up) SetIndexLabel(2, "NMC2_SD_up(" + SD_len + ")");
  60.     else                  SetIndexLabel(2, "unused");
  61.     if(Show_SD_2lines_dn) SetIndexLabel(3, "NMC2_SD_dn(" + SD_len + ")");
  62.     else                  SetIndexLabel(3, "unused");
  63.     }
  64.   SetIndexBuffer(4, NMC2_NMA);
  65.   SetIndexBuffer(5, NMC2_FastNMA);
  66.   if(Show_NMA) SetIndexLabel(4, "NMC2_NMA(" + NMA_period + ")");
  67.   else         SetIndexLabel(4, "unused");
  68.   if(Show_FastNMA) SetIndexLabel(5, "NMC2_FastNMA(" + NMA_period + ", " + NMA_LB_min + ")");
  69.   else             SetIndexLabel(5, "unused");
  70.   return(0);
  71. }
  72.  
  73. int start()
  74. {
  75.   int limit, i, ii, counted_bars = IndicatorCounted();
  76.   double nms, nmm, nmr, nms2, nmm2, nmr2, whichone, avg, sign, sum, abssum, ratio, nmc2num, maxnmc2;
  77.  
  78.   if(Bars <= NMC2_period) return(0);
  79.   if(counted_bars < 0) counted_bars = 0;
  80.   if(counted_bars > NMC2_period) limit = Bars - counted_bars;
  81.   else                           limit = Bars - NMC2_period - 1;
  82.  
  83.   for(i = limit; i >= 0; i--)
  84.     {
  85.     nms2 = 0; nmm2 = 0; nmr2 = 0;
  86.     for(ii = 1; ii <= NMC2_period; ii++)
  87.       {
  88.       double oLRSlope = 0, SumXY = 0, SumY = 0, SumX, SumXSqr, Divisor;
  89.       if(ii > 1)
  90.         {
  91.         SumX = ii * (ii - 1) * 0.5;
  92.         SumXSqr = ii * (ii - 1) * (2 * ii - 1) * 1/6;
  93.         Divisor = (SumX * SumX) - ii * SumXSqr;
  94.         for(int iii = 0; iii < ii; iii++)
  95.           {
  96.           SumXY += iii * MathLog(Close[i+iii]);
  97.           SumY += MathLog(Close[i+iii]);
  98.           }
  99.         oLRSlope = (ii * SumXY - SumX * SumY) / Divisor;
  100.         }
  101.       nms2 += oLRSlope * MathSqrt(ii);
  102.       nmm2 += (MathLog(Close[i]) - MathLog(Close[i+ii])) / MathSqrt(ii);
  103.       nmr2 += (MathLog(Close[i+ii-1]) - MathLog(Close[i+ii])) * (MathSqrt(ii) - MathSqrt(ii-1));
  104.       }
  105.     nms = nms2 * 100;
  106.     nmm = (nmm2 / NMC2_period) * 1000;
  107.     nmr = nmr2 * 1000;
  108.     if(Use_NMR_instead_NMM) whichone = nmr;
  109.     else                    whichone = nmm;
  110.     avg = ((MathAbs(nms) * whichone) + (MathAbs(whichone) * nms)) / 2;
  111.     if(avg > 0)      sign = 1;
  112.     else if(avg < 0) sign = -1;
  113.     else             sign = 0;
  114.     NMC2[i] = sign * MathSqrt(MathAbs(avg));
  115.     if(Show_ZH) { if(NMC2[i] == 0) ZH[i] = ZH_displacement; else ZH[i] = EMPTY_VALUE; }
  116.     }
  117.  
  118.   if(Show_SD)
  119.     for(i = limit; i >= 0; i--)
  120.       if(i < Bars - NMC2_period - 1 - SD_len)
  121.         {
  122.         if(Show_SD_1line_only)
  123.           {
  124.           if(NMC2[i] == 0)     SD[i] = 0;
  125.           else if(NMC2[i] > 0) SD[i] = iBandsOnArray(NMC2, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  126.           else if(NMC2[i] < 0) SD[i] = iBandsOnArray(NMC2, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  127.           }
  128.         else
  129.           {
  130.           if(NMC2[i] == 0)
  131.             {
  132.             if(Show_SD_2lines_up) SD[i] = 0;
  133.             if(Show_SD_2lines_dn) SD2[i] = 0;
  134.             }
  135.           else
  136.             {
  137.             if(Show_SD_2lines_up) SD[i] = iBandsOnArray(NMC2, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  138.             if(Show_SD_2lines_dn) SD2[i] = iBandsOnArray(NMC2, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  139.             }
  140.           }
  141.         }
  142.  
  143.   if(Show_NMA)
  144.     for(i = limit; i >= 0; i--)
  145.       if(i < Bars - NMC2_period - 1 - NMA_period)
  146.         {
  147.         ratio = 0;
  148.         sum = (NMC2[i] - NMC2[i+1]) + (NMC2[i+1] - NMC2[i+2]) * (MathSqrt(2)-1);
  149.         for(ii = 2; ii < NMA_period; ii++)
  150.           sum += (NMC2[i+ii] - NMC2[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
  151.         abssum = MathAbs(sum);
  152.         sum = 0;
  153.         for(ii = 0; ii < NMA_period; ii++)
  154.           sum += MathAbs(NMC2[i+ii] - NMC2[i+ii+1]);
  155.         if(sum != 0) ratio = abssum / sum;
  156.         NMC2_NMA[i] = NMC2_NMA[i+1] + (NMC2[i] - NMC2_NMA[i+1]) * ratio;
  157.         }
  158.  
  159.   if(Show_FastNMA)
  160.     for(i = limit; i >= 0; i--)
  161.       if(i < Bars - NMC2_period - 1 - NMA_period)
  162.         {
  163.         maxnmc2 = 0; ratio = 0;
  164.         int NMA_LB_max;
  165.         for(ii = 1; ii <= NMA_period; ii++)
  166.           {
  167.           nmc2num = (NMC2[i] - NMC2[i+ii]) / MathSqrt(ii);
  168.           if(MathAbs(nmc2num) > maxnmc2) { maxnmc2 = MathAbs(nmc2num); NMA_LB_max = ii; }
  169.           }
  170.         if(NMA_LB_max < NMA_LB_min) NMA_LB_max = NMA_LB_min;
  171.         sum = (NMC2[i] - NMC2[i+1]) + (NMC2[i+1] - NMC2[i+2]) * (MathSqrt(2)-1);
  172.         for(ii = 2; ii < NMA_LB_max; ii++)
  173.           sum += (NMC2[i+ii] - NMC2[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
  174.         abssum = MathAbs(sum);
  175.         sum = 0;
  176.         for(ii = 0; ii < NMA_LB_max; ii++)
  177.           sum += MathAbs(NMC2[i+ii] - NMC2[i+ii+1]);
  178.         if(sum != 0) ratio = abssum / sum;
  179.         NMC2_FastNMA[i] = NMC2_FastNMA[i+1] + (NMC2[i] - NMC2_FastNMA[i+1]) * ratio;
  180.         }
  181.  
  182.   return(0);
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement