Advertisement
Guest User

Ocn_FastNMAvsNMA

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