Advertisement
Guest User

Ocn_NMCx

a guest
Apr 8th, 2012
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.48 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    NMC_period          = 40;
  14. extern bool   Show_ZH             = true;
  15. extern double ZH_displacement     = 1;
  16. extern int    ZH_symbol           = 115;
  17. extern bool   Show_SD             = true;
  18. extern int    SD_len              = 30;
  19. extern double SD_up               = 2;
  20. extern double SD_dn               = 2;
  21. extern bool   Show_SD_1line_only  = true;
  22. extern bool   Show_SD_2lines_up   = true;
  23. extern bool   Show_SD_2lines_dn   = true;
  24. extern int    NMA_period          = 40;
  25. extern int    NMA_LB_min          = 8;
  26. extern bool   Show_NMA            = true;
  27. extern bool   Show_FastNMA        = true;
  28.  
  29. double NMC[];
  30. double ZH[];
  31. double SD[];
  32. double SD2[];
  33. double NMC_NMA[];
  34. double NMC_FastNMA[];
  35.  
  36. int init()
  37. {
  38.   string nmcname = "NMC(" + NMC_period + ")";
  39.   IndicatorShortName(nmcname);
  40.   IndicatorBuffers(6);
  41.   SetIndexBuffer(0, NMC);
  42.   SetIndexLabel(0, nmcname);
  43.   SetIndexBuffer(1, ZH);
  44.   SetIndexLabel(1, "NMC_ZH");
  45.   SetIndexStyle(1, DRAW_ARROW);
  46.   SetIndexArrow(1, ZH_symbol);
  47.   SetIndexBuffer(2, SD);
  48.   SetIndexBuffer(3, SD2);
  49.   if(Show_SD_1line_only)
  50.     {
  51.     SetIndexLabel(2, "NMC_SD(" + SD_len + ")");
  52.     SetIndexLabel(3, "unused");
  53.     }
  54.   else
  55.     {
  56.     if(Show_SD_2lines_up) SetIndexLabel(2, "NMC_SD_up(" + SD_len + ")");
  57.     else                  SetIndexLabel(2, "unused");
  58.     if(Show_SD_2lines_dn) SetIndexLabel(3, "NMC_SD_dn(" + SD_len + ")");
  59.     else                  SetIndexLabel(3, "unused");
  60.     }
  61.   SetIndexBuffer(4, NMC_NMA);
  62.   SetIndexBuffer(5, NMC_FastNMA);
  63.   if(Show_NMA) SetIndexLabel(4, "NMC_NMA(" + NMA_period + ")");
  64.   else         SetIndexLabel(4, "unused");
  65.   if(Show_FastNMA) SetIndexLabel(5, "NMC_FastNMA(" + NMA_period + ", " + NMA_LB_min + ")");
  66.   else             SetIndexLabel(5, "unused");
  67.   return(0);
  68. }
  69.  
  70. int start()
  71. {
  72.   int limit, i, ii, counted_bars = IndicatorCounted();
  73.   double nmm, nmr, nmm2, nmr2, avg, sign, sum, abssum, ratio, nmcnum, maxnmc;
  74.  
  75.   if(Bars <= NMC_period) return(0);
  76.   if(counted_bars < 0) counted_bars = 0;
  77.   if(counted_bars > NMC_period) limit = Bars - counted_bars;
  78.   else                          limit = Bars - NMC_period - 1;
  79.  
  80.   for(i = limit; i >= 0; i--)
  81.     {
  82.     nmm2 = 0; nmr2 = 0;
  83.     for(ii = 1; ii <= NMC_period; ii++)
  84.       {
  85.       nmm2 += (MathLog(Close[i]) - MathLog(Close[i+ii])) / MathSqrt(ii);
  86.       nmr2 += (MathLog(Close[i+ii-1]) - MathLog(Close[i+ii])) * (MathSqrt(ii) - MathSqrt(ii-1));
  87.       }
  88.     nmm = (nmm2 / NMC_period) * 1000;
  89.     nmr = nmr2 * 1000;
  90.     avg = ((MathAbs(nmm) * nmr) + (MathAbs(nmr) * nmm)) / 2;
  91.     if(avg > 0)      sign = 1;
  92.     else if(avg < 0) sign = -1;
  93.     else             sign = 0;
  94.     NMC[i] = sign * MathSqrt(MathAbs(avg));
  95.     if(Show_ZH) { if(NMC[i] == 0) ZH[i] = ZH_displacement; else ZH[i] = EMPTY_VALUE; }
  96.     }
  97.  
  98.   if(Show_SD)
  99.     for(i = limit; i >= 0; i--)
  100.       if(i < Bars - NMC_period - 1 - SD_len)
  101.         {
  102.         if(Show_SD_1line_only)
  103.           {
  104.           if(NMC[i] == 0)     SD[i] = 0;
  105.           else if(NMC[i] > 0) SD[i] = iBandsOnArray(NMC, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  106.           else if(NMC[i] < 0) SD[i] = iBandsOnArray(NMC, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  107.           }
  108.         else
  109.           {
  110.           if(NMC[i] == 0)
  111.             {
  112.             if(Show_SD_2lines_up) SD[i] = 0;
  113.             if(Show_SD_2lines_dn) SD2[i] = 0;
  114.             }
  115.           else
  116.             {
  117.             if(Show_SD_2lines_up) SD[i] = iBandsOnArray(NMC, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  118.             if(Show_SD_2lines_dn) SD2[i] = iBandsOnArray(NMC, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  119.             }
  120.           }
  121.         }
  122.  
  123.   if(Show_NMA)
  124.     for(i = limit; i >= 0; i--)
  125.       if(i < Bars - NMC_period - 1 - NMA_period)
  126.         {
  127.         ratio = 0;
  128.         sum = (NMC[i] - NMC[i+1]) + (NMC[i+1] - NMC[i+2]) * (MathSqrt(2)-1);
  129.         for(ii = 2; ii < NMA_period; ii++)
  130.           sum += (NMC[i+ii] - NMC[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
  131.         abssum = MathAbs(sum);
  132.         sum = 0;
  133.         for(ii = 0; ii < NMA_period; ii++)
  134.           sum += MathAbs(NMC[i+ii] - NMC[i+ii+1]);
  135.         if(sum != 0) ratio = abssum / sum;
  136.         NMC_NMA[i] = NMC_NMA[i+1] + (NMC[i] - NMC_NMA[i+1]) * ratio;
  137.         }
  138.  
  139.   if(Show_FastNMA)
  140.     for(i = limit; i >= 0; i--)
  141.       if(i < Bars - NMC_period - 1 - NMA_period)
  142.         {
  143.         maxnmc = 0; ratio = 0;
  144.         int NMA_LB_max;
  145.         for(ii = 1; ii <= NMA_period; ii++)
  146.           {
  147.           nmcnum = (NMC[i] - NMC[i+ii]) / MathSqrt(ii);
  148.           if(MathAbs(nmcnum) > maxnmc) { maxnmc = MathAbs(nmcnum); NMA_LB_max = ii; }
  149.           }
  150.         if(NMA_LB_max < NMA_LB_min) NMA_LB_max = NMA_LB_min;
  151.         sum = (NMC[i] - NMC[i+1]) + (NMC[i+1] - NMC[i+2]) * (MathSqrt(2)-1);
  152.         for(ii = 2; ii < NMA_LB_max; ii++)
  153.           sum += (NMC[i+ii] - NMC[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
  154.         abssum = MathAbs(sum);
  155.         sum = 0;
  156.         for(ii = 0; ii < NMA_LB_max; ii++)
  157.           sum += MathAbs(NMC[i+ii] - NMC[i+ii+1]);
  158.         if(sum != 0) ratio = abssum / sum;
  159.         NMC_FastNMA[i] = NMC_FastNMA[i+1] + (NMC[i] - NMC_FastNMA[i+1]) * ratio;
  160.         }
  161.  
  162.   return(0);
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement