Advertisement
Guest User

Ocn_FastNMAvsNMA

a guest
Aug 20th, 2012
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.09 KB | None | 0 0
  1. // Ocn_FastNMAvsNMA version 1.00
  2. #property  copyright "NMA algorithm © jim sloman, for metatrader programmed by udc"
  3. #property  link      "[email protected]"
  4.  
  5. #property indicator_separate_window
  6. #property indicator_buffers 4
  7. #property indicator_color1 Magenta
  8. #property indicator_color2 Silver
  9. #property indicator_color3 Silver
  10. #property indicator_color4 Silver
  11. #property indicator_level1 0
  12. #property indicator_levelcolor Gray
  13. #property indicator_levelstyle 2
  14.  
  15. extern int    NMA_period         = 40;
  16. extern int    FastNMA_period     = 40;
  17. extern int    FastNMA_LB_min     = 8;
  18. extern bool   Show_SD            = false;
  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 = false;
  23. extern bool   Show_SD_3lines_up  = true;
  24. extern bool   Show_SD_3lines_dn  = true;
  25. extern bool   Show_SD_3lines_md  = true;
  26.  
  27. double FastNMAvsNMA[];
  28. double SD[];
  29. double SD2[];
  30. double SD3[];
  31. double NMA[];
  32. double FastNMA[];
  33.  
  34. int init()
  35. {
  36.   string name = "FastNMAvsNMA(" + NMA_period + ", " + FastNMA_period + ", " + FastNMA_LB_min + ")";
  37.   IndicatorShortName(name);
  38.   IndicatorBuffers(6);
  39.   SetIndexBuffer(0, FastNMAvsNMA);
  40.   SetIndexLabel(0, name);
  41.   SetIndexBuffer(1, SD);
  42.   SetIndexBuffer(2, SD2);
  43.   SetIndexBuffer(3, SD3);
  44.   if(Show_SD_1line_only)
  45.     {
  46.     SetIndexLabel(1, "FastNMAvsNMA_SD(" + SD_len + ")");
  47.     SetIndexLabel(2, "unused");
  48.     SetIndexLabel(3, "unused");
  49.     }
  50.   else
  51.     {
  52.     if(Show_SD_3lines_up) SetIndexLabel(1, "FastNMAvsNMA_SD_up(" + SD_len + ")");
  53.     else                  SetIndexLabel(1, "unused");
  54.     if(Show_SD_3lines_dn) SetIndexLabel(2, "FastNMAvsNMA_SD_dn(" + SD_len + ")");
  55.     else                  SetIndexLabel(2, "unused");
  56.     if(Show_SD_3lines_md) SetIndexLabel(3, "FastNMAvsNMA_SD_md(" + SD_len + ")");
  57.     else                  SetIndexLabel(3, "unused");
  58.     }
  59.   SetIndexBuffer(4, NMA);
  60.   SetIndexBuffer(5, FastNMA);
  61.   return(0);
  62. }
  63.  
  64. int start()
  65. {
  66.   int limit, i, ii, counted_bars = IndicatorCounted()-1;
  67.   int max = MathMax(NMA_period, FastNMA_period);
  68.   double nmasum, nmaabssum, nmaratio, nmmnum, maxnmm, fastnmasum, fastnmaabssum, fastnmaratio, temp;
  69.   bool nmadone, fastnmadone;
  70.  
  71.   if(Bars <= max) return(0);
  72.   if(counted_bars < 0) counted_bars = 0;
  73.   if(counted_bars > max) limit = Bars - counted_bars;
  74.   else                   limit = Bars - max - 1;
  75.  
  76.   for(i = limit; i >= 0; i--)
  77.     {
  78.     if(i == Bars - max - 1) { NMA[i+1] = Close[i+1]; FastNMA[i+1] = Close[i+1]; }
  79.     nmaratio = 0; maxnmm = 0; fastnmaratio = 0;
  80.     int NMA_LB_max;
  81.     for(ii = 1; ii <= FastNMA_period; ii++)
  82.       {
  83.       nmmnum = (MathLog(Close[i]) - MathLog(Close[i+ii])) / MathSqrt(ii);
  84.       if(MathAbs(nmmnum) > maxnmm) { maxnmm = MathAbs(nmmnum); NMA_LB_max = ii; }
  85.       }
  86.     if(NMA_LB_max < FastNMA_LB_min) NMA_LB_max = FastNMA_LB_min;
  87.     nmasum = (MathLog(Close[i]) - MathLog(Close[i+1])) + (MathLog(Close[i+1]) - MathLog(Close[i+2])) * (MathSqrt(2)-1);
  88.     fastnmasum = nmasum;
  89.     nmadone = false; fastnmadone = false; ii = 2;
  90.     while( !(nmadone) || !(fastnmadone) )
  91.       {
  92.       temp = (MathLog(Close[i+ii]) - MathLog(Close[i+ii+1])) * (MathSqrt(ii+1) - MathSqrt(ii));
  93.       if(ii >= NMA_period) nmadone=true;
  94.       else                 nmasum += temp;
  95.       if(ii >= NMA_LB_max) fastnmadone=true;
  96.       else                 fastnmasum += temp;
  97.       ii++;
  98.       }
  99.     nmaabssum = MathAbs(nmasum);
  100.     fastnmaabssum = MathAbs(fastnmasum);
  101.     nmasum = 0; fastnmasum = 0;
  102.     nmadone = false; fastnmadone = false; ii = 0;
  103.     while( !(nmadone) || !(fastnmadone) )
  104.       {
  105.       temp = MathAbs(MathLog(Close[i+ii]) - MathLog(Close[i+ii+1]));
  106.       if(ii >= NMA_period) nmadone=true;
  107.       else                 nmasum += temp;
  108.       if(ii >= NMA_LB_max) fastnmadone=true;
  109.       else                 fastnmasum += temp;
  110.       ii++;
  111.       }
  112.     if(nmasum != 0) nmaratio = nmaabssum / nmasum;
  113.     if(fastnmasum != 0) fastnmaratio = fastnmaabssum / fastnmasum;
  114.     NMA[i] = NMA[i+1] + (Close[i] - NMA[i+1]) * nmaratio;
  115.     FastNMA[i] = FastNMA[i+1] + (Close[i] - FastNMA[i+1]) * fastnmaratio;
  116.     FastNMAvsNMA[i] = FastNMA[i] - NMA[i];
  117.     }
  118.  
  119.   if(Show_SD)
  120.     for(i = limit; i >= 0; i--)
  121.       if(i < Bars - max - 1 - SD_len)
  122.         {
  123.         if(Show_SD_1line_only)
  124.           {
  125.           if(FastNMAvsNMA[i] == 0)     SD[i] = 0;
  126.           else if(FastNMAvsNMA[i] > 0) SD[i] = iBandsOnArray(FastNMAvsNMA, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  127.           else if(FastNMAvsNMA[i] < 0) SD[i] = iBandsOnArray(FastNMAvsNMA, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  128.           }
  129.         else
  130.           {
  131.           if(Show_SD_3lines_up) SD[i] = iBandsOnArray(FastNMAvsNMA, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  132.           if(Show_SD_3lines_dn) SD2[i] = iBandsOnArray(FastNMAvsNMA, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  133.           if(Show_SD_3lines_md) SD3[i] = (iBandsOnArray(FastNMAvsNMA, 0, SD_len, SD_up, 0, MODE_UPPER, i)+
  134.                                           iBandsOnArray(FastNMAvsNMA, 0, SD_len, SD_dn, 0, MODE_LOWER, i) ) / 2;
  135.           }
  136.         }
  137.  
  138.   return(0);
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement