//+------------------------------------------------------------------+
//| This MQL is generated by Expert Advisor Builder                  |
//|                http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ |
//|                                                                  |
//|  In no event will author be liable for any damages whatsoever.   |
//|                      Use at your own risk.                       |
//|                                                                  |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+

#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4

#property copyright "Liberty Technology Systems, Inc."
#property link      ""

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Aqua
#property indicator_color3 Blue
/*
#import "ltsfx.dll"
   int LTSFX_Create(string a0, int a1, string a2, string a3, string a4);
   int LTSFX_Delete(int a0);
   int LTSFX_Borrow(string a0);
   int LTSFX_Return(int a0);
   int LPAIR_Create(int a0, string a1, double a2);
   int LPAIR_Delete(int a0);
   int LPAIR_Borrow(int a0, string a1);
   int LPAIR_Return(int a0);
   int LPAIR_SetSpread(int a0, int a1);
   int LPAIR_Update(int a0, double a1, int a2);
   int LPAIR_FeedInit(int a0, int a1);
   int LPAIR_FeedData(int a0, int a1, double& a2[]);
   int LPAIR_FeedDone(int a0);
*/
#import "kernel32.dll"
   int GetTimeZoneInformation(int& a0[]);
#import

extern string ___VERSION_1.24___ = "";
extern int TargetLabelSize = 2;
extern int StopLabelSize = 2;
extern int ArrowSize = 2;
extern bool AudioAlert = TRUE;
bool Humor = FALSE;
extern string Reserved = "";
double g_ibuf_112[];
double g_ibuf_116[];
double g_ibuf_120[];
int g_period_124 = 115;
int g_period_128 = 9;
int g_period_132 = 6;
double gd_136;
bool gi_144;
datetime g_time_148;
int gi_152;
int g_str2time_156;
double gd_160;
int gi_168;
double gda_172;
bool gi_176;
int g_count_180;
int g_count_184;
int g_count_188;
int g_count_192;
int gia_196[9] = {1, 5, 15, 30, 60, 240, 1440, 10080, 43200};
int gia_200[9] = {0, 1, 1, 2, 4, 8, 15, 30, 60};
int gia_204[9] = {6, 8, 12, 25, 50, 80, 150, 400, 700};
int gia_208[9] = {2, 3, 4, 5, 6, 8, 10, 15, 20};
string gs_212 = "";
int gi_unused_220 = 0;
string gs_unused_224 = "Rubcn";
bool gi_unused_232 = FALSE;
bool gi_unused_236 = FALSE;
string gs_unused_240 = "Rubicon";
string gs_unused_248 = "";
int gi_unused_256 = 1;
int gi_unused_260 = 0;
int gi_unused_264 = 0;
int gia_unused_268[16];
int gi_272;
double gd_276;
double gd_284;
int gi_unused_292;
int gi_296;
int g_datetime_300;
double gd_304;
int gi_unused_312;
int gi_316;
double gd_320;
double gd_328;
double gd_336;
double gd_344;
double g_bid_352;
double g_bid_360;
int gi_368;
int gi_372;
int gi_376;
string gs_380;
string gs_388;
double gd_396;
int gi_unused_404;
string g_symbol_408;
int g_timeframe_416;
int g_period_420;
int g_period_424;
bool gi_428;
int gi_432;
int gi_436;
int gi_unused_440;
int gi_444;
int gi_448;
int gi_452;
int g_ma_method_456 = MODE_EMA;
int g_applied_price_460 = PRICE_OPEN;
string g_symbol_464;
int g_timeframe_472;
double gd_476;
int gi_484;
int g_index_488;
int gi_492;
double gd_496;
int gia_504[100];
int gia_508[100][8];
double gda_512[100][8];
int gia_516[100][8];
double gda_520[100][8];
double gda_524[100][8];

int LU_ValidSymbol(string a_symbol_0) {
   double l_bid_8 = MarketInfo(a_symbol_0, MODE_BID);
   if (GetLastError() == 4106/* UNKNOWN_SYMBOL */) return (0);
   return (1);
}

int LU_ValidTimeframe(int ai_0) {
   int li_4 = 10;
   int lia_8[10] = {0, 1, 5, 15, 30, 60, 240, 1440, 10080, 43200};
   for (int l_index_12 = 0; l_index_12 < li_4; l_index_12++)
      if (ai_0 == lia_8[l_index_12]) break;
   if (l_index_12 < li_4) return (1);
   return (0);
}

int LU_ExtraDigit() {
   int l_digits_0 = MarketInfo("EURUSD" + LU_SymbolExtra(), MODE_DIGITS);
   if (l_digits_0 == 5) return (1);
   return (0);
}

double LU_Point(string a_symbol_0) {
   double ld_ret_8 = MarketInfo(a_symbol_0, MODE_POINT);
   if (LU_ExtraDigit() == 1) ld_ret_8 = 10.0 * ld_ret_8;
   return (ld_ret_8);
}

string LU_SymbolExtra() {
   string ls_0 = Symbol();
   int l_str_len_8 = StringLen(ls_0);
   if (l_str_len_8 <= 6) return ("");
   return (StringSubstr(ls_0, 6, l_str_len_8 - 6));
}

int LU_Near(double ad_0, double ad_8) {
   double ld_16 = ad_0 - ad_8;
   if (MathAbs(ld_16) < 0.00001) return (0);
   if (ld_16 < 0.0) return (-1);
   return (1);
}

double LU_Hull(string a_symbol_0, int a_timeframe_8, int ai_12, int a_ma_method_16, int a_applied_price_20, int ai_24) {
   double lda_36[];
   int l_period_32 = MathSqrt(ai_12);
   ArrayResize(lda_36, ai_12);
   ArraySetAsSeries(lda_36, TRUE);
   for (int l_index_28 = 0; l_index_28 < ai_12; l_index_28++) {
      lda_36[l_index_28] = 2.0 * iMA(a_symbol_0, a_timeframe_8, ai_12 / 2, 0, a_ma_method_16, a_applied_price_20, ai_24 + l_index_28) - iMA(a_symbol_0, a_timeframe_8, ai_12, 0, a_ma_method_16, a_applied_price_20, ai_24 +
         l_index_28);
   }
   double l_ima_on_arr_40 = iMAOnArray(lda_36, 0, l_period_32, 0, a_ma_method_16, 0);
   return (l_ima_on_arr_40);
}

void Tick_Init() {
   gi_272 = LU_ExtraDigit();
   gd_284 = MarketInfo(Symbol(), MODE_SPREAD);
   if (gi_272 == 1) gd_284 /= 10.0;
   gi_296 = gd_284 + 0.5;
   gi_unused_292 = gi_296;
   g_datetime_300 = TimeCurrent();
   gd_304 = 10.0;
   gd_320 = 0.0;
   gd_328 = 0.0;
   gd_336 = 0.0;
   gd_344 = 0.0;
   g_bid_352 = Bid;
   g_bid_360 = Bid;
   gd_276 = Point;
   if (gi_272 == 1) gd_276 = 10.0 * gd_276;
}

void Tick_Start() {
   gi_unused_292 = gi_296;
   double ld_0 = MarketInfo(Symbol(), MODE_SPREAD);
   if (gi_272 == 1) ld_0 /= 10.0;
   gd_284 = (3.0 * gd_284 + ld_0) / 4.0;
   gi_296 = gd_284 + 0.5;
   int l_datetime_8 = TimeCurrent();
   int li_12 = l_datetime_8 - g_datetime_300;
   g_datetime_300 = l_datetime_8;
   gd_304 = (3.0 * gd_304 + li_12) / 4.0;
   gi_unused_312 = gd_304;
   gi_316 = li_12;
   bool li_16 = gi_316;
   if (li_16 == FALSE) li_16 = TRUE;
   gd_320 = (Bid - g_bid_360) / gd_276;
   gd_328 = 60.0 * (gd_320 / li_16);
   gd_336 = (3.0 * gd_336 + MathAbs(gd_328)) / 4.0;
   gd_344 = (3.0 * gd_336 + gd_328) / 4.0;
   g_bid_360 = g_bid_352;
   g_bid_352 = Bid;
}

int LSys_Init() {
   gi_368 = 0;
   gi_372 = 0;
   gi_376 = 0;
   gs_380 = StringSubstr(Symbol(), 0, 6);
   gs_388 = LU_SymbolExtra();
   gd_396 = LU_Point(Symbol());
   if (gs_212 == "Opus535") gi_unused_404 = 1;
   else gi_unused_404 = 0;
   Tick_Init();
   return (0);
}
/*
int LSys_Done() {
   if (gi_372 > 0) LPAIR_Delete(gi_372);
   if (gi_368 > 0) LTSFX_Delete(gi_368);
   return (0);
}
*/
int LSys_NULL_Start() {
   int li_0 = gi_376;
   if (li_0 != 0)
      if (li_0 != 5) return (0);
   gi_376 = 5;
   Tick_Start();
   return (0);
}

int TE_Setup(string as_0, int ai_8, int ai_12, int ai_16, int ai_20, int ai_24, int ai_28, int ai_32, int ai_36, int ai_40, int ai_44) {
   if (LU_ValidSymbol(as_0) == 0) return (0);
   if (LU_ValidTimeframe(ai_8) == 0) return (0);
   if (ai_12 < 10 || ai_12 > 500) return (0);
   if (ai_16 < 2 || ai_16 > 250 || ai_16 >= ai_12) return (0);
   if (ai_24 < 1 || ai_24 > 100) return (0);
   if (ai_28 < 1 || ai_28 > 1000) return (0);
   if (ai_32 < 0 || ai_32 > 50) return (0);
   if (ai_36 < 0 || ai_36 > 500) return (0);
   if (ai_40 < 0 || ai_40 > 250) return (0);
   if (ai_44 < 2 || ai_44 > 1000) return (0);
   g_symbol_408 = as_0;
   g_timeframe_416 = ai_8;
   g_period_420 = ai_12;
   g_period_424 = ai_16;
   gi_428 = ai_20;
   gi_432 = ai_24;
   gi_436 = ai_28;
   gi_unused_440 = ai_32;
   gi_448 = ai_36;
   gi_444 = ai_40;
   gi_452 = ai_44;
   return (1);
}

void TE_SetSpread(int ai_0) {
   gi_unused_440 = ai_0;
}

int TE_Signal(int ai_0, double &ad_4, int &a_count_12) {
   int li_16;
   int li_32;
   int li_36;
   int li_20 = TE_PreviousCross(ai_0);
   int li_ret_24 = TE_Cross(li_20, li_16);
   ad_4 = TE_CrossThreshold(li_20);
   int li_28 = TE_CrossTrigger(li_20, ad_4);
   a_count_12 = 0;
   if (gi_448 > 0) {
      li_32 = MathAbs(ad_4 - TE_Spine(li_20)) / gd_396;
      if (li_32 >= gi_448) return (0);
   }
   if (li_16==1) a_count_12 = -1;
   if (li_28 < 0) return (li_ret_24);
   if (li_28 == ai_0) return (li_ret_24 * 2);
   for (int li_40 = gi_436 - 1; li_40 > 0; li_40--) {
      li_36 = TE_Reset(li_ret_24, li_28, ad_4);
      if (li_36 == 0) return (0);
      if (ai_0 > li_36) return (0);
      a_count_12++;
      ad_4 = TE_ResetThreshold(li_ret_24, li_36);
      li_28 = TE_ResetTrigger(li_ret_24, li_36, ad_4);
      if (li_28 < 0 || (li_28 >= 0 && ai_0 > li_28)) return (li_ret_24);
      if (li_28 == ai_0) return (li_ret_24 * 2);
   }
   return (0);
}

int TE_ResetTrigger(int ai_0, int ai_4, double ad_8) {
   while (ai_4 >= 0) {
      if (ai_0 > 0) {
         if (TE_Track(ai_4) <= TE_Spine(ai_4)) break;
         if (iHigh(g_symbol_408, g_timeframe_416, ai_4) > ad_8) return (ai_4);
      }
      if (ai_0 < 0) {
         if (TE_Track(ai_4) >= TE_Spine(ai_4)) break;
         if (iLow(g_symbol_408, g_timeframe_416, ai_4) < ad_8) return (ai_4);
      }
      ai_4--;
   }
   return (-1);
}

double TE_ResetThreshold(int ai_0, int ai_4) {
   double ld_ret_12;
   if (ai_0 > 0) ld_ret_12 = 0.0;
   else ld_ret_12 = D'09.09.2001 03:46:39';
   for (int li_8 = ai_4 + 1; li_8 <= ai_4 + gi_432; li_8++) {
      if (ai_0 > 0 && iHigh(g_symbol_408, g_timeframe_416, li_8) > ld_ret_12) ld_ret_12 = iHigh(g_symbol_408, g_timeframe_416, li_8);
      else
         if (ai_0 < 0 && iLow(g_symbol_408, g_timeframe_416, li_8) < ld_ret_12) ld_ret_12 = iLow(g_symbol_408, g_timeframe_416, li_8);
   }
   return (ld_ret_12);
}

int TE_Reset(int ai_0, int ai_4, double ad_8) {
   double ld_28;
   double ld_36;
   double ld_44;
   bool li_20 = FALSE;
   bool li_24 = FALSE;
   if (ai_0 > 0) ld_28 = ad_8 + gi_452 * gd_396;
   else ld_28 = ad_8 - gi_452 * gd_396;
   for (int li_ret_16 = ai_4; li_ret_16 > 0; li_ret_16--) {
      if (ai_0 > 0) {
         if (TE_Track(li_ret_16) <= TE_Spine(li_ret_16)) break;
         if (iHigh(g_symbol_408, g_timeframe_416, li_ret_16) >= ld_28) {
            li_20 = TRUE;
            break;
         }
      }
      if (ai_0 < 0) {
         if (TE_Track(li_ret_16) >= TE_Spine(li_ret_16)) break;
         if (iLow(g_symbol_408, g_timeframe_416, li_ret_16) <= ld_28) {
            li_20 = TRUE;
            break;
         }
      }
   }
   if (li_20 == FALSE) return (0);
   if (li_ret_16 > ai_4 - 2) li_ret_16 = ai_4 - 2;
   while (li_ret_16 > 0) {
      if (ai_0 > 0) {
         if (TE_Track(li_ret_16) <= TE_Spine(li_ret_16)) break;
         ld_36 = iHigh(g_symbol_408, g_timeframe_416, li_ret_16 + 2) - gd_396;
         if (iHigh(g_symbol_408, g_timeframe_416, li_ret_16) <= ld_36 && iHigh(g_symbol_408, g_timeframe_416, li_ret_16 + 1) <= ld_36) {
            li_24 = TRUE;
            break;
         }
      } else {
         if (ai_0 < 0) {
            if (TE_Track(li_ret_16) >= TE_Spine(li_ret_16)) break;
            ld_44 = iLow(g_symbol_408, g_timeframe_416, li_ret_16 + 2) + gd_396;
            if (iLow(g_symbol_408, g_timeframe_416, li_ret_16) >= ld_44 && iLow(g_symbol_408, g_timeframe_416, li_ret_16 + 1) >= ld_44) {
               li_24 = TRUE;
               break;
            }
         }
      }
      li_ret_16--;
   }
   if (li_24 == FALSE) return (0);
   return (li_ret_16);
}

int TE_PreviousCross(int ai_0) {
   int li_4;
   while (ai_0 < iBars(g_symbol_408, g_timeframe_416)) {
      if (TE_Cross(ai_0, li_4) != 0) break;
      ai_0++;
   }
   if (ai_0 == iBars(g_symbol_408, g_timeframe_416)) return (-1);
   return (ai_0);
}

int TE_NextCross(int ai_0) {
   int li_4;
   while (ai_0 >= 0) {
      if (TE_Cross(ai_0, li_4) != 0) break;
      ai_0--;
   }
   if (ai_0 < 0) return (-1);
   return (ai_0);
}

int TE_CrossTrigger(int ai_0, double ad_4) {
   int li_12;
   int li_16 = TE_Cross(ai_0, li_12);
   if (li_16 == 0) return (-1);
   while (ai_0 >= 0) {
      if (li_16 > 0) {
         if (TE_Track(ai_0) <= TE_Spine(ai_0)) break;
         if (iHigh(g_symbol_408, g_timeframe_416, ai_0) > ad_4) return (ai_0);
      }
      if (li_16 < 0) {
         if (TE_Track(ai_0) >= TE_Spine(ai_0)) break;
         if (iLow(g_symbol_408, g_timeframe_416, ai_0) < ad_4) return (ai_0);
      }
      ai_0--;
   }
   return (-1);
}

double TE_CrossThreshold(int ai_0) {
   int li_4;
   double ld_ret_16;
   int li_8 = TE_Cross(ai_0, li_4);
   if (li_8 == 0) return (0.0);
   if (li_4==1) {
      if (li_8 > 0) return (iHigh(g_symbol_408, g_timeframe_416, ai_0 + 1));
      return (iLow(g_symbol_408, g_timeframe_416, ai_0 + 1));
   }
   if (li_8 > 0) ld_ret_16 = 0.0;
   else ld_ret_16 = D'09.09.2001 03:46:39';
   for (int li_12 = ai_0 + 1; li_12 <= ai_0 + gi_432; li_12++) {
      if (li_8 > 0 && iHigh(g_symbol_408, g_timeframe_416, li_12) > ld_ret_16) ld_ret_16 = iHigh(g_symbol_408, g_timeframe_416, li_12);
      else
         if (li_8 < 0 && iLow(g_symbol_408, g_timeframe_416, li_12) < ld_ret_16) ld_ret_16 = iLow(g_symbol_408, g_timeframe_416, li_12);
   }
   return (ld_ret_16);
}

int TE_Cross(int ai_0, int &ai_4) {
   double ld_8 = TE_Spine(ai_0);
   double ld_16 = TE_Spine(ai_0 + 1);
   double ld_24 = TE_Track(ai_0);
   double ld_32 = TE_Track(ai_0 + 1);
   ai_4 = 0;
   if (ld_24 > ld_8 && ld_32 <= ld_16) return (1);
   if (ld_24 < ld_8 && ld_32 >= ld_16) return (-1);
   int li_ret_40 = 0;
   if (gi_444 > 0) {
      li_ret_40 = TE_Bounce(ai_0);
      if (li_ret_40 != 0) {
         for (int li_44 = 1; li_44 <= 10; li_44++)
            if (TE_Bounce(ai_0 + li_44) != 0) return (0);
      }
      if (li_ret_40 != 0) ai_4 = 1;
   }
   return (li_ret_40);
}

int TE_Bounce(int ai_0) {
   double l_iclose_28;
   double ld_36;
   double ld_44;
   double ld_4 = TE_Spine(ai_0 + 1);
   double ld_12 = TE_Track(ai_0 + 1);
   double l_iclose_20 = iClose(g_symbol_408, g_timeframe_416, ai_0 + 1);
   bool li_52 = FALSE;
   bool li_56 = FALSE;
   if (l_iclose_20 > ld_4 && l_iclose_20 > ld_12 && ld_12 > ld_4) {
      for (int li_60 = 2; li_60 <= 6; li_60++) {
         l_iclose_28 = iClose(g_symbol_408, g_timeframe_416, ai_0 + li_60);
         ld_36 = TE_Spine(ai_0 + li_60);
         ld_44 = TE_Track(ai_0 + li_60);
         if (l_iclose_28 > ld_36 && l_iclose_28 > ld_44) break;
         if (l_iclose_28 < ld_36 && l_iclose_28 < ld_44) li_52 = TRUE;
         if (MathAbs(ld_36 - ld_44) / gd_396 <= gi_444) li_56 = TRUE;
      }
      if (!(li_52 && li_56)) return (0);
      return (1);
   }
   if (l_iclose_20 < ld_4 && l_iclose_20 < ld_12 && ld_12 < ld_4) {
      for (li_60 = 2; li_60 <= 6; li_60++) {
         l_iclose_28 = iClose(g_symbol_408, g_timeframe_416, ai_0 + li_60);
         ld_36 = TE_Spine(ai_0 + li_60);
         ld_44 = TE_Track(ai_0 + li_60);
         if (l_iclose_28 < ld_36 && l_iclose_28 < ld_44) break;
         if (l_iclose_28 > ld_36 && l_iclose_28 > ld_44) li_52 = TRUE;
         if (MathAbs(ld_36 - ld_44) / gd_396 <= gi_444) li_56 = TRUE;
      }
      if (li_52 && li_56) return (-1);
   }
   return (0);
}

double TE_Spine(int ai_0) {
   return (iMA(g_symbol_408, g_timeframe_416, g_period_420, 0, g_ma_method_456, g_applied_price_460, ai_0));
}

double TE_Track(int ai_0) {
   if (gi_428) return (LU_Hull(g_symbol_408, g_timeframe_416, g_period_424, g_ma_method_456, g_applied_price_460, ai_0));
   return (iMA(g_symbol_408, g_timeframe_416, g_period_424, 0, g_ma_method_456, g_applied_price_460, ai_0));
}

int Wave_Setup(string as_0, int ai_8, double ad_12) {
   if (LU_ValidSymbol(as_0) == 0) return (0);
   if (LU_ValidTimeframe(ai_8) == 0) return (0);
   if (ad_12 < 0.0 || ad_12 > 500.0) return (0);
   g_symbol_464 = as_0;
   g_timeframe_472 = ai_8;
   gd_476 = ad_12;
   return (1);
}

int Wave_Build(int ai_0) {
   int li_16;
   int li_32;
   int l_index_44;
   int l_count_48;
   double ld_52;
   g_index_488 = 0;
   gi_492 = 0;
   int l_shift_4 = 0;
   if (ai_0 != 0) {
      l_shift_4 = iBarShift(g_symbol_464, g_timeframe_472, ai_0);
      if (l_shift_4 == -1) {
         Print("Wave_Build: Invalid wave date/time - using current time");
         l_shift_4 = 0;
      }
   }
   int li_8 = TE_PreviousCross(l_shift_4);
   if (li_8 == -1) return (0);
   int li_12 = TE_NextCross(li_8 - 1) + 1;
   if (li_12 == -1) li_12 = 0;
   int li_20 = TE_Cross(li_8, li_16);
   double ld_24 = TE_CrossThreshold(li_8);
   gd_496 = Wave_SwingPoint(li_20, li_8);
   double ld_36 = 0.0;
   while (li_8 >= li_12) {
      li_20 = TE_Signal(li_8, ld_24, li_32);
      if (li_20 > 0) ld_24 += gd_396 * gd_476;
      else
         if (li_20 < 0) ld_24 -= gd_396 * gd_476;
      if (li_20 != 0 && LU_Near(ld_24, ld_36) != 0) {
         ld_36 = ld_24;
         if (gi_492 == 0) gi_492 = li_20;
         gia_504[g_index_488] = 1;
         gia_508[g_index_488][0] = li_8 + 2;
         gda_512[g_index_488][0] = ld_24;
         gia_516[g_index_488][0] = -1;
         g_index_488++;
      }
      l_index_44 = g_index_488 - 1;
      l_count_48 = gia_504[l_index_44] - 1;
      if (l_index_44 >= 0 && gia_516[l_index_44][l_count_48] == li_8 + 1) {
         if (gi_492 > 0 && High[li_8] < gda_512[l_index_44][l_count_48] && gia_504[l_index_44] < 8) {
            gia_508[l_index_44][l_count_48 + 1] = li_8 + 1;
            gda_512[l_index_44][l_count_48 + 1] = iHigh(g_symbol_464, g_timeframe_472, li_8 + 1) + gd_396 * gd_476;
            gia_516[l_index_44][l_count_48 + 1] = -1;
            gia_504[l_index_44]++;
            l_count_48++;
         } else {
            if (gi_492 < 0 && Low[li_8] > gda_512[l_index_44][l_count_48] && gia_504[l_index_44] < 8) {
               gia_508[l_index_44][l_count_48 + 1] = li_8 + 1;
               gda_512[l_index_44][l_count_48 + 1] = iLow(g_symbol_464, g_timeframe_472, li_8 + 1) - gd_396 * gd_476;
               gia_516[l_index_44][l_count_48 + 1] = -1;
               gia_504[l_index_44]++;
               l_count_48++;
            }
         }
      }
      if (l_index_44 >= 0 && gia_516[l_index_44][l_count_48] == -1) {
         if ((gi_492 > 0 && iHigh(g_symbol_464, g_timeframe_472, li_8) >= gda_512[l_index_44][l_count_48]) || (gi_492 < 0 && iLow(g_symbol_464, g_timeframe_472, li_8) <= gda_512[l_index_44][l_count_48])) {
            gia_516[l_index_44][l_count_48] = li_8;
            ld_52 = Wave_MinorSwing(gi_492, gia_508[l_index_44][0], li_8);
            gda_520[l_index_44][l_count_48] = Wave_Target(gi_492, l_index_44, l_count_48, ld_52);
            gda_524[l_index_44][l_count_48] = Wave_Stop(gi_492, l_index_44, l_count_48, li_8, ld_52);
         }
      }
      li_8--;
   }
   for (l_index_44 = 0; l_index_44 < g_index_488; l_index_44++) {
      for (l_count_48 = 0; l_count_48 < gia_504[l_index_44]; l_count_48++) {
         gia_508[l_index_44][l_count_48] = iTime(g_symbol_464, g_timeframe_472, gia_508[l_index_44][l_count_48]);
         if (gia_516[l_index_44][l_count_48] != -1) gia_516[l_index_44][l_count_48] = iTime(g_symbol_464, g_timeframe_472, gia_516[l_index_44][l_count_48]);
         else gia_516[l_index_44][l_count_48] = 0;
      }
   }
   return (1);
}

void Wave_Update() {
   int l_shift_8;
   double ld_12;
   if (gi_484 != 0 || g_index_488 == 0) return;
   int li_0 = g_index_488 - 1;
   int li_4 = gia_504[li_0] - 1;
   if (gia_516[li_0][li_4] == 0) {
      if ((gi_492 > 0 && iHigh(g_symbol_464, g_timeframe_472, 0) >= gda_512[li_0][li_4]) || (gi_492 < 0 && iLow(g_symbol_464, g_timeframe_472, 0) <= gda_512[li_0][li_4])) {
         l_shift_8 = iBarShift(g_symbol_464, g_timeframe_472, gia_508[li_0][0], TRUE);
         gia_516[li_0][li_4] = iTime(g_symbol_464, g_timeframe_472, 0);
         ld_12 = Wave_MinorSwing(gi_492, l_shift_8, 0);
         gda_520[li_0][li_4] = Wave_Target(gi_492, li_0, li_4, ld_12);
         gda_524[li_0][li_4] = Wave_Stop(gi_492, li_0, li_4, l_shift_8, ld_12);
      }
   }
}

double Wave_SwingPoint(int ai_0, int ai_4) {
   double ld_24;
   double ld_32;
   int l_count_12 = 0;
   double ld_16 = TE_Track(ai_4);
   int li_8 = ai_4;
   while (true) {
      ld_24 = ld_16;
      ld_16 = TE_Track(li_8 + 1);
      ld_32 = ld_24 - ld_16;
      if ((ai_0 > 0 && ld_32 <= 0.0) || (ai_0 < 0 && ld_32 >= 0.0)) l_count_12++;
      if ((ai_0 > 0 && ld_32 > 0.0) || (ai_0 < 0 && ld_32 < 0.0)) l_count_12 = 0;
      if (l_count_12 >= 3) break;
      li_8++;
   }
   double ld_ret_44 = 0.0;
   for (int l_count_40 = 0; l_count_40 < 6; l_count_40++) {

      if (ai_0 > 0 && ld_ret_44 == 0.0 || iLow(g_symbol_464, g_timeframe_472, li_8 - l_count_40) < ld_ret_44) ld_ret_44 = iLow(g_symbol_464, g_timeframe_472, li_8 - l_count_40);
      else
         if (ai_0 < 0 && ld_ret_44 == 0.0 || iHigh(g_symbol_464, g_timeframe_472, li_8 - l_count_40) > ld_ret_44) ld_ret_44 = iHigh(g_symbol_464, g_timeframe_472, li_8 - l_count_40);
   }
   return (ld_ret_44);
}

double Wave_MinorSwing(int ai_0, int ai_4, int ai_8) {
   double ld_ret_16 = 0.0;
   for (int li_12 = ai_4; li_12 > ai_8; li_12--) {
      if (ai_0 > 0 && ld_ret_16 == 0.0 || iLow(g_symbol_464, g_timeframe_472, li_12) < ld_ret_16) ld_ret_16 = iLow(g_symbol_464, g_timeframe_472, li_12);
      else
         if (ai_0 < 0 && ld_ret_16 == 0.0 || iHigh(g_symbol_464, g_timeframe_472, li_12) > ld_ret_16) ld_ret_16 = iHigh(g_symbol_464, g_timeframe_472, li_12);
   }
   return (ld_ret_16);
}

double Wave_Target(int ai_0, int ai_4, int ai_unused_8, double ad_12) {
   double ld_28;
   double ld_ret_36;
   if (ai_4 == 0) ld_28 = gd_496;
   else ld_28 = ad_12;
   double ld_20 = MathAbs(ld_28 - gda_512[ai_4][0]) / 2.0;
   if (ai_0 > 0) ld_ret_36 = gda_512[ai_4][0] + ld_20;
   else ld_ret_36 = gda_512[ai_4][0] - ld_20;
   return (ld_ret_36);
}

double Wave_Stop(int ai_0, int ai_4, int ai_unused_8, int ai_12, double ad_16) {
   double ld_32;
   double ld_ret_40;
   double ld_48 = 2.0 * gd_476 * gd_396;
   if (ai_4 == 0) ld_32 = gd_496;
   else ld_32 = ad_16;
   double ld_24 = MathAbs(ld_32 - gda_512[ai_4][0]) / 2.0 + ld_48;
   if (ai_0 > 0) ld_ret_40 = gda_512[ai_4][0] - ld_24;
   else ld_ret_40 = gda_512[ai_4][0] + ld_24;
   if (ai_0 > 0 && ld_ret_40 > iLow(g_symbol_464, g_timeframe_472, ai_12) - ld_48) ld_ret_40 = iLow(g_symbol_464, g_timeframe_472, ai_12) - ld_48;
   else
      if (ai_0 < 0 && ld_ret_40 < iHigh(g_symbol_464, g_timeframe_472, ai_12) + ld_48) ld_ret_40 = iHigh(g_symbol_464, g_timeframe_472, ai_12) + ld_48;
   return (ld_ret_40);
}

int init() {
   gi_144 = FALSE;
   LSys_Init();
   for (int l_index_0 = 0; l_index_0 < 9; l_index_0++)
      if (Period() == gia_196[l_index_0]) break;
   if (l_index_0 == 9) return (0);
   gd_160 = gia_200[l_index_0];
   gi_168 = gia_204[l_index_0];
   gi_152 = 0;
   if (TE_Setup(Symbol(), Period(), g_period_124, g_period_128, 0, 10, 100, gi_296, 0, gia_208[l_index_0], gi_168) == 0) return (0);
   if (Wave_Setup(Symbol(), Period(), gd_160) == 0) return (0);
   if (ArrowSize < 1) ArrowSize = 1;
   if (ArrowSize > 5) ArrowSize = 5;
   if (TargetLabelSize < -5) TargetLabelSize = 0;
   if (TargetLabelSize > 5) TargetLabelSize = 5;
   if (StopLabelSize < -5) StopLabelSize = 0;
   if (StopLabelSize > 5) StopLabelSize = 5;
   if (TargetLabelSize < 0) {
      TargetLabelSize = -TargetLabelSize;
      gda_172 = 0;
   } else gda_172 = 1;
   if (StopLabelSize < 0) {
      StopLabelSize = -StopLabelSize;
      gi_176 = FALSE;
   } else gi_176 = TRUE;
   IndicatorBuffers(3);
   SetIndexBuffer(0, g_ibuf_112);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2, Red);
   SetIndexBuffer(1, g_ibuf_116);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 1, Aqua);
   SetIndexBuffer(2, g_ibuf_120);
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 2, Blue);
   IndicatorShortName("Rubcn");
   g_str2time_156 = 0;
   if (Reserved != "" && StringSubstr(Reserved, 0, 4) != "yyyy") g_str2time_156 = StrToTime(Reserved);
   gi_144 = TRUE;
   g_time_148 = 0;
   g_count_180 = 0;
   g_count_184 = 0;
   g_count_188 = 0;
   g_count_192 = 0;
   return (0);
}

int deinit() {
   if (gi_144 == FALSE) return (0);
//   LSys_Done();
   DeleteObjects();
   return (0);
}

int start() {
   if (gi_144 == FALSE) return (0);
   if (LSys_NULL_Start() != 0) return (0);
   int li_0 = Bars - IndicatorCounted() - 1;
   StartSpine(li_0);
   StartTrack(li_0);
   StartGann(li_0);
   Signals();
   return (0);
}

int StartSpine(int ai_0) {
   if (ai_0 >= Bars - g_period_124) ai_0 = Bars - g_period_124 - 1;
   while (ai_0 >= 0) {
      g_ibuf_112[ai_0] = iMA(Symbol(), Period(), g_period_124, 0, MODE_EMA, PRICE_OPEN, ai_0);
      ai_0--;
   }
   return (0);
}

int StartTrack(int ai_0) {
   if (ai_0 >= Bars - g_period_128) ai_0 = Bars - g_period_128 - 1;
   while (ai_0 >= 0) {
      g_ibuf_116[ai_0] = iMA(Symbol(), Period(), g_period_128, 0, MODE_EMA, PRICE_OPEN, ai_0);
      ai_0--;
   }
   return (0);
}

int StartGann(int ai_0) {
   double ld_4;
   double l_ima_12;
   double l_ima_20;
   if (ai_0 >= Bars - g_period_132) ai_0 = Bars - g_period_132 - 1;
   while (ai_0 >= 0) {
      l_ima_12 = iMA(Symbol(), 0, g_period_132, 0, MODE_SMA, PRICE_HIGH, ai_0 + 1);
      l_ima_20 = iMA(Symbol(), 0, g_period_132, 0, MODE_SMA, PRICE_LOW, ai_0 + 1);
      if (Close[ai_0 + 1] > l_ima_12) ld_4 = 1;
      else {
         if (Close[ai_0 + 1] < l_ima_20) ld_4 = -1;
         else ld_4 = 0;
      }
      if (ld_4 != 0.0) gd_136 = ld_4;
      if (gd_136 == -1.0) g_ibuf_120[ai_0] = l_ima_12;
      else g_ibuf_120[ai_0] = l_ima_20;
      ai_0--;
   }
   return (0);
}

void Signals() {
   int l_datetime_0 = TimeCurrent();
   TE_SetSpread(gi_296);
   if (gi_152 < l_datetime_0) {
      Wave_Build(g_str2time_156);
      RedrawSignals();
      gi_152 = l_datetime_0 + 5;
      return;
   }
   Wave_Update();
}

void RedrawSignals() {
   int li_8;
   DeleteObjects();
   for (int l_index_0 = 0; l_index_0 < g_index_488; l_index_0++) {
      for (int l_count_4 = 0; l_count_4 < gia_504[l_index_0]; l_count_4++) {
         CreateThreshold(l_index_0, l_count_4);
         if (gia_516[l_index_0][l_count_4] != 0) {
            li_8 = CreateArrow(l_index_0, l_count_4);
            if (TargetLabelSize > 0) CreateTarget(l_index_0, l_count_4);
            if (StopLabelSize > 0) CreateStop(l_index_0, l_count_4);
            if (AudioAlert && li_8 == 0 && g_time_148 != Time[0]) {
               SoundAlert(gi_492);
               g_time_148 = Time[0];
            }
         }
      }
   }
}

void CreateThreshold(int ai_0, int ai_4) {
   bool l_bool_8;
   int l_time_12;
   int l_time_16;
   int l_shift_20;
   int l_shift_24 = iBarShift(Symbol(), Period(), gia_508[ai_0][ai_4], TRUE);
   if (ai_4 == gia_504[ai_0] - 1) {
      l_time_16 = Time[l_shift_24 - 1];
      l_bool_8 = TRUE;
   } else {
      l_shift_20 = iBarShift(Symbol(), Period(), gia_508[ai_0][ai_4 + 1], TRUE);
      l_time_16 = Time[l_shift_20 - 1];
      l_bool_8 = FALSE;
   }
   if (ai_4 == 0) l_time_12 = Time[l_shift_24 + 5];
   else l_time_12 = Time[l_shift_24];
   string l_name_28 = "RC-Thr" + g_count_180;
   ObjectCreate(l_name_28, OBJ_TREND, 0, l_time_12, gda_512[ai_0][ai_4], l_time_16, gda_512[ai_0][ai_4]);
   ObjectSet(l_name_28, OBJPROP_COLOR, Green);
   ObjectSet(l_name_28, OBJPROP_STYLE, STYLE_SOLID);
   ObjectSet(l_name_28, OBJPROP_WIDTH, 1);
   ObjectSet(l_name_28, OBJPROP_RAY, l_bool_8);
   g_count_180++;
}

int CreateArrow(int ai_0, int ai_4) {
   double l_price_20;
   color l_color_36;
   int l_shift_8 = iBarShift(Symbol(), Period(), gia_516[ai_0][ai_4], TRUE);
   string l_name_12 = "RC-Arw" + g_count_184;
   double ld_28 = AvgSize(l_shift_8);
   if (gi_492 > 0) l_price_20 = Low[l_shift_8] - 0.75 * ld_28;
   else l_price_20 = High[l_shift_8] + ld_28;
   if (ai_4 == 0) l_color_36 = Yellow;
   else l_color_36 = DarkOrange;
   ObjectCreate(l_name_12, OBJ_ARROW, 0, Time[l_shift_8], l_price_20);
   if (gi_492 > 0) {
      ObjectSet(l_name_12, OBJPROP_COLOR, l_color_36);
      ObjectSet(l_name_12, OBJPROP_ARROWCODE, 233);
   } else {
      ObjectSet(l_name_12, OBJPROP_COLOR, l_color_36);
      ObjectSet(l_name_12, OBJPROP_ARROWCODE, 234);
   }
   ObjectSet(l_name_12, OBJPROP_WIDTH, ArrowSize);
   g_count_184++;
   return (l_shift_8);
}

void CreateTarget(int ai_0, int ai_4) {
   int l_shift_8 = iBarShift(Symbol(), Period(), gia_516[ai_0][ai_4], TRUE);
   string l_name_12 = "RC-Trg" + g_count_188;
   int li_24 = 5;
   if (gda_172 == 0) li_24 = 6;
   ObjectCreate(l_name_12, OBJ_ARROW, 0, Time[l_shift_8], gda_520[ai_0][ai_4]);
   ObjectSet(l_name_12, OBJPROP_COLOR, Yellow);
   ObjectSet(l_name_12, OBJPROP_WIDTH, TargetLabelSize);
   ObjectSet(l_name_12, OBJPROP_ARROWCODE, li_24);
   g_count_188++;
}

void CreateStop(int ai_0, int ai_4) {
   int l_shift_8 = iBarShift(Symbol(), Period(), gia_516[ai_0][ai_4], TRUE);
   int li_12 = 6;
   if (gi_176 == FALSE) li_12 = 5;
   string l_name_16 = "RC-Stp" + g_count_192;
   ObjectCreate(l_name_16, OBJ_ARROW, 0, Time[l_shift_8], gda_524[ai_0][ai_4]);
   ObjectSet(l_name_16, OBJPROP_COLOR, Coral);
   ObjectSet(l_name_16, OBJPROP_WIDTH, StopLabelSize);
   ObjectSet(l_name_16, OBJPROP_ARROWCODE, li_12);
   g_count_192++;
}

void DeleteObjects() {
   for (int l_count_0 = 0; l_count_0 < g_count_180; l_count_0++) ObjectDelete("RC-Thr" + l_count_0);
   for (l_count_0 = 0; l_count_0 < g_count_184; l_count_0++) ObjectDelete("RC-Arw" + l_count_0);
   for (l_count_0 = 0; l_count_0 < g_count_188; l_count_0++) ObjectDelete("RC-Trg" + l_count_0);
   for (l_count_0 = 0; l_count_0 < g_count_192; l_count_0++) ObjectDelete("RC-Stp" + l_count_0);
   g_count_180 = 0;
   g_count_184 = 0;
   g_count_188 = 0;
   g_count_192 = 0;
}

double AvgSize(int ai_0) {
   int li_8 = 10;
   double ld_12 = 0.0;
   for (int l_count_4 = 0; l_count_4 < li_8; l_count_4++) ld_12 += High[ai_0 + l_count_4] - (Low[ai_0 + l_count_4]);
   return (ld_12 / li_8);
}

void SoundAlert(int ai_0) {
   int li_4;
   if (Humor == FALSE) {
      if (ai_0 > 0) Alert("Rubicon: Buy!", Symbol(), Period());
      else
         if (ai_0 < 0) Alert("Rubicon: Sell!", Symbol(), Period());
   } 
}