Advertisement
Guest User

Ocn_BTXx

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