#property copyright "Copyright � 2008, FOREXflash Software Corp."
#property link      "http://www.metaquotes.net"

extern int Risk_percent = 20;
extern double minLots = 0.1;
extern double maxLots = 8.0;
extern double StopLoss = 600.0;
extern double TakeProfit = 900.0;
extern bool use_hidden_stop_loss = TRUE;
extern int hidden_sl = 300;
extern bool use_hidden_take_profit = TRUE;
extern int hidden_tp = 600;
extern bool UseTrailingStop = TRUE;
extern int TrailingStop = 50;
extern int UseFastTrail = 1;
extern int Slippage = 3;
extern int OrderRetries = 5;
extern int SleepBetweenTrades = 1000;
extern int MagicNumber = 1803;
extern int iStartTradingHour = 8;
extern int iEndTradingHour = 21;
extern int MACD_Fast = 8;
extern int MACD_Slow = 17;
extern int MACD_Signal = 9;
extern int RSI = 21;
extern int Momentum = 14;
extern int DeMarker = 14;
extern int ADX = 14;
extern int ForceIndex = 14;
int gi_260 = 0;
int gi_264 = 16711680;
int gi_268 = 255;
int g_color_272 = Green;
int g_color_276 = Yellow;
double gd_280 = 0.1;
int gi_unused_288 = 0;
int gi_292;
int gi_296;
string gs_300;
string gs_308 = "FXParazite by FOREXflash";
string gs_316 = "";
int gi_unused_324 = -1;
int g_count_328 = 0;
int g_count_332 = 0;
int g_time_336 = 0;
int g_time_340 = 0;
int gi_unused_344 = 0;
double gd_unused_348 = 0.0;
double gd_unused_356 = -50.0;
bool gi_364 = TRUE;
bool gi_368 = TRUE;

int Check_Licence() {
   bool li_ret_0 = TRUE;
   //if (gs_316 == "demo") return (1);
   /*if (IsDemo() == FALSE) {
      Alert(gs_308 + ". Only demo accounts allowed.");
      li_ret_0 = FALSE;
   }*/
   return (li_ret_0);
}

void hidden_take_profit() {
   bool is_closed_8;
   int order_total_0 = OrdersTotal();
   for (int pos_4 = order_total_0 - 1; pos_4 >= 0; pos_4--) {
      OrderSelect(pos_4, SELECT_BY_POS);
      is_closed_8 = FALSE;
      if (OrderSymbol() == Symbol()) {
         if (OrderType() == OP_BUY && OrderOpenPrice() + hidden_tp * Point <= Bid) is_closed_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);
         if (OrderType() == OP_SELL && OrderOpenPrice() - hidden_tp * Point >= Ask) is_closed_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);
      }
   }
}

void hidden_stop_loss() {
   bool is_closed_8;
   int order_total_0 = OrdersTotal();
   for (int pos_4 = order_total_0 - 1; pos_4 >= 0; pos_4--) {
      OrderSelect(pos_4, SELECT_BY_POS);
      is_closed_8 = FALSE;
      if (OrderSymbol() == Symbol()) {
         if (OrderType() == OP_BUY && OrderOpenPrice() - hidden_sl * Point >= Bid) is_closed_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);
         if (OrderType() == OP_SELL && OrderOpenPrice() + hidden_sl * Point <= Ask) is_closed_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);
      }
   }
}

int init() {
   return (0);
}

int deinit() {
   return (0);
}

int FILTERS() {
   double imacd_0 = iMACD(Symbol(), Period(), MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_MAIN, 0);
   double imacd_8 = iMACD(Symbol(), Period(), MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_SIGNAL, 0);
   double iadx_16 = iADX(NULL, 0, ADX, PRICE_CLOSE, MODE_PLUSDI, 0);
   double iadx_24 = iADX(NULL, 0, ADX, PRICE_CLOSE, MODE_MINUSDI, 0);
   double irsi_32 = iRSI(NULL, 0, RSI, PRICE_CLOSE, 0);
   double idemarker_40 = iDeMarker(NULL, 0, DeMarker, 0);
   double imomentum_48 = iMomentum(NULL, 0, Momentum, PRICE_CLOSE, 0);
   double iforce_56 = iForce(NULL, 0, ForceIndex, MODE_EMA, PRICE_CLOSE, 0);
   if (imomentum_48 > 100.0 && (idemarker_40 > 0.5 && iforce_56 > 0.0) && (irsi_32 > 50.0 && imacd_0 > imacd_8 && iadx_16 > iadx_24)) return (1);
   if (imomentum_48 <= 100.0 && (idemarker_40 < 0.5 < 50 && iforce_56 < 0.0) && (irsi_32 < 50.0 && imacd_0 < imacd_8 && iadx_16 < iadx_24)) return (-1);
   return (0);
}

int start() {
   bool li_20;
   bool li_24;
   bool li_28;
   bool li_32;
   bool li_40;
   bool li_44;
   double ld_60;
   double ld_68;
   string ls_unused_76;
   string ls_unused_84;
   string ls_unused_92;
   string ls_unused_100;
   string ls_unused_108;
   string ls_116;
   double high_124;
   double low_132;
   if (use_hidden_stop_loss) hidden_stop_loss();
   if (use_hidden_take_profit) hidden_take_profit();
   Check_Licence();
   int index_0 = 0;
   int index_4 = 0;
   int li_unused_8 = 0;
   bool li_36 = FALSE;
   bool li_48 = FALSE;
   int li_unused_52 = 0;
   int li_unused_56 = 0;
   gs_300 = Symbol();
   if (UseTrailingStop && OpenTradesForMN(MagicNumber) > 0) MoveTrailingStopsPerMN(MagicNumber, TrailingStop, UseFastTrail);
   g_time_340 = Time[0];
   if (g_time_340 == g_time_336) {
      if (g_count_332 + g_count_328 == 2) return (0);
   } else {
      g_time_336 = g_time_340;
      g_count_332 = 0;
      g_count_328 = 0;
   }
   if (High[1] <= High[2] && Low[1] >= Low[2] && Close[1] <= Open[1]) li_20 = TRUE;
   else li_20 = FALSE;
   if (High[1] <= High[2] && Low[1] >= Low[2] && Close[1] > Open[1]) li_24 = TRUE;
   else li_24 = FALSE;
   if (li_24 == TRUE && Close[2] > Open[2]) li_28 = TRUE;
   else li_28 = FALSE;
   if (li_20 == TRUE && Close[2] < Open[2]) li_32 = TRUE;
   else li_32 = FALSE;
   if (Open[1] < Close[1]) ld_60 = Close[1] - (Close[1] - Open[1]) / 3.0;
   else ld_60 = Close[1] - (Close[1] - Low[1]) / 3.0;
   if (Open[1] > Close[1]) ld_68 = Close[1] + (Open[1] - Close[1]) / 3.0;
   else ld_68 = Close[1] + (High[1] - Close[1]) / 3.0;
   if (Low[0] <= ld_60 || Hour() >= gi_260 && li_32 == FALSE && li_24 == FALSE) li_40 = TRUE;
   else li_40 = FALSE;
   if (High[0] >= ld_68 || Hour() >= gi_260 && li_28 == FALSE && li_20 == FALSE) li_44 = TRUE;
   else li_44 = FALSE;
   if (High[0] > High[1]) li_36 = TRUE;
   else li_36 = FALSE;
   if (li_36 == TRUE) {
      index_0++;
      high_124 = High[index_0];
      while (high_124 < High[index_0 + 1]) {
         high_124 = High[index_0 + 1];
         index_0++;
      }
   }
   if (Low[0] < Low[1]) li_48 = TRUE;
   else li_48 = FALSE;
   if (li_48 == TRUE) {
      index_4++;
      low_132 = Low[index_4];
      while (low_132 > Low[index_4 + 1]) {
         low_132 = Low[index_4 + 1];
         index_4++;
      }
   }
   if (li_36 == TRUE) {
      Call_MM();
      if (gi_364 == FALSE && iVolume(Symbol(), 0, 0) <= 1.0) gi_364 = TRUE;
      if (Hour() <= iStartTradingHour || Hour() >= iEndTradingHour) return;
      if (li_40 == TRUE) {
         if (Low[0] > Low[1] && Low[1] < High[2]) {
            if (OpenTradesForMN(MagicNumber) == 0 && g_count_328 == 0) {
               if (FILTERS() == 1) {
                  gi_292 = OpenAtMarket(gs_300, OP_BUY, gd_280, StopLoss, TakeProfit, gs_308, MagicNumber, 0, gi_264, OrderRetries, SleepBetweenTrades);
                  gi_364 = FALSE;
                  if (StringLen(DoubleToStr(gi_292, 0)) == 1) ls_116 = "0" + gi_292;
                  else ls_116 = gi_292;
                  gi_unused_324 = 1;
                  g_count_328++;
               }
            }
         }
      }
   }
   if (li_48 == TRUE) {
      Call_MM();
      if (gi_368 == FALSE && iVolume(Symbol(), 0, 0) <= 1.0) gi_368 = TRUE;
      if (Hour() <= iStartTradingHour || Hour() >= iEndTradingHour) return;
      if (li_44 == TRUE) {
         if (High[0] < High[1]) {
            if (OpenTradesForMN(MagicNumber) == 0 && g_count_332 == 0) {
               if (FILTERS() == -1) {
                  gi_296 = OpenAtMarket(gs_300, OP_SELL, gd_280, StopLoss, TakeProfit, gs_308, MagicNumber, 0, gi_268, OrderRetries, SleepBetweenTrades);
                  gi_368 = FALSE;
                  gi_unused_324 = 0;
                  g_count_332++;
               }
            }
         }
      }
   }
   return (0);
}

void MoveTrailingStopsPerMN(int a_magic_0, int ai_4, int ai_8) {
   double price_20;
   int order_total_16 = OrdersTotal();
   for (int pos_12 = 0; pos_12 < order_total_16; pos_12++) {
      OrderSelect(pos_12, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() == OP_SELL && OrderSymbol() == gs_300 && OrderMagicNumber() == a_magic_0) {
         if (OrderStopLoss() == 0.0) {
            price_20 = NormalizeDouble(Ask + Point * ai_4, Digits);
            OrderModify(OrderTicket(), OrderOpenPrice(), price_20, OrderTakeProfit(), 0, g_color_276);
         }
         if (ai_8 > 0) {
            if (OrderOpenPrice() > Ask && OrderStopLoss() > OrderOpenPrice()) {
               if (OrderStopLoss() - Ask > Point * ai_4 + Point) {
                  price_20 = NormalizeDouble(Ask + Point * ai_4, Digits);
                  if (price_20 != 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), price_20, OrderTakeProfit(), 0, g_color_276);
               }
            }
         }
         if (OrderOpenPrice() - Ask > Point * ai_4) {
            if (OrderStopLoss() > Ask + Point * ai_4 + Point) {
               price_20 = NormalizeDouble(Ask + Point * ai_4, Digits);
               OrderModify(OrderTicket(), OrderOpenPrice(), price_20, OrderTakeProfit(), 0, g_color_276);
            }
         }
      }
      if (OrderType() == OP_BUY && OrderSymbol() == gs_300 && OrderMagicNumber() == a_magic_0) {
         if (OrderStopLoss() == 0.0) {
            price_20 = NormalizeDouble(Bid - Point * ai_4, Digits);
            OrderModify(OrderTicket(), OrderOpenPrice(), price_20, OrderTakeProfit(), 0, g_color_272);
         }
         if (ai_8 > 0) {
            if (OrderOpenPrice() < Bid && OrderStopLoss() < OrderOpenPrice()) {
               if (Bid - OrderStopLoss() > Point * ai_4 + Point) {
                  price_20 = NormalizeDouble(Bid - Point * ai_4, Digits);
                  if (price_20 != 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), price_20, OrderTakeProfit(), 0, g_color_272);
               }
            }
         }
         if (Bid - OrderOpenPrice() > Point * ai_4) {
            if (OrderStopLoss() < Bid - Point * ai_4 - Point) {
               price_20 = NormalizeDouble(Bid - Point * ai_4, Digits);
               OrderModify(OrderTicket(), OrderOpenPrice(), price_20, OrderTakeProfit(), 0, g_color_272);
            }
         }
      }
   }
}

int OpenTradesForMN(int a_magic_0) {
   int count_12 = 0;
   int order_total_8 = OrdersTotal();
   for (int pos_4 = 0; pos_4 < order_total_8; pos_4++) {
      OrderSelect(pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() <= OP_SELL)
         if (OrderMagicNumber() == a_magic_0) count_12++;
   }
   return (count_12);
}

int OpenAtMarket(string a_symbol_0, int a_cmd_8, double a_lots_12, int ai_20, int ai_24, string a_comment_28, int a_magic_36, int a_datetime_40, color a_color_44, int ai_48, int ai_52) {
   double price_64;
   double price_72;
   double price_80;
   int ticket_88;
   int error_92;
   int li_60 = ai_48;
   li_60 = ai_48;
   if (a_cmd_8 > OP_SELL) {
      Print("OpenAtMarket Error: OrderType is a Pending Order!");
      return (0);
   }
   while (li_60 > 0) {
      RefreshRates();
      if (a_cmd_8 == OP_BUY) {
         price_64 = NormalizeDouble(Ask, Digits);
         price_72 = NormalizeDouble(price_64 - ai_20 * Point, Digits);
         price_80 = NormalizeDouble(price_64 + ai_24 * Point, Digits);
      }
      if (a_cmd_8 == OP_SELL) {
         price_64 = NormalizeDouble(Bid, Digits);
         price_72 = NormalizeDouble(price_64 + ai_20 * Point, Digits);
         price_80 = NormalizeDouble(price_64 - ai_24 * Point, Digits);
      }
      ticket_88 = OrderSend(a_symbol_0, a_cmd_8, a_lots_12, price_64, Slippage, price_72, price_80, a_comment_28, a_magic_36, a_datetime_40, a_color_44);
      li_60--;
      if (ticket_88 == -1) {
         error_92 = GetLastError();
         if (error_92 == 4/* SERVER_BUSY */ || error_92 == 146/* TRADE_CONTEXT_BUSY */ || error_92 == 137/* BROKER_BUSY */ || error_92 == 6/* NO_CONNECTION */ || error_92 == 128/* TRADE_TIMEOUT */ ||
            error_92 == 129/* INVALID_PRICE */ || error_92 == 136/* OFF_QUOTES */ || error_92 == 135/* PRICE_CHANGED */ || error_92 == 138/* REQUOTE */) {
            Sleep(ai_52);
            continue;
         }
         li_60 = 0;
         Print("OpenAtMarket: OrderSend Error ", error_92);
      } else li_60 = 0;
   }
   return (ticket_88);
}

void Call_MM() {
   gd_280 = AccountFreeMargin() / 100000.0 * Risk_percent;
   gd_280 = MathMin(maxLots, MathMax(minLots, gd_280));
   if (minLots < 0.1) {
      gd_280 = NormalizeDouble(gd_280, 2);
      return;
   }
   if (minLots < 1.0) {
      gd_280 = NormalizeDouble(gd_280, 1);
      return;
   }
   gd_280 = NormalizeDouble(gd_280, 0);
}