Advertisement
Guest User

Ocn_BTXx

a guest
May 7th, 2012
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 24.86 KB | None | 0 0
  1. // Ocn_BTXx version 1.21
  2. #property  copyright "© jim sloman, jma © mark jurik, for metatrader reprogrammed by udc"
  3. #property  link      "[email protected]"
  4.  
  5. #property indicator_separate_window
  6. #property indicator_buffers 6
  7. #property indicator_color1 Magenta
  8. #property indicator_color2 MediumVioletRed
  9. #property indicator_color3 MediumVioletRed
  10. #property indicator_color4 MediumVioletRed
  11. #property indicator_color5 Lime
  12. #property indicator_color6 Red
  13. #property indicator_level1 35
  14. #property indicator_levelcolor Gray
  15. #property indicator_levelstyle 2
  16. #property indicator_minimum 0
  17. #property indicator_maximum 100
  18.  
  19. extern bool   Show_BTX_Histogram     = false;
  20. extern int    BTX_period             = 40;
  21. extern int    SmLen                  = 20;
  22. extern bool   Use_JMA_instead_TEMA   = false;
  23. extern double JMA_Length             = 10;
  24. extern int    JMA_Phase              = 50;
  25. extern int    MaxBars                = 0;
  26. extern bool   Show_SD                = true;
  27. extern int    SD_len                 = 20;
  28. extern double SD_up                  = 1.5;
  29. extern double SD_dn                  = 1.5;
  30. extern bool   Show_SD_up             = true;
  31. extern bool   Show_SD_dn             = true;
  32. extern bool   Show_SD_md             = true;
  33. extern bool   BTX_2line_based_colors = false;
  34. extern bool   Show_Colors_Histogram  = false;
  35. extern bool   Colors_use_threshold   = true;
  36. extern int    Threshold              = 35;
  37. extern bool   Show_BTX_2line_diff_instead = false;
  38.  
  39. double BTX[];
  40. double SD[];
  41. double SD2[];
  42. double SD3[];
  43. double BTXbull[];
  44. double BTXbear[];
  45. double RawBTX[];
  46. double maBTX[];
  47.  
  48. int    oldbars;
  49. double RawBTXp[], newRawBTXp[];
  50. double maBTXp[], newmaBTXp[];
  51. double RawBTXn[], newRawBTXn[];
  52. double maBTXn[], newmaBTXn[];
  53.  
  54. double fC0Buffer[];
  55. double fA8Buffer[];
  56. double fC8Buffer[];
  57. double list[128], ring1[128], ring2[11], buffer[62];
  58. bool   initFlag;
  59. int    limitValue, startValue, loopParam, loopCriteria;
  60. int    cycleLimit, highLimit, counterA, counterB;
  61. double cycleDelta, lowDValue, highDValue, absValue, paramA, paramB;
  62. double phaseParam, logParam, JMAValue, series, sValue, sqrtParam, lengthDivider;
  63. int    s58, s60, s40, s38, s68;
  64.  
  65. bool   initialized;
  66. #import "OBP1Lock32x.dll"
  67.   bool LTInitializeFromInix(string);
  68.   double LTCalcValx(string, double, double, double, double, string);
  69. #define dll "OBP1Lock32.dll"
  70. #import
  71. double arr6[99], arr7[99], arr8[99], arr9[99], arr10[99], arr11[99];
  72. double arr9x[99], arr10x[99], arr11x[99], arr12x[99], arr13x[99], arr14x[99], arr15x[99], arr16x[99], arr17x[99], arr18x[99];
  73.  
  74. int init()
  75. {
  76.   initialized = LTInitializeFromInix(dll);
  77.   if(!initialized) return(0);
  78.  
  79.   if(SmLen < 1) SmLen = 1;
  80.   if(BTX_period > 98) BTX_period = 98;
  81.   string btxname = "(" + BTX_period + ", " + SmLen + ")";
  82.   if(Use_JMA_instead_TEMA) btxname = "_JMA(" + BTX_period + ", " + JMA_Length + ", " + JMA_Phase + ")";
  83.   IndicatorShortName("BTX"+btxname);
  84.   IndicatorDigits(2);
  85.   IndicatorBuffers(8);
  86.   SetIndexBuffer(0, BTX);
  87.   SetIndexLabel(0, "BTX"+btxname);
  88.   if(Show_BTX_Histogram) SetIndexStyle(0, DRAW_HISTOGRAM); else SetIndexStyle(0, DRAW_LINE);
  89.   SetIndexBuffer(1, SD);
  90.   SetIndexBuffer(2, SD2);
  91.   SetIndexBuffer(3, SD3);
  92.   if(Show_SD_up) SetIndexLabel(1, "BTX_SD_up(" + SD_len + ")");
  93.   else           SetIndexLabel(1, "unused");
  94.   if(Show_SD_dn) SetIndexLabel(2, "BTX_SD_dn(" + SD_len + ")");
  95.   else           SetIndexLabel(2, "unused");
  96.   if(Show_SD_md) SetIndexLabel(3, "BTX_SD_md(" + SD_len + ")");
  97.   else           SetIndexLabel(3, "unused");
  98.   SetIndexBuffer(4, BTXbull);
  99.   SetIndexBuffer(5, BTXbear);
  100.   if(BTX_2line_based_colors) { SetIndexLabel(4, "BTX_bull"+btxname); SetIndexLabel(5, "BTX_bear"+btxname); }
  101.   else                       { SetIndexLabel(4, "unused"); SetIndexLabel(5, "unused"); }
  102.   if(Show_Colors_Histogram) { SetIndexStyle(4, DRAW_HISTOGRAM); SetIndexStyle(5, DRAW_HISTOGRAM); }
  103.   else                      { SetIndexStyle(4, DRAW_LINE); SetIndexStyle(5, DRAW_LINE); }
  104.   SetIndexBuffer(6, RawBTX);
  105.   SetIndexBuffer(7, maBTX);
  106.  
  107.   ArraySetAsSeries(arr6, true); ArraySetAsSeries(arr7, true); ArraySetAsSeries(arr8, true);
  108.   ArraySetAsSeries(arr9, true); ArraySetAsSeries(arr10, true); ArraySetAsSeries(arr11, true);
  109.  
  110.   if(BTX_2line_based_colors)
  111.     {
  112.     ArraySetAsSeries(RawBTXp, true); ArraySetAsSeries(newRawBTXp, true); ArrayResize(RawBTXp, Bars); ArrayInitialize(RawBTXp, 0);
  113.     ArraySetAsSeries(maBTXp, true); ArraySetAsSeries(newmaBTXp, true); ArrayResize(maBTXp, Bars); ArrayInitialize(maBTXp, 0);
  114.     ArraySetAsSeries(RawBTXn, true); ArraySetAsSeries(newRawBTXn, true); ArrayResize(RawBTXn, Bars); ArrayInitialize(RawBTXn, 0);
  115.     ArraySetAsSeries(maBTXn, true); ArraySetAsSeries(newmaBTXn, true); ArrayResize(maBTXn, Bars); ArrayInitialize(maBTXn, 0);
  116.     oldbars = Bars;
  117.     ArraySetAsSeries(arr9x, true); ArraySetAsSeries(arr10x, true); ArraySetAsSeries(arr11x, true);
  118.     ArraySetAsSeries(arr12x, true); ArraySetAsSeries(arr13x, true); ArraySetAsSeries(arr14x, true);
  119.     ArraySetAsSeries(arr15x, true); ArraySetAsSeries(arr16x, true); ArraySetAsSeries(arr17x, true);
  120.     ArraySetAsSeries(arr18x, true);
  121.     }
  122.  
  123.   return(0);
  124. }
  125.  
  126. int start()
  127. {
  128.   if(!initialized) return(0);
  129.  
  130.   int limit, i, ii, counted_bars = IndicatorCounted()-1, bars;
  131.  
  132.   if(MaxBars > 0) { bars = MaxBars; if(counted_bars > bars) counted_bars = bars - 2; } else bars = Bars;
  133.   if(Use_JMA_instead_TEMA) { if(bars <= BTX_period + JMA_Length) return(0); }
  134.   else                     { if(bars <= BTX_period + 3*SmLen) return(0); }
  135.   if(counted_bars < 0) counted_bars = 0;
  136.   if(counted_bars > BTX_period) limit = bars - counted_bars;
  137.   else                          limit = bars - BTX_period - 1;
  138.  
  139.   if((BTX_2line_based_colors) && (oldbars != Bars))
  140.     {
  141.     ArrayResize(newRawBTXp, Bars); ArrayCopy(newRawBTXp, RawBTXp, (Bars-oldbars)); ArrayResize(RawBTXp, Bars); ArrayCopy(RawBTXp, newRawBTXp);
  142.     ArrayResize(newmaBTXp, Bars); ArrayCopy(newmaBTXp, maBTXp, (Bars-oldbars)); ArrayResize(maBTXp, Bars); ArrayCopy(maBTXp, newmaBTXp);
  143.     ArrayResize(newRawBTXn, Bars); ArrayCopy(newRawBTXn, RawBTXn, (Bars-oldbars)); ArrayResize(RawBTXn, Bars); ArrayCopy(RawBTXn, newRawBTXn);
  144.     ArrayResize(newmaBTXn, Bars); ArrayCopy(newmaBTXn, maBTXn, (Bars-oldbars)); ArrayResize(maBTXn, Bars); ArrayCopy(maBTXn, newmaBTXn);
  145.     oldbars = Bars;
  146.     }
  147.  
  148.   for(i = limit; i >= 0; i--)
  149.     {
  150.     double var2 = 0, var3 = 0;
  151.     ArrayInitialize(arr6, 0); ArrayInitialize(arr7, 0); ArrayInitialize(arr8, 0);
  152.     ArrayInitialize(arr9, 0); ArrayInitialize(arr10, 0); ArrayInitialize(arr11, 0);
  153.     arr6[0] = LTCalcValx(dll, Close[i], 0.5, High[i], Low[i], "eBBcmGJhfe");
  154.     for(ii = 1; ii <= BTX_period; ii++)
  155.       {
  156.       arr6[ii] = LTCalcValx(dll, Close[i+ii], Close[i+ii-1], 0.5, Close[i], "FpmqUGJh");
  157.       arr7[ii] = LTCalcValx(dll, arr6[ii-1], arr6[ii], Close[i], 0.5, "rmEsGMDfF");
  158.       arr8[ii] = LTCalcValx(dll, arr8[ii-1], (arr7[ii]), arr8[ii], arr7[ii-1], "smUDecGMJYh");
  159.       if(arr8[ii] == 0) arr9[ii] = 0;
  160.       else              arr9[ii] = LTCalcValx(dll, arr6[0], arr6[ii], arr8[ii], arr7[ii], "rUGMecDJYBBXU");
  161.       arr10[ii] = 1 / LTCalcValx(dll, 0.5, ii, arr9[ii], -MathAbs(arr9[ii-1]), "UhWGceMBBJn");
  162.       arr11[ii] = LTCalcValx(dll, arr9[ii], arr10[ii], arr9[ii-1], arr8[ii], "F3ecmGBBMqec");
  163.       var2 = LTCalcValx(dll, var2, arr11[ii], arr11[ii], var2, "ceGMhftTds");
  164.       var3 = LTCalcValx(dll, var3, arr10[ii], var2, var3, "jTGceMBBh");
  165.       }
  166.     RawBTX[i] = LTCalcValx(dll, var2, var3, 100, 0.5, "mUDF0AA8GMUXBBq");
  167.     if(BTX_2line_based_colors)
  168.       {
  169.       double var2x = 0, var3x = 0, var4x = 0, var5x = 0;
  170.       ArrayInitialize(arr9x, 0); ArrayInitialize(arr10x, 0); ArrayInitialize(arr11x, 0);
  171.       ArrayInitialize(arr12x, 0); ArrayInitialize(arr13x, 0); ArrayInitialize(arr14x, 0);
  172.       ArrayInitialize(arr15x, 0); ArrayInitialize(arr16x, 0); ArrayInitialize(arr17x, 0);
  173.       ArrayInitialize(arr18x, 0);
  174.       arr9x[0] = MathLog(Close[i]);
  175.       for(ii = 1; ii <= BTX_period; ii++)
  176.         {
  177.         arr9x[ii] = LTCalcValx(dll, Close[i+ii], Close[i+ii-1], 0.5, Close[i], "mmGBBJhfgg");
  178.         if((arr9x[ii-1]-arr9x[ii]) > 0) arr10x[ii] = LTCalcValx(dll, arr9x[ii-1], arr9x[ii], Close[i], 0.5, "qUGecBBMD");
  179.         else                            arr10x[ii] = 0;
  180.         if((arr9x[ii-1]-arr9x[ii]) < 0) arr11x[ii] = LTCalcValx(dll, arr9x[ii-1], arr9x[ii], Close[i], 0.5, "hrmGMBBceDf");
  181.         else                            arr11x[ii] = 0;
  182.         arr12x[ii] = LTCalcValx(dll, arr12x[ii-1], arr10x[ii], 0.5, Close[i], "F9mGMcehfft");
  183.         arr13x[ii] = LTCalcValx(dll, arr13x[ii-1], arr11x[ii], 0.5, Close[i], "F9mGMcehfft");
  184.         if((arr9x[0]-arr9x[ii]) > 0) { if(arr12x[ii] == 0) arr14x[ii] = 0; else arr14x[ii] = LTCalcValx(dll, arr9x[0], arr9x[ii], arr12x[ii], arr10x[ii], "CqdGMDBBXUfA"); }
  185.         else                         arr14x[ii] = 0;
  186.         if((arr9x[0]-arr9x[ii]) < 0) { if(arr13x[ii] == 0) arr15x[ii] = 0; else arr15x[ii] = LTCalcValx(dll, arr9x[0], arr9x[ii], arr13x[ii], arr11x[ii], "FmGMBBDXUfa"); }
  187.         else                         arr15x[ii] = 0;
  188.         arr16x[ii] = 1 / LTCalcValx(dll, 0.5, ii, arr14x[ii], arr15x[ii], "UhWGceMBBJn");
  189.         arr17x[ii] = LTCalcValx(dll, arr14x[ii], arr16x[ii], arr14x[ii-1], arr12x[ii], "BBWGMecqfrr");
  190.         arr18x[ii] = LTCalcValx(dll, arr15x[ii], arr16x[ii], arr15x[ii-1], arr13x[ii], "ceGWWMBBqffr");
  191.         var2x = LTCalcValx(dll, var2x, arr17x[ii], arr17x[ii-1], var2x, "ceGMhftTds");
  192.         var3x = LTCalcValx(dll, var3x, arr18x[ii], arr18x[ii-1], var3x, "ceGMhftTds");
  193.         var4x = LTCalcValx(dll, var4x, arr16x[ii], var2x, var4x, "jTGceMBBhffv");
  194.         var5x = LTCalcValx(dll, var5x, arr16x[ii], var3x, var5x, "jTGceMBBhffv");
  195.         }
  196.       RawBTXp[i] = LTCalcValx(dll, var2x, var4x, 100, 0.5, "mGBBMUceXq");
  197.       RawBTXn[i] = LTCalcValx(dll, var3x, var5x, 100, 0.5, "mGMUXecqfUr");
  198.       }
  199.     }
  200.  
  201.   if(!Use_JMA_instead_TEMA)
  202.     {
  203.     double ExpSmooth = 2, XAvg1, XAvg2, XAvg3;
  204.     ExpSmooth = ExpSmooth / (SmLen + 1);
  205.     for(i = bars - BTX_period - 1; i >= 0; i--)
  206.       {
  207.       XAvg1 += ExpSmooth * (RawBTX[i] - XAvg1);
  208.       XAvg2 += ExpSmooth * (XAvg1 - XAvg2);
  209.       XAvg3 += ExpSmooth * (XAvg2 - XAvg3);
  210.       maBTX[i] = 3 * XAvg1 - 3 * XAvg2 + XAvg3;
  211.       if(i < bars - BTX_period - 1 - 3*SmLen)
  212.         BTX[i] = NormalizeDouble(maBTX[i], 2);
  213.       }
  214.     if(BTX_2line_based_colors)
  215.       {
  216.       ExpSmooth = 2; XAvg1 = 0; XAvg2 = 0; XAvg3 = 0;
  217.       ExpSmooth = ExpSmooth / (SmLen + 1);
  218.       for(i = bars - BTX_period - 1; i >= 0; i--)
  219.         {
  220.         XAvg1 += ExpSmooth * (RawBTXp[i] - XAvg1);
  221.         XAvg2 += ExpSmooth * (XAvg1 - XAvg2);
  222.         XAvg3 += ExpSmooth * (XAvg2 - XAvg3);
  223.         maBTXp[i] = 3 * XAvg1 - 3 * XAvg2 + XAvg3;
  224.         }
  225.       ExpSmooth = 2; XAvg1 = 0; XAvg2 = 0; XAvg3 = 0;
  226.       ExpSmooth = ExpSmooth / (SmLen + 1);
  227.       for(i = bars - BTX_period - 1; i >= 0; i--)
  228.         {
  229.         XAvg1 += ExpSmooth * (RawBTXn[i] - XAvg1);
  230.         XAvg2 += ExpSmooth * (XAvg1 - XAvg2);
  231.         XAvg3 += ExpSmooth * (XAvg2 - XAvg3);
  232.         maBTXn[i] = 3 * XAvg1 - 3 * XAvg2 + XAvg3;
  233.         }
  234.       for(i = bars - BTX_period - 1 - 3*SmLen; i >= 0; i--)
  235.         {
  236.         if( !(Colors_use_threshold) ||
  237.             (!(Show_BTX_2line_diff_instead) && (BTX[i] >= Threshold)) ||
  238.             ((Show_BTX_2line_diff_instead) && (MathAbs(maBTXp[i] - maBTXn[i]) >= Threshold)) )
  239.           {
  240.           if(maBTXp[i] > maBTXn[i]) { if(Show_BTX_2line_diff_instead) BTXbull[i] = (maBTXp[i] - maBTXn[i]); else BTXbull[i] = BTX[i]; }
  241.           else if(maBTXn[i] > maBTXp[i]) { if(Show_BTX_2line_diff_instead) BTXbear[i] = (maBTXn[i] - maBTXp[i]) ; else BTXbear[i] = BTX[i]; }
  242.           }
  243.         else { maBTXp[i] = 0; maBTXn[i] = 0; }
  244.         }
  245.       }
  246.     }
  247.   else
  248.     {
  249.     ArrayResize(fC0Buffer, bars - BTX_period); ArraySetAsSeries(fC0Buffer, true); ArrayInitialize(fC0Buffer, 0);
  250.     ArrayResize(fA8Buffer, bars - BTX_period); ArraySetAsSeries(fA8Buffer, true); ArrayInitialize(fA8Buffer, 0);
  251.     ArrayResize(fC8Buffer, bars - BTX_period); ArraySetAsSeries(fC8Buffer, true); ArrayInitialize(fC8Buffer, 0);
  252.     ArrayInitialize(list, 0);
  253.     initFlag = false;
  254.     limitValue = 0; startValue = 0; loopParam = 0; loopCriteria = 0;
  255.     cycleLimit = 0; highLimit = 0; counterA = 0; counterB = 0;
  256.     cycleDelta = 0; lowDValue = 0; highDValue = 0; absValue = 0; paramA = 0; paramB = 0;
  257.     phaseParam = 0; logParam = 0; JMAValue = 0; series = 0; sValue = 0; sqrtParam = 0; lengthDivider = 0;
  258.     s58 = 0; s60 = 0; s40 = 0; s38 = 0; s68 = 0;
  259.     ArrayInitialize(ring2, 0);
  260.     ArrayInitialize(ring1, 0);
  261.     ArrayInitialize(buffer, 0);
  262.     double lengthParam;
  263.     limitValue = 63;
  264.     startValue = 64;
  265.     for(i = 0; i <= limitValue; i++)   list[i] = -1000000;
  266.     for(i = startValue; i <= 127; i++) list[i] = 1000000;
  267.     initFlag = true;
  268.     if(JMA_Length < 1.0000000002) lengthParam = 0.0000000001;
  269.     else                          lengthParam = (JMA_Length - 1) / 2.0;
  270.     if(JMA_Phase < -100)     phaseParam = 0.5;
  271.     else if(JMA_Phase > 100) phaseParam = 2.5;
  272.     else                     phaseParam = JMA_Phase / 100.0 + 1.5;
  273.     logParam = MathLog(MathSqrt(lengthParam)) / MathLog(2.0);
  274.     if(logParam + 2.0 < 0) logParam = 0;
  275.     else                   logParam = logParam + 2.0;
  276.     sqrtParam     = MathSqrt(lengthParam) * logParam;
  277.     lengthParam   = lengthParam * 0.9;
  278.     lengthDivider = lengthParam / (lengthParam + 2.0);
  279.     for(i = bars - BTX_period - 1; i >= 0; i--)
  280.       {
  281.       jma(RawBTX, maBTX, i);
  282.       if(i < bars - BTX_period - 1 - JMA_Length)
  283.         BTX[i] = NormalizeDouble(maBTX[i], 2);
  284.       }
  285.     if(BTX_2line_based_colors)
  286.       {
  287.       ArrayInitialize(fC0Buffer, 0);
  288.       ArrayInitialize(fA8Buffer, 0);
  289.       ArrayInitialize(fC8Buffer, 0);
  290.       ArrayInitialize(list, 0);
  291.       initFlag = false;
  292.       limitValue = 0; startValue = 0; loopParam = 0; loopCriteria = 0;
  293.       cycleLimit = 0; highLimit = 0; counterA = 0; counterB = 0;
  294.       cycleDelta = 0; lowDValue = 0; highDValue = 0; absValue = 0; paramA = 0; paramB = 0;
  295.       phaseParam = 0; logParam = 0; JMAValue = 0; series = 0; sValue = 0; sqrtParam = 0; lengthDivider = 0;
  296.       s58 = 0; s60 = 0; s40 = 0; s38 = 0; s68 = 0;
  297.       ArrayInitialize(ring2, 0);
  298.       ArrayInitialize(ring1, 0);
  299.       ArrayInitialize(buffer, 0);
  300.       limitValue = 63;
  301.       startValue = 64;
  302.       for(i = 0; i <= limitValue; i++)   list[i] = -1000000;
  303.       for(i = startValue; i <= 127; i++) list[i] = 1000000;
  304.       initFlag = true;
  305.       if(JMA_Length < 1.0000000002) lengthParam = 0.0000000001;
  306.       else                          lengthParam = (JMA_Length - 1) / 2.0;
  307.       if(JMA_Phase < -100)     phaseParam = 0.5;
  308.       else if(JMA_Phase > 100) phaseParam = 2.5;
  309.       else                     phaseParam = JMA_Phase / 100.0 + 1.5;
  310.       logParam = MathLog(MathSqrt(lengthParam)) / MathLog(2.0);
  311.       if(logParam + 2.0 < 0) logParam = 0;
  312.       else                   logParam = logParam + 2.0;
  313.       sqrtParam     = MathSqrt(lengthParam) * logParam;
  314.       lengthParam   = lengthParam * 0.9;
  315.       lengthDivider = lengthParam / (lengthParam + 2.0);
  316.       for(i = bars - BTX_period - 1; i >= 0; i--)
  317.         jma(RawBTXp, maBTXp, i);
  318.       ArrayInitialize(fC0Buffer, 0);
  319.       ArrayInitialize(fA8Buffer, 0);
  320.       ArrayInitialize(fC8Buffer, 0);
  321.       ArrayInitialize(list, 0);
  322.       initFlag = false;
  323.       limitValue = 0; startValue = 0; loopParam = 0; loopCriteria = 0;
  324.       cycleLimit = 0; highLimit = 0; counterA = 0; counterB = 0;
  325.       cycleDelta = 0; lowDValue = 0; highDValue = 0; absValue = 0; paramA = 0; paramB = 0;
  326.       phaseParam = 0; logParam = 0; JMAValue = 0; series = 0; sValue = 0; sqrtParam = 0; lengthDivider = 0;
  327.       s58 = 0; s60 = 0; s40 = 0; s38 = 0; s68 = 0;
  328.       ArrayInitialize(ring2, 0);
  329.       ArrayInitialize(ring1, 0);
  330.       ArrayInitialize(buffer, 0);
  331.       limitValue = 63;
  332.       startValue = 64;
  333.       for(i = 0; i <= limitValue; i++)   list[i] = -1000000;
  334.       for(i = startValue; i <= 127; i++) list[i] = 1000000;
  335.       initFlag = true;
  336.       if(JMA_Length < 1.0000000002) lengthParam = 0.0000000001;
  337.       else                          lengthParam = (JMA_Length - 1) / 2.0;
  338.       if(JMA_Phase < -100)     phaseParam = 0.5;
  339.       else if(JMA_Phase > 100) phaseParam = 2.5;
  340.       else                     phaseParam = JMA_Phase / 100.0 + 1.5;
  341.       logParam = MathLog(MathSqrt(lengthParam)) / MathLog(2.0);
  342.       if(logParam + 2.0 < 0) logParam = 0;
  343.       else                   logParam = logParam + 2.0;
  344.       sqrtParam     = MathSqrt(lengthParam) * logParam;
  345.       lengthParam   = lengthParam * 0.9;
  346.       lengthDivider = lengthParam / (lengthParam + 2.0);
  347.       for(i = bars - BTX_period - 1; i >= 0; i--)
  348.         jma(RawBTXn, maBTXn, i);
  349.       for(i = bars - BTX_period - 1 - JMA_Length; i >= 0; i--)
  350.         {
  351.         if( !(Colors_use_threshold) ||
  352.             (!(Show_BTX_2line_diff_instead) && (BTX[i] >= Threshold)) ||
  353.             ((Show_BTX_2line_diff_instead) && (MathAbs(maBTXp[i] - maBTXn[i]) >= Threshold)) )
  354.           {
  355.           if(maBTXp[i] > maBTXn[i]) { if(Show_BTX_2line_diff_instead) BTXbull[i] = (maBTXp[i] - maBTXn[i]); else BTXbull[i] = BTX[i]; }
  356.           else if(maBTXn[i] > maBTXp[i]) { if(Show_BTX_2line_diff_instead) BTXbear[i] = (maBTXn[i] - maBTXp[i]) ; else BTXbear[i] = BTX[i]; }
  357.           }
  358.         else { maBTXp[i] = 0; maBTXn[i] = 0; }
  359.         }
  360.       }
  361.     }
  362.  
  363.   int limitx;
  364.   if(!Use_JMA_instead_TEMA) limitx = bars - BTX_period - 1 - 3*SmLen;
  365.   else                      limitx = bars - BTX_period - 1 - JMA_Length;
  366.   if(Show_SD)
  367.     for(i = limit; i >= 0; i--)
  368.       if(i < limitx - SD_len)
  369.         {
  370.         if(Show_SD_up) SD[i] = iBandsOnArray(BTX, 0, SD_len, SD_up, 0, MODE_UPPER, i);
  371.         if(Show_SD_dn) SD2[i] = iBandsOnArray(BTX, 0, SD_len, SD_dn, 0, MODE_LOWER, i);
  372.         if(Show_SD_md) SD3[i] = (iBandsOnArray(BTX, 0, SD_len, SD_up, 0, MODE_UPPER, i)+
  373.                                  iBandsOnArray(BTX, 0, SD_len, SD_dn, 0, MODE_LOWER, i)) / 2;
  374.         }
  375.  
  376.   return(0);
  377. }
  378.  
  379. double jma(double& input[], double& output[], int shift)
  380. {
  381.   series = input[shift];
  382.   if(loopParam < 61)
  383.     {
  384.     loopParam++;
  385.     buffer[loopParam] = series;
  386.     }
  387.   if(loopParam > 30)
  388.     {
  389.     if(initFlag)
  390.       {
  391.       initFlag = false;
  392.       int diffFlag = 0;
  393.       for(int i = 1; i <= 29; i++)
  394.         if(buffer[i + 1] != buffer[i]) diffFlag = 1;
  395.       highLimit = diffFlag * 30;
  396.       if(highLimit == 0) paramB = series;
  397.       else               paramB = buffer[1];
  398.       paramA = paramB;
  399.       if(highLimit > 29) highLimit = 29;
  400.       }
  401.     else
  402.       highLimit = 0;
  403.     for(i = highLimit; i >= 0; i--)
  404.       {
  405.       if(i == 0) sValue = series; else sValue = buffer [31 - i];
  406.       if(MathAbs(sValue - paramA) > MathAbs(sValue - paramB)) absValue = MathAbs(sValue - paramA); else absValue = MathAbs(sValue - paramB);
  407.       double dValue = absValue + 0.0000000001;
  408.       if(counterA <= 1) counterA = 127; else counterA--;
  409.       if(counterB <= 1) counterB = 10;  else counterB--;
  410.       if(cycleLimit < 128) cycleLimit++;
  411.       cycleDelta += (dValue - ring2[counterB]);
  412.       ring2[counterB] = dValue;
  413.       if(cycleLimit > 10) highDValue = cycleDelta / 10.0; else highDValue = cycleDelta / cycleLimit;
  414.       if(cycleLimit > 127)
  415.         {
  416.         dValue = ring1[counterA];
  417.         ring1[counterA] = highDValue;
  418.         s68 = 64; s58 = s68;
  419.         while(s68 > 1)
  420.           {
  421.           if(list[s58] < dValue)
  422.             {
  423.             s68 = s68 / 2.0;
  424.             s58 += s68;
  425.             }
  426.           else if(list[s58] == dValue)
  427.             s68 = 1;
  428.           else
  429.             {
  430.             s68 = s68 / 2.0;
  431.             s58 -= s68;
  432.             }
  433.           }
  434.         }
  435.       else
  436.         {
  437.         ring1[counterA] = highDValue;
  438.         if((limitValue + startValue) > 127)
  439.           {
  440.           startValue--;
  441.           s58 = startValue;
  442.           }
  443.         else
  444.           {
  445.           limitValue++;
  446.           s58 = limitValue;
  447.           }
  448.         if(limitValue > 96) s38 = 96; else s38 = limitValue;
  449.         if(startValue < 32) s40 = 32; else s40 = startValue;
  450.         }
  451.       s68 = 64;
  452.       s60 = s68;
  453.       while(s68 > 1)
  454.         {
  455.         if(list[s60] >= highDValue)
  456.           {
  457.           if(list[s60 - 1] <= highDValue)
  458.             s68 = 1;
  459.           else
  460.             {
  461.             s68 = s68 / 2.0;
  462.             s60 -= s68;
  463.             }
  464.           }
  465.         else
  466.           {
  467.           s68 = s68 / 2.0;
  468.           s60 += s68;
  469.           }
  470.         if((s60 == 127) && (highDValue > list[127])) s60 = 128;
  471.         }
  472.       if(cycleLimit > 127)
  473.         {
  474.         if(s58 >= s60)
  475.           {
  476.           if(((s38 + 1) > s60) && ((s40 - 1) < s60))
  477.             lowDValue += highDValue;
  478.           else if((s40 > s60) && ((s40 - 1) < s58))
  479.             lowDValue += list[s40 - 1];
  480.           }
  481.         else if(s40 >= s60)
  482.           {
  483.           if(((s38 + 1) < s60) && ((s38 + 1) > s58))
  484.             lowDValue += list[s38 + 1];
  485.           }
  486.         else if((s38 + 2) > s60)
  487.           lowDValue += highDValue;
  488.         else if(((s38 + 1) < s60) && ((s38 + 1) > s58))
  489.           lowDValue += list[s38 + 1];
  490.         if(s58 > s60)
  491.           {
  492.           if(((s40 - 1) < s58) && ((s38 + 1) > s58))
  493.             lowDValue -= list[s58];
  494.           else if((s38 < s58) && ((s38 + 1) > s60))
  495.             lowDValue -= list[s38];
  496.           }
  497.         else
  498.           {
  499.           if(((s38 + 1) > s58) && ((s40 - 1) < s58))
  500.             lowDValue -= list[s58];
  501.           else if((s40 > s58) && (s40 < s60))
  502.             lowDValue -= list[s40];
  503.           }
  504.         }
  505.       if(s58 <= s60)
  506.         {
  507.         if(s58 >= s60) list[s60] = highDValue;
  508.         else
  509.           {
  510.           for(int j = s58 + 1; j <= (s60 - 1); j++)
  511.             list[j - 1] = list[j];
  512.           list[s60 - 1] = highDValue;
  513.           }
  514.         }
  515.       else
  516.         {
  517.         for(j = s58 - 1; j >= s60; j--)
  518.           list[j + 1] = list[j];
  519.         list[s60] = highDValue;
  520.         }
  521.       if(cycleLimit <= 127)
  522.         {
  523.         lowDValue = 0;
  524.         for(j = s40; j <= s38; j++)
  525.           lowDValue += list[j];
  526.         }
  527.       if((loopCriteria + 1) > 31) loopCriteria = 31; else loopCriteria++;
  528.       double JMATempValue, sqrtDivider = sqrtParam / (sqrtParam + 1.0);
  529.       if(loopCriteria <= 30)
  530.         {
  531.         if(sValue - paramA > 0) paramA = sValue; else paramA = sValue - (sValue - paramA) * sqrtDivider;
  532.         if(sValue - paramB < 0) paramB = sValue; else paramB = sValue - (sValue - paramB) * sqrtDivider;
  533.         JMATempValue = series;
  534.         if(loopCriteria == 30)
  535.           {
  536.           fC0Buffer[shift] = series;
  537.           int intPart;
  538.           if(MathCeil(sqrtParam) >= 1) intPart = MathCeil(sqrtParam); else intPart = 1;
  539.           int leftInt = IntPortion(intPart);
  540.           if(MathFloor(sqrtParam) >= 1) intPart = MathFloor(sqrtParam); else intPart = 1;
  541.           int rightPart = IntPortion (intPart);
  542.           if(leftInt == rightPart) dValue = 1.0;
  543.           else                     dValue = (sqrtParam - rightPart) / (leftInt - rightPart);
  544.           if(rightPart <= 29) int upShift = rightPart; else upShift = 29;
  545.           if(leftInt <= 29) int dnShift = leftInt; else dnShift = 29;
  546.           fA8Buffer[shift] = (series - buffer[loopParam - upShift]) * (1 - dValue) / rightPart + (series - buffer[loopParam - dnShift]) * dValue / leftInt;
  547.           }
  548.         }
  549.       else
  550.         {
  551.         double powerValue, squareValue;
  552.         dValue = lowDValue / (s38 - s40 + 1);
  553.         if(0.5 <= logParam - 2.0) powerValue = logParam - 2.0;
  554.         else                      powerValue = 0.5;
  555.         if(logParam >= MathPow(absValue/dValue, powerValue)) dValue = MathPow(absValue/dValue, powerValue); else dValue = logParam;
  556.         if(dValue < 1) dValue = 1;
  557.         powerValue = MathPow(sqrtDivider, MathSqrt (dValue));
  558.         if(sValue - paramA > 0) paramA = sValue; else paramA = sValue - (sValue - paramA) * powerValue;
  559.         if(sValue - paramB < 0) paramB = sValue; else paramB = sValue - (sValue - paramB) * powerValue;
  560.         }
  561.       }
  562.     if(loopCriteria > 30)
  563.       {
  564.       JMATempValue = output[shift + 1];
  565.       powerValue   = MathPow(lengthDivider, dValue);
  566.       squareValue  = MathPow(powerValue, 2);
  567.       fC0Buffer[shift] = (1 - powerValue) * series + powerValue * fC0Buffer[shift + 1];
  568.       fC8Buffer[shift] = (series - fC0Buffer[shift]) * (1 - lengthDivider) + lengthDivider * fC8Buffer[shift + 1];
  569.       fA8Buffer[shift] = (phaseParam * fC8Buffer[shift] + fC0Buffer[shift] - JMATempValue) *
  570.                          (powerValue * (-2.0) + squareValue + 1) + squareValue * fA8Buffer[shift + 1];
  571.       JMATempValue += fA8Buffer[shift];
  572.       }
  573.     JMAValue = JMATempValue;
  574.     }
  575.   if(loopParam <= 30) JMAValue = 0;
  576.   output[shift] = JMAValue;
  577. }
  578.  
  579. int IntPortion(double param)
  580. {
  581.   if (param > 0) return (MathFloor (param));
  582.   if (param < 0) return (MathCeil (param));
  583.   return (0);
  584. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement