Advertisement
Guest User

Ocn_FastNMAvsNMA_MTF

a guest
Aug 25th, 2012
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.98 KB | None | 0 0
  1. // Ocn_FastNMAvsNMA_MTF version 1.10
  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    TF                 = 0;
  16. extern int    NMA_period         = 40;
  17. extern int    FastNMA_period     = 40;
  18. extern int    FastNMA_LB_min     = 8;
  19. extern bool   Show_SD            = false;
  20. extern int    SD_len             = 30;
  21. extern double SD_up              = 2;
  22. extern double SD_dn              = 2;
  23. extern bool   Show_SD_1line_only = false;
  24. extern bool   Show_SD_3lines_up  = true;
  25. extern bool   Show_SD_3lines_dn  = true;
  26. extern bool   Show_SD_3lines_md  = true;
  27. extern bool   ValuesInPips       = false;
  28. extern int    MaxBars            = 0;
  29.  
  30. double FastNMAvsNMA[];
  31. double SD[];
  32. double SD2[];
  33. double SD3[];
  34.  
  35. int    NMAmtfbars;
  36. double NMAmtf[][3];
  37. double FastNMAvsNMAmtf[];
  38. double point;
  39.  
  40. int init()
  41. {
  42.   string tf = "";
  43.        if(TF == PERIOD_M1)  tf = "_M1";
  44.   else if(TF == PERIOD_M5)  tf = "_M5";
  45.   else if(TF == PERIOD_M15) tf = "_M15";
  46.   else if(TF == PERIOD_M30) tf = "_M30";
  47.   else if(TF == PERIOD_H1)  tf = "_H1";
  48.   else if(TF == PERIOD_H4)  tf = "_H4";
  49.   else if(TF == PERIOD_D1)  tf = "_D1";
  50.   else if(TF == PERIOD_W1)  tf = "_W1";
  51.   else if(TF == PERIOD_MN1) tf = "_MN1";
  52.   else TF = Period();
  53.   string indiname = "FastNMAvsNMA" + tf;
  54.   string name = indiname + "(" + NMA_period + ", " + FastNMA_period + ", " + FastNMA_LB_min + ")";
  55.   IndicatorShortName(name);
  56.   IndicatorBuffers(4);
  57.   SetIndexBuffer(0, FastNMAvsNMA);
  58.   SetIndexLabel(0, name);
  59.   SetIndexBuffer(1, SD);
  60.   SetIndexBuffer(2, SD2);
  61.   SetIndexBuffer(3, SD3);
  62.   if(Show_SD_1line_only)
  63.     {
  64.     SetIndexLabel(1, indiname + "_SD(" + SD_len + ")");
  65.     SetIndexLabel(2, "unused");
  66.     SetIndexLabel(3, "unused");
  67.     }
  68.   else
  69.     {
  70.     if(Show_SD_3lines_up) SetIndexLabel(1, indiname + "_SD_up(" + SD_len + ")");
  71.     else                  SetIndexLabel(1, "unused");
  72.     if(Show_SD_3lines_dn) SetIndexLabel(2, indiname + "_SD_dn(" + SD_len + ")");
  73.     else                  SetIndexLabel(2, "unused");
  74.     if(Show_SD_3lines_md) SetIndexLabel(3, indiname + "_SD_md(" + SD_len + ")");
  75.     else                  SetIndexLabel(3, "unused");
  76.     }
  77.   point = Point;
  78.   if(MarketInfo("EURUSD", MODE_POINT) == 0.00001) point *= 10;
  79.  
  80.   int bars = Bars;
  81.   if( (MaxBars > 0) && (MaxBars < bars) ) bars = MaxBars;
  82.   NMAmtfbars = MathMin(bars * Period() / TF, iBars(NULL, TF));
  83.   ArrayResize(NMAmtf, NMAmtfbars); ArrayInitialize(NMAmtf, 0);
  84.   ArrayResize(FastNMAvsNMAmtf, NMAmtfbars); ArrayInitialize(FastNMAvsNMAmtf, 0); ArraySetAsSeries(FastNMAvsNMAmtf, true);
  85.   return(0);
  86. }
  87.  
  88. int start()
  89. {
  90.   int limit, i, ii, counted_bars = IndicatorCounted()-1, bars = Bars, nearestbar;
  91.   double nmasum, nmaabssum, nmaratio, nmmnum, maxnmm, fastnmasum, fastnmaabssum, fastnmaratio, temp;
  92.   bool nmadone, fastnmadone;
  93.  
  94.   if( (MaxBars > 0) && (MaxBars < bars) ) bars = MaxBars;
  95.   if(counted_bars <= 1) limit = bars - 1;
  96.   else                  limit = bars - counted_bars;
  97.   if(limit < 1)         limit = 1;
  98.  
  99.   NMAmtfcalc();
  100.  
  101.   for(i = limit; i >= 0; i--)
  102.     {
  103.     nearestbar = iBarShift(NULL, TF, Time[i]);
  104.     if(nearestbar < iBars(NULL, TF) - MathMax(NMA_period, FastNMA_period))
  105.       {
  106.       FastNMAvsNMA[i] = FastNMAvsNMAmtf[nearestbar];
  107.       if( (Show_SD) && (nearestbar < iBars(NULL, TF) - MathMax(NMA_period, FastNMA_period) - SD_len) )
  108.         {
  109.         if(Show_SD_1line_only)
  110.           {
  111.           if(FastNMAvsNMAmtf[nearestbar] == 0)     SD[i] = 0;
  112.           else if(FastNMAvsNMAmtf[nearestbar] > 0) SD[i] = iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_up, 0, MODE_UPPER, nearestbar);
  113.           else if(FastNMAvsNMAmtf[nearestbar] < 0) SD[i] = iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_dn, 0, MODE_LOWER, nearestbar);
  114.           }
  115.         else
  116.           {
  117.           if(Show_SD_3lines_up)  SD[i] = iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_up, 0, MODE_UPPER, nearestbar);
  118.           if(Show_SD_3lines_dn) SD2[i] = iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_dn, 0, MODE_LOWER, nearestbar);
  119.           if(Show_SD_3lines_md) SD3[i] = (iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_up, 0, MODE_UPPER, nearestbar)+
  120.                                           iBandsOnArray(FastNMAvsNMAmtf, 0, SD_len, SD_dn, 0, MODE_LOWER, nearestbar) ) / 2;
  121.           }
  122.         }
  123.       }
  124.     }
  125.  
  126.   return(0);
  127. }
  128.  
  129. void NMAmtfcalc()
  130. {
  131.   int i, ii, iii, NMAoldestbar = NMAmtfbars-1 - MathMax(NMA_period, FastNMA_period);
  132.   bool found;
  133.  
  134.   for(i = NMAoldestbar; i >= 2; i--)
  135.     if(NMAmtf[i][0] != iTime(NULL, TF, i))
  136.       {
  137.       if(i == NMAoldestbar)
  138.         {
  139.         found = false; ii = 1;
  140.         while( !(found) && (i-ii >= 0) )
  141.           if(NMAmtf[i-ii][0] == iTime(NULL, TF, i)) found = true;
  142.           else ii++;
  143.         if(found)
  144.           {
  145.           for(iii = i; iii >= 0; iii--)
  146.             if(iii-ii >= 0)
  147.               {
  148.               NMAmtf[iii][0] = NMAmtf[iii-ii][0];
  149.               NMAmtf[iii][1] = NMAmtf[iii-ii][1];
  150.               NMAmtf[iii][2] = NMAmtf[iii-ii][2];
  151.               FastNMAvsNMAmtf[iii] = FastNMAvsNMAmtf[iii-ii];
  152.               }
  153.             else
  154.               {
  155.               NMAmtf[iii][0] = 0;
  156.               NMAmtf[iii][1] = 0;
  157.               NMAmtf[iii][2] = 0;
  158.               FastNMAvsNMAmtf[iii] = 0;
  159.               }
  160.           }
  161.         else
  162.           {
  163.           NMAmtf[i+1][1] = iClose(NULL, TF, i+1);
  164.           NMAmtf[i+1][2] = iClose(NULL, TF, i+1);
  165.           NMAmtf[i][0] = iTime(NULL, TF, i); NMAcalc(i);
  166.           }
  167.         }
  168.       else
  169.         {
  170.         NMAmtf[i][0] = iTime(NULL, TF, i); NMAcalc(i);
  171.         }
  172.       }
  173.  
  174.   NMAmtf[1][0] = iTime(NULL, TF, 1); NMAcalc(1);
  175.   NMAmtf[0][0] = iTime(NULL, TF, 0); NMAcalc(0);
  176. }
  177.  
  178. void NMAcalc(int i)
  179. {
  180.   int ii;
  181.   double nmasum, nmaabssum, nmaratio, nmmnum, maxnmm, fastnmasum, fastnmaabssum, fastnmaratio, temp;
  182.   bool nmadone, fastnmadone;
  183.  
  184.   nmaratio = 0; maxnmm = 0; fastnmaratio = 0;
  185.   int NMA_LB_max;
  186.   for(ii = 1; ii <= FastNMA_period; ii++)
  187.     {
  188.     nmmnum = (MathLog(iClose(NULL, TF, i)) - MathLog(iClose(NULL, TF, i+ii))) / MathSqrt(ii);
  189.     if(MathAbs(nmmnum) > maxnmm) { maxnmm = MathAbs(nmmnum); NMA_LB_max = ii; }
  190.     }
  191.   if(NMA_LB_max < FastNMA_LB_min) NMA_LB_max = FastNMA_LB_min;
  192.   nmasum = (MathLog(iClose(NULL, TF, i)) - MathLog(iClose(NULL, TF, i+1))) + (MathLog(iClose(NULL, TF, i+1)) - MathLog(iClose(NULL, TF, i+2))) * (MathSqrt(2)-1);
  193.   fastnmasum = nmasum;
  194.   nmadone = false; fastnmadone = false; ii = 2;
  195.   while( !(nmadone) || !(fastnmadone) )
  196.     {
  197.     temp = (MathLog(iClose(NULL, TF, i+ii)) - MathLog(iClose(NULL, TF, i+ii+1))) * (MathSqrt(ii+1) - MathSqrt(ii));
  198.     if(ii >= NMA_period) nmadone=true;
  199.     else                 nmasum += temp;
  200.     if(ii >= NMA_LB_max) fastnmadone=true;
  201.     else                 fastnmasum += temp;
  202.     ii++;
  203.     }
  204.   nmaabssum = MathAbs(nmasum);
  205.   fastnmaabssum = MathAbs(fastnmasum);
  206.   nmasum = 0; fastnmasum = 0;
  207.   nmadone = false; fastnmadone = false; ii = 0;
  208.   while( !(nmadone) || !(fastnmadone) )
  209.     {
  210.     temp = MathAbs(MathLog(iClose(NULL, TF, i+ii)) - MathLog(iClose(NULL, TF, i+ii+1)));
  211.     if(ii >= NMA_period) nmadone=true;
  212.     else                 nmasum += temp;
  213.     if(ii >= NMA_LB_max) fastnmadone=true;
  214.     else                 fastnmasum += temp;
  215.     ii++;
  216.     }
  217.   if(nmasum != 0) nmaratio = nmaabssum / nmasum;
  218.   if(fastnmasum != 0) fastnmaratio = fastnmaabssum / fastnmasum;
  219.   NMAmtf[i][1] = NMAmtf[i+1][1] + (iClose(NULL, TF, i) - NMAmtf[i+1][1]) * nmaratio;
  220.   NMAmtf[i][2] = NMAmtf[i+1][2] + (iClose(NULL, TF, i) - NMAmtf[i+1][2]) * fastnmaratio;
  221.   FastNMAvsNMAmtf[i] = NMAmtf[i][2] - NMAmtf[i][1]; if(ValuesInPips) FastNMAvsNMAmtf[i] = FastNMAvsNMAmtf[i] / point;
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement