Advertisement
Guest User

Ocn_NMM_MACDx

a guest
Apr 8th, 2012
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.13 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    NMM_MACD_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 NMM_MACD[];
  30. double ZH[];
  31. double SD[];
  32. double SD2[];
  33. double NMM_MACD_NMA[];
  34. double NMM_MACD_FastNMA[];
  35. double NMM[];
  36. double NMM_MA[];
  37.  
  38. int init()
  39. {
  40.   string nmmmacdname = "NMM_MACD(" + NMM_MACD_period + ")";
  41.   IndicatorShortName(nmmmacdname);
  42.   IndicatorBuffers(8);
  43.   SetIndexBuffer(0, NMM_MACD);
  44.   SetIndexLabel(0, nmmmacdname);
  45.   SetIndexBuffer(1, ZH);
  46.   SetIndexLabel(1, "NMM_MACD_ZH");
  47.   SetIndexStyle(1, DRAW_ARROW);
  48.   SetIndexArrow(1, ZH_symbol);
  49.   SetIndexBuffer(2, SD);
  50.   SetIndexBuffer(3, SD2);
  51.   if(Show_SD_1line_only)
  52.     {
  53.     SetIndexLabel(2, "NMM_MACD_SD(" + SD_len + ")");
  54.     SetIndexLabel(3, "unused");
  55.     }
  56.   else
  57.     {
  58.     if(Show_SD_2lines_up) SetIndexLabel(2, "NMM_MACD_SD_up(" + SD_len + ")");
  59.     else                  SetIndexLabel(2, "unused");
  60.     if(Show_SD_2lines_dn) SetIndexLabel(3, "NMM_MACD_SD_dn(" + SD_len + ")");
  61.     else                  SetIndexLabel(3, "unused");
  62.     }
  63.   SetIndexBuffer(4, NMM_MACD_NMA);
  64.   SetIndexBuffer(5, NMM_MACD_FastNMA);
  65.   if(Show_NMA) SetIndexLabel(4, "NMM_MACD_NMA(" + NMA_period + ")");
  66.   else         SetIndexLabel(4, "unused");
  67.   if(Show_FastNMA) SetIndexLabel(5, "NMM_MACD_FastNMA(" + NMA_period + ", " + NMA_LB_min + ")");
  68.   else             SetIndexLabel(5, "unused");
  69.   SetIndexBuffer(6, NMM);
  70.   SetIndexBuffer(7, NMM_MA);
  71.   return(0);
  72. }
  73.  
  74. int start()
  75. {
  76.   int limit, i, ii, counted_bars = IndicatorCounted();
  77.   double nmm2, sum, abssum, ratio, nmmmacdnum, maxnmmmacd;
  78.  
  79.   if(Bars <= 2*NMM_MACD_period) return(0);
  80.   if(counted_bars < 0) counted_bars = 0;
  81.   if(counted_bars > NMM_MACD_period) limit = Bars - counted_bars;
  82.   else                               limit = Bars - NMM_MACD_period - 1;
  83.  
  84.   for(i = limit; i >= 0; i--)
  85.     {
  86.     nmm2 = 0;
  87.     for(ii = 1; ii <= NMM_MACD_period; ii++)
  88.       nmm2 += (MathLog(Close[i]) - MathLog(Close[i+ii])) / MathSqrt(ii);
  89.     NMM[i] = (nmm2 / NMM_MACD_period)  * 1000;
  90.     }
  91.  
  92.   for(i = limit; i >= 0; i--)
  93.     if(i < Bars - 2*NMM_MACD_period - 1)
  94.       {
  95.       ratio = 0;
  96.       sum = (NMM[i] - NMM[i+1]) + (NMM[i+1] - NMM[i+2]) * (MathSqrt(2)-1);
  97.       for(ii = 2; ii < NMM_MACD_period; ii++)
  98.         sum += (NMM[i+ii] - NMM[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
  99.       abssum = MathAbs(sum);
  100.       sum = 0;
  101.       for(ii = 0; ii < NMM_MACD_period; ii++)
  102.         sum += MathAbs(NMM[i+ii] - NMM[i+ii+1]);
  103.       if(sum != 0) ratio = abssum / sum;
  104.       NMM_MA[i] = NMM_MA[i+1] + (NMM[i] - NMM_MA[i+1]) * ratio;
  105.       NMM_MACD[i] = NMM[i] - NMM_MA[i];
  106.       if(Show_ZH) { if(NMM_MACD[i] == 0) ZH[i] = ZH_displacement; else ZH[i] = EMPTY_VALUE; }
  107.       }
  108.  
  109.  
  110.   if(Show_SD)
  111.     for(i = limit; i >= 0; i--)
  112.       if(i < Bars - 2*NMM_MACD_period - 1 - SD_len)
  113.         {
  114.         if(Show_SD_1line_only)
  115.           {
  116.           if(NMM_MACD[i] == 0)     SD[i] = 0;
  117.           else if(NMM_MACD[i] > 0) SD[i] = iBandsOnArray(NMM_MACD, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  118.           else if(NMM_MACD[i] < 0) SD[i] = iBandsOnArray(NMM_MACD, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  119.           }
  120.         else
  121.           {
  122.           if(NMM_MACD[i] == 0)
  123.             {
  124.             if(Show_SD_2lines_up) SD[i] = 0;
  125.             if(Show_SD_2lines_dn) SD2[i] = 0;
  126.             }
  127.           else
  128.             {
  129.             if(Show_SD_2lines_up) SD[i] = iBandsOnArray(NMM_MACD, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  130.             if(Show_SD_2lines_dn) SD2[i] = iBandsOnArray(NMM_MACD, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  131.             }
  132.           }
  133.         }
  134.  
  135.   if(Show_NMA)
  136.     for(i = limit; i >= 0; i--)
  137.       if(i < Bars - 2*NMM_MACD_period - 1 - NMA_period)
  138.         {
  139.         ratio = 0;
  140.         sum = (NMM_MACD[i] - NMM_MACD[i+1]) + (NMM_MACD[i+1] - NMM_MACD[i+2]) * (MathSqrt(2)-1);
  141.         for(ii = 2; ii < NMA_period; ii++)
  142.           sum += (NMM_MACD[i+ii] - NMM_MACD[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
  143.         abssum = MathAbs(sum);
  144.         sum = 0;
  145.         for(ii = 0; ii < NMA_period; ii++)
  146.           sum += MathAbs(NMM_MACD[i+ii] - NMM_MACD[i+ii+1]);
  147.         if(sum != 0) ratio = abssum / sum;
  148.         NMM_MACD_NMA[i] = NMM_MACD_NMA[i+1] + (NMM_MACD[i] - NMM_MACD_NMA[i+1]) * ratio;
  149.         }
  150.  
  151.   if(Show_FastNMA)
  152.     for(i = limit; i >= 0; i--)
  153.       if(i < Bars - 2*NMM_MACD_period - 1 - NMA_period)
  154.         {
  155.         maxnmmmacd = 0; ratio = 0;
  156.         int NMA_LB_max;
  157.         for(ii = 1; ii <= NMA_period; ii++)
  158.           {
  159.           nmmmacdnum = (NMM_MACD[i] - NMM_MACD[i+ii]) / MathSqrt(ii);
  160.           if(MathAbs(nmmmacdnum) > maxnmmmacd) { maxnmmmacd = MathAbs(nmmmacdnum); NMA_LB_max = ii; }
  161.           }
  162.         if(NMA_LB_max < NMA_LB_min) NMA_LB_max = NMA_LB_min;
  163.         sum = (NMM_MACD[i] - NMM_MACD[i+1]) + (NMM_MACD[i+1] - NMM_MACD[i+2]) * (MathSqrt(2)-1);
  164.         for(ii = 2; ii < NMA_LB_max; ii++)
  165.           sum += (NMM_MACD[i+ii] - NMM_MACD[i+ii+1]) * (MathSqrt(ii+1) - MathSqrt(ii));
  166.         abssum = MathAbs(sum);
  167.         sum = 0;
  168.         for(ii = 0; ii < NMA_LB_max; ii++)
  169.           sum += MathAbs(NMM_MACD[i+ii] - NMM_MACD[i+ii+1]);
  170.         if(sum != 0) ratio = abssum / sum;
  171.         NMM_MACD_FastNMA[i] = NMM_MACD_FastNMA[i+1] + (NMM_MACD[i] - NMM_MACD_FastNMA[i+1]) * ratio;
  172.         }
  173.  
  174.   return(0);
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement