
#property copyright "Copyright © 2010, NeuTronFX"
#property link      "http://www.neutronfx.com"

extern int TP = 12;
extern int LotFactor = 200;
extern int Slippage = 2;
int gi_88 = 8;
int g_magic_92 = 11111;
int gi_unused_96 = 6;
int gi_unused_100 = 11;
extern double LotBase = 0.01;
double gd_112 = 0.1;
double gd_120 = 0.01;
double gd_128 = 20.0;
double gd_136 = 203.0;
double gd_144;
double g_ord_open_price_152;
double g_ord_open_price_160;
double g_lots_168;
double gd_176;
double gd_184;
double gd_192;
string g_comment_200 = "EU";
string gs_unused_208 = "UCF";
string gs_ucf_216 = "UCF";
string gs_224 = "GU";
string gs_232 = "UJ";
string gs_240 = "EA_Off";
int g_count_248;
int g_count_252;
int gi_260;
int g_hour_264;
bool gi_268;
int gi_272 = 0;
int gi_276 = 0;
int gi_280 = 0;
int gi_284 = 0;
int g_ord_total_288;
int g_count_292;
int g_count_296;
int gi_300 = 00000;
int g_file_304;
double gd_308;

int init() {
   g_file_304 = FileOpen("HGNR.dat", FILE_BIN);
   if (g_file_304 > 0) {
      gd_308 = FileReadDouble(g_file_304, DOUBLE_VALUE);
      FileClose(g_file_304);
   }
   for (int l_pos_0 = 0; l_pos_0 <= OrdersTotal() - 1; l_pos_0++) {
      OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES);
      if (OrderProfit() > 0.0) {
         if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Blue);
         if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Red);
      } else {
         if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), 0, OrderOpenPrice() + (TP + 3) * Point, 0, Blue);
         if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), 0, OrderOpenPrice() - (TP + 3) * Point, 0, Red);
      }
      if (OrderType() == OP_BUYSTOP && OrderMagicNumber() == g_magic_92 && OrderComment() == gs_240) OrderDelete(OrderTicket());
   }
   return (0);
}

int deinit() {
   g_file_304 = FileOpen("HGNR.dat", FILE_BIN|FILE_WRITE);
   if (g_file_304 < 1) {
      Alert("can not open file error-", GetLastError());
      return (0);
   }
   FileWriteDouble(g_file_304, gd_308, DOUBLE_VALUE);
   FileClose(g_file_304);
   for (int l_pos_0 = 0; l_pos_0 <= OrdersTotal() - 1; l_pos_0++) {
      OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, Blue);
      if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, Red);
      if (OrderType() == OP_BUYSTOP) OrderDelete(OrderTicket());
   }
   return (0);
}

int start() {
   int li_unused_16;
   g_ord_total_288 = OrdersTotal();
   gd_184 = 100.0 * NormalizeDouble(0.79 * gd_176 / gd_136, 6);
   if (gd_184 > 100.0) gd_184 = 100;
   if (AccountFreeMargin() <= gd_128 / 100.0 * gd_308) gd_192 = gd_120;
   gd_144 = AccountEquity() - gd_308;
   if (OrdersTotal() == 0) {
      gd_308 = AccountBalance();
      gd_192 = gd_112;
   }
   if (Hour() != g_hour_264) {
      gd_176 = 0;
      for (int l_pos_0 = 0; l_pos_0 <= OrdersHistoryTotal(); l_pos_0++) {
         OrderSelect(l_pos_0, SELECT_BY_POS, MODE_HISTORY);
         if (OrderMagicNumber() == g_magic_92) gd_176 = OrderLots() + gd_176;
      }
   }
   g_hour_264 = Hour();
   int li_4 = AccountEquity();
   double ld_8 = li_4 % LotFactor;
   gi_260 = (li_4 - ld_8) / LotFactor;
   g_lots_168 = NormalizeDouble(LotBase * gi_260, Digits);
   if (g_lots_168 < LotBase) g_lots_168 = LotBase;
   g_lots_168 = LotBase;
   if (myComment()) li_unused_16 = 0;
   g_count_248 = 0;
   g_count_252 = 0;
   g_count_292 = 0;
   for (int l_pos_20 = 0; l_pos_20 <= OrdersTotal() - 1; l_pos_20++) {
      OrderSelect(l_pos_20, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_92 && OrderComment() == g_comment_200) {
         g_count_248++;
         g_ord_open_price_152 = OrderOpenPrice();
      }
      if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_92 && OrderComment() == g_comment_200) {
         g_count_252++;
         g_ord_open_price_160 = OrderOpenPrice();
      }
      if (OrderMagicNumber() == g_magic_92 && OrderTakeProfit() == 0.0 && OrderType() != OP_BUYSTOP) {
         if (OrderProfit() > 0.0) {
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Red);
         } else {
            if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), 0, OrderOpenPrice() + (TP + 3) * Point, 0, Blue);
            if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), 0, OrderOpenPrice() - (TP + 3) * Point, 0, Red);
         }
      }
      if (OrderMagicNumber() == g_magic_92 && OrderComment() == gs_240) g_count_292++;
      if (gi_284 == TRUE && OrderType() == OP_BUYSTOP && OrderMagicNumber() == g_magic_92 && OrderComment() == gs_ucf_216 || OrderComment() == gs_224 || OrderComment() == gs_232) OrderDelete(OrderTicket());
   }
   if (g_count_292 < 1) g_count_296 = 0;
   if (gi_268 == TRUE && OrdersTotal() < 1) gi_268 = FALSE;
   if (OrdersTotal() == 0) gd_308 = AccountBalance();
   if (IzinTrade() && gi_268 != TRUE && g_count_248 == 0 || (g_count_248 > 0 && Bid <= g_ord_open_price_152 - gi_88 * Point)) OrderSend(Symbol(), OP_BUY, g_lots_168, Ask, Slippage, 0, Ask + TP * Point, g_comment_200, g_magic_92, 0, Blue);
   if (IzinTrade() && gi_268 != TRUE && g_count_252 == 0 || (g_count_252 > 0 && Ask >= g_ord_open_price_160 + gi_88 * Point)) OrderSend(Symbol(), OP_SELL, g_lots_168, Bid, Slippage, 0, Bid - TP * Point, g_comment_200, g_magic_92, 0, Red);
   if (gd_144 >= gd_192 * gi_260) gi_268 = TRUE;
   if (gi_268 == TRUE) {
      for (int l_pos_24 = OrdersTotal() - 1; l_pos_24 >= 0; l_pos_24--) {
         OrderSelect(l_pos_24, SELECT_BY_POS, MODE_TRADES);
         if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Blue);
         if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Red);
      }
   }
   if (g_count_292 > 0 && g_count_296 < 10) {
      for (int l_pos_28 = 0; l_pos_28 <= OrdersTotal() - 1; l_pos_28++) {
         OrderSelect(l_pos_28, SELECT_BY_POS, MODE_TRADES);
         if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, Blue);
         if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), 0, 0, 0, Red);
         if (OrderType() == OP_BUYSTOP) OrderDelete(OrderTicket());
      }
      g_count_296++;
   }
   if (g_count_292 > 0) Alert("NeuTronFX is not active on all of the recommended pairs (UC 15M, GU 15M & UJ 15M). Please enable these pairs!");
   return (0);
}

int IzinTrade() {
   if (gi_284 == FALSE) {
      for (int l_pos_0 = 0; l_pos_0 <= OrdersTotal() - 1; l_pos_0++) {
         OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES);
         if (OrderMagicNumber() == g_magic_92 && OrderComment() == gs_ucf_216 && OrderType() == OP_BUYSTOP) {
            OrderDelete(OrderTicket());
            gi_272 = TRUE;
            Alert("EA at the completion USDCHF");
         }
         if (OrderMagicNumber() == g_magic_92 && OrderComment() == gs_224 && OrderType() == OP_BUYSTOP) {
            OrderDelete(OrderTicket());
            gi_280 = TRUE;
            Alert("EA at the completion GBPUSD");
         }
         if (OrderMagicNumber() == g_magic_92 && OrderComment() == gs_232 && OrderType() == OP_BUYSTOP) {
            OrderDelete(OrderTicket());
            gi_276 = TRUE;
            Alert("EA at the completion USDJPY");
         }
      }
   }
   if (gi_272 == TRUE && gi_280 == TRUE && gi_276 == TRUE) gi_284 = TRUE;
   else Alert("Was waiting. EA is not ready or not active on all Pairs");
   return (1);
}

bool myComment() {
   string ls_0;
   string ls_8;
   string ls_16;
   if (IsTesting()) ls_0 = "Please test thouroughly.";
   else ls_0 = "";
   if (AccountNumber() != gi_300) {
      ls_8 = "YOUR ACCOUNT              = " + AccountNumber();
      ls_16 = "IS INVALID";
   } else {
      ls_8 = "YOUR ACCOUNT              = " + AccountNumber();
      ls_16 = "IS VALID";
   }
   string ls_24 = "";
   if (IsDemo()) ls_24 = "This robot is in DEMO mode.";
   Comment("\nNeuTronFX v2.2 EURUSD 15M", 
      "\nv2.0", 
      "\n\n\n", ls_8, 
      "\n", ls_24, 
      "\n\n\n", ls_0, 
   "\nLastBalance = ", gd_308, "...");
   return (TRUE);
}