Advertisement
Guest User

Ocn_NST

a guest
Apr 9th, 2012
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.15 KB | None | 0 0
  1. #property indicator_separate_window
  2. #property indicator_buffers 1
  3. #property indicator_color1 Red
  4. #property indicator_level1 0
  5. #property indicator_level2 50
  6. #property indicator_level3 -50
  7. #property indicator_levelcolor Gray
  8. #property indicator_levelstyle 2
  9.  
  10. extern int NST_period = 20;
  11. extern int SmLen      = 10;
  12.  
  13. double NST[];
  14. double RawNST[];
  15.  
  16. int init()
  17. {
  18.   if(SmLen < 5) SmLen = 5;
  19.   else if(SmLen > 15) SmLen = 15;
  20.   string nstname = "NST(" + NST_period + ", " + SmLen + ")";
  21.   IndicatorShortName(nstname);
  22.   IndicatorDigits(0);
  23.   IndicatorBuffers(2);
  24.   SetIndexBuffer(0, NST);
  25.   SetIndexLabel(0, nstname);
  26.   SetIndexBuffer(1, RawNST);
  27.   return(0);
  28. }
  29.  
  30. int start()
  31. {
  32.   int limit, i, ii, counted_bars = IndicatorCounted();
  33.  
  34.   if(Bars <= NST_period + 3*SmLen) return(0);
  35.   if(counted_bars < 0) counted_bars = 0;
  36.   if(counted_bars > NST_period) limit = Bars - counted_bars;
  37.   else                          limit = Bars - NST_period - 1;
  38.  
  39.   for(i = limit; i >= 0; i--)
  40.     {
  41.     double SumWgt = 0, SumDnom = 0, HghAry, LowAry, RngAry, FrcAry, TmeAry, WgtAry;
  42.     for(ii = 0; ii <= NST_period; ii++)
  43.       {
  44.       HghAry = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, ii, i));
  45.       LowAry = iLow(NULL, 0, iLowest(NULL, 0, MODE_LOW, ii, i));
  46.       RngAry = HghAry - LowAry;
  47.       if(RngAry == 0) FrcAry = 0; else FrcAry = (Close[i] - LowAry) / RngAry;
  48.       TmeAry = 1 / MathPow(ii+1, 0.5);
  49.       WgtAry = TmeAry * FrcAry;
  50.       SumWgt += WgtAry;
  51.       SumDnom += TmeAry;
  52.       }
  53.     RawNST[i] = (200 * SumWgt / SumDnom) - 100;
  54.     }
  55.  
  56.   double ExpSmooth = 2, XAvg1, XAvg2, XAvg3, TemaNST;
  57.   ExpSmooth = ExpSmooth / (SmLen + 1);
  58.   for(i = Bars - NST_period - 1; i >= 0; i--)
  59.     {
  60.     XAvg1 += ExpSmooth * (RawNST[i] - XAvg1);
  61.     XAvg2 += ExpSmooth * (XAvg1 - XAvg2);
  62.     XAvg3 += ExpSmooth * (XAvg2 - XAvg3);
  63.     TemaNST = 3 * XAvg1 - 3 * XAvg2 + XAvg3;
  64.     if(i < Bars - NST_period - 1 - 3*SmLen)
  65.       {
  66.       if(TemaNST > 85) NST[i] = MathRound(85 + (TemaNST - 85) / 2);
  67.       else if(TemaNST < -85) NST[i] = MathRound(-85 - (MathAbs(TemaNST) - 85) / 2);
  68.       else NST[i] = MathRound(TemaNST);
  69.       }
  70.     }
  71.  
  72.   return(0);
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement