//+------------------------------------------------------------------+
//|                                                        maRTI.mq4 |
//|                                                  Copyright 2012, |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012,."
#property link      "http://www.metaquotes.net"

//==================================================================================================================================
#property show_inputs
//==================================================================================================================================
#include <stderror.mqh>
#include <WinUser32.mqh>
#include <stdlib.mqh>
//==================================================================================================================================

extern string maRTI    =  "maRTI";   // Init Parameters
extern int    Magic          = 78699; // g_magic_208     Magic             
extern int    Lot_Decimal_0_1_2         =     2; // gd_112          Lotdecimal 
extern double Slippage        =   5.0; // g_slippage_96   Slippage
//-----------------------------------------------------------------------------------------
extern string Parameters_Lot         =  "Parameters_Lot";        // Parameters_Lot
extern double Lots                    =  0.05; // Lots            Lots  
extern bool   UseAdd         =  TRUE; // gi_84           UseAdd    
extern int    MMType     =     1; // gi_76     
//-----------------------------------------------------------------------------------------      
extern string    separator1 = "------trend settings------";
extern bool      useHeikenAshiSmoothed = true;               // trade in EMA trend
extern int       barsInTrend = 1;                  // how many bars should be in trend
extern double    HeikenAshiSmoothed = 6;                   // EMA period for trend
//-----------------------------------------------------------------------------------------
extern string    separator2 = "------CCI settings------";
extern double    iCCIPeriod = 14;                  // CCI period for enter and exit
extern double    iCCIRetracement = 50;             // minimal retracement for CCI to allow another trade
extern bool      useCCIExit = true;                // use exit with CCI indicator
 
//-----------------------------------------------------------------------------------------
extern string Trade_Mode        =  "Trade Mode";       // Input Parameters
extern int    Max_Trades        =   100; // MaxTrades       MaxTrades   
extern double Pip_Step      =  29.0; // g_pips_152      PipStep           
//-----------------------------------------------------------------------------------------
extern string Order_Management       =  "Order Management";      // Output Parameters
extern double Stop_loss              =   0.0; // g_pips_128      Stoploss          
extern double Take_Profit            =  3.0; // g_pips_120      TakeProfit       
extern bool   UseTrailingStop          =  TRUE; // gi_176  TRUE    UseTrailingStop 
extern double StartTrailingPips        =  2.0; // gd_136          StartTrailingPips
extern double StepTrailingPips          =  2.0; // gd_144          StepTrailingPips  
//-----------------------------------------------------------------------------------------
extern string Time_Management          =  "Time Management";         // Input Filters
extern bool   TimeFilter       = FALSE; // gi_192          TimeFilter       
extern bool   UseHourTrade      = FALSE; // UseHourTrade    UseHourTrade   
extern int    Start_Hour        =     0; // StartHour       StartHour   
extern int    End_Hour        =     8; // EndHour         EndHour   
//-----------------------------------------------------------------------------------------
extern string ea = "close all trrade if equity below daily or hardlimimit";
extern double daily_quota = 1000;
extern double secure_Min_balance = 0;
extern bool use_daily_max_profit= false;
extern double daily_max_profit = 1000;
extern bool Move_daily_quota_after_profit= false;
extern double Move_quota_by_profit_percent= 50;
string max;
//-----------------------------------------------------------------------------------------
//extern double
double todaybalance,todaylimit,tmp;
int oldday,force;
//-----------------------------------------------------------------------------------------
extern string Equity_Management         =  "Equity Management";        // Output Filters
extern bool   Use_Close  = FALSE; // gi_80           UseClose   
extern bool   Use_Equity_Stop         = FALSE; // gi_164          UseEquityStop  
extern double Total_Equity_Risk =  15.0; // gd_168          TotalEquityRisk  
extern bool   UseTimeOut       = FALSE; // gi_180          UseTimeOut        
extern double MaxTradeOpenHours  =   0.10; // gd_184          MaxTradeOpenHours
//==================================================================================================================================
double g_price_212;
double gd_220;
double gd_unused_228;
double gd_unused_236;
double g_price_244;
double g_bid_252;
double g_ask_260;
double gd_268;
double gd_276;
double gd_284;
bool   gi_292;
string gs_296         = "maRTI";
int    g_time_304     =     0;
int    gi_308;
int    gi_312         =     0;
double gd_316;
int    g_pos_324      =     0;
int    gi_328;
double gd_332         =   0.0;
bool   gi_340         = FALSE;
bool   gi_344         = FALSE;
bool   gi_348         = FALSE;
int    gi_352;
bool   gi_356         = FALSE;
int    g_datetime_360 =     0;
int    g_datetime_364 =     0;
double gd_368;
double gd_376;
//-----------------------------
int    gi_222 = 1;
double gi_1000;
//==================================================================================================================================
int init() {
   force=1;
   gd_284 = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   if (IsTesting() ==  TRUE) Display_Info(); //  TRUE
   if (IsTesting() == FALSE) Display_Info(); // FALSE
   double step = MarketInfo(Symbol(), MODE_LOTSTEP);
   switch (step) (
      case 0.01 : Lot_Decimal_0_1_2 = 2; break;
      case  0.1 : Lot_Decimal_0_1_2 = 1; break;
      case    1 : Lot_Decimal_0_1_2 = 0; break;
   )
      if (Digits == 5 || Digits == 3) gi_222 = 10;
         return (0);
}
//==================================================================================================================================
int deinit() {
if(use_daily_max_profit){ max =StringConcatenate(" Maximum ",  (todaybalance + daily_max_profit));}
   return (0);
}
//==================================================================================================================================
int start() {if ( AccountEquity() <= secure_Min_balance ){CloseAll();}



int  dow = Day(); 
if(oldday != dow ){
todaybalance= AccountEquity();oldday= dow;
todaylimit=daily_quota;
if(use_daily_max_profit){ max =StringConcatenate(" Maximum ",  (todaybalance + daily_max_profit));}
force=1;
SendMail("Daily Balance ", StringConcatenate("Equity : " , AccountEquity(), "Daily Level " , todaybalance - todaylimit, "All time Level :" , secure_Min_balance ,max));
}
if ( AccountEquity() <= (todaybalance - todaylimit)){ CloseAll();}
if(use_daily_max_profit){if ( AccountEquity() >  (todaybalance + daily_max_profit)){ CloseAll();} }

if(Move_daily_quota_after_profit){ 
   if (AccountEquity() > todaybalance){
         tmp = daily_quota - ((AccountEquity() - todaybalance) * (Move_quota_by_profit_percent/100));   
         if(tmp < todaylimit ){
            todaylimit=tmp;
            
         }
   }

}



Comment ("Equity : " , AccountEquity(), " Daily Level : " , (todaybalance - todaylimit), " All time Level : " ,secure_Min_balance,max );
//----

if(force == 0){CloseAll();} 

   Display_Info();
//----------------------------------------------------------------------------------------------
   ObjectCreate ("klc14", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("klc14", "", 3, "System", Red);
   ObjectSet    ("klc14", OBJPROP_CORNER, 2);
   ObjectSet    ("klc14", OBJPROP_XDISTANCE, 93); // 105
   ObjectSet    ("klc14", OBJPROP_YDISTANCE, 5);
//----------------------------------------------------------------------------------------------
   double l_ord_lots_0;
   double l_ord_lots_8;
   double l_iclose_16;
   double l_iclose_24;
   if (UseHourTrade) {
      if (!(Hour() >= Start_Hour && Hour() <= End_Hour)) {
         CloseThisSymbolAll();
         Comment("Use Only Market Hours");
         return (0);
      }
   }
   string ls_36 = "false"; // ls_32
   string ls_44 = "false"; // ls_40
   if (TimeFilter == FALSE || (TimeFilter && (End_Hour > Start_Hour && (Hour() >= Start_Hour && Hour() <= End_Hour)) || (Start_Hour > End_Hour && !(Hour() >= End_Hour && Hour() <= Start_Hour)))) ls_36 = "true";
   if (TimeFilter && (End_Hour > Start_Hour && !(Hour() >= Start_Hour && Hour() <= End_Hour)) || (Start_Hour > End_Hour && (Hour() >= End_Hour && Hour() <= Start_Hour))) ls_44 = "true";
   if (UseTrailingStop) TrailingAlls(StartTrailingPips * gi_222, StepTrailingPips * gi_222, g_price_244); // !
   if (UseTimeOut) {
      if (TimeCurrent() >= gi_308) {
         CloseThisSymbolAll();
         Print("Bсе сделки будут закрыты из-за Тайм-Аута");
      }
   }
   if (g_time_304 == Time[0]) return (0);
   g_time_304 = Time[0];
   double ld_52 = CalculateProfit(); // ld_48
   if (Use_Equity_Stop) {
      if (ld_52 < 0.0 && MathAbs(ld_52) > Total_Equity_Risk / 100.0 * AccountEquityHigh()) {
         CloseThisSymbolAll();
         Print("Bсе сделки будут закрыты из-за превышения Эквити");
         gi_356 = FALSE;
      }
   }
   gi_328 = CountTrades();
   if (gi_328 == 0) gi_292 = FALSE;
   for (g_pos_324 = OrdersTotal() - 1; g_pos_324 >= 0; g_pos_324--) {
      OrderSelect(g_pos_324, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY) {
            gi_344 = TRUE;
            gi_348 = FALSE;
            l_ord_lots_0 = OrderLots();
            break;
         }
      }
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_SELL) {
            gi_344 = FALSE;
            gi_348 = TRUE;
            l_ord_lots_8 = OrderLots();
            break;
         }
      }
   }
   if (gi_328 > 0 && gi_328 <= Max_Trades) {
      RefreshRates();
      gd_268 = FindLastBuyPrice();
      gd_276 = FindLastSellPrice();
      if (gi_344 && gd_268 - Ask >= Pip_Step * gi_222 * Point) gi_340 = TRUE;
      if (gi_348 && Bid - gd_276 >= Pip_Step * gi_222 * Point) gi_340 = TRUE;
   }
   if (gi_328 < 1) {
      gi_348 = FALSE;
      gi_344 = FALSE;
      gi_340 = TRUE;
      gd_220 = AccountEquity();
   }
   if (gi_340) {
      gd_268 = FindLastBuyPrice();
      gd_276 = FindLastSellPrice();
      if (gi_348) {
         if (Use_Close || ls_44 == "true") {
            fOrderCloseMarket(0, 1);
            gd_316 = NormalizeDouble(LotExponent * l_ord_lots_8, Lot_Decimal_0_1_2);
         } else gd_316 = fGetLots(OP_SELL);
         if (UseAdd && ls_36 == "true") {
            gi_312 = gi_328;
            if (gd_316 > 0.0) {
               RefreshRates();
               gi_352 = OpenPendingOrder(1, gd_316, Bid, Slippage * gi_222, Ask, 0, 0, gs_296 + "- " + gi_312, Magic, 0, HotPink);
               if (gi_352 < 0) {
                  Print(" Error: ", ErrorDescription(GetLastError())); // GetLastError()
                  return (0);
               }
               gd_276 = FindLastSellPrice();
               gi_340 = FALSE;
               gi_356 = TRUE;
            }
         }
      } else {
         if (gi_344) {
            if (Use_Close || ls_44 == "true") {
               fOrderCloseMarket(1, 0);
               gd_316 = NormalizeDouble(LotExponent * l_ord_lots_0, Lot_Decimal_0_1_2);
            } else gd_316 = fGetLots(OP_BUY);
            if (UseAdd && ls_36 == "true") {
               gi_312 = gi_328;
               if (gd_316 > 0.0) {
                  gi_352 = OpenPendingOrder(0, gd_316, Ask, Slippage * gi_222, Bid, 0, 0, gs_296 + "- " + gi_312, Magic, 0, Lime);
                  if (gi_352 < 0) {
                     Print(" Server Busy: ", ErrorDescription(GetLastError())); // GetLastError()
                     return (0);
                  }
                  gd_268 = FindLastBuyPrice();
                  gi_340 = FALSE;
                  gi_356 = TRUE;
               }
            }
         }
      }
   }
   if (gi_340 && gi_328 < 1) {
      l_iclose_16 = iClose(Symbol(), 0, 2);
      l_iclose_24 = iClose(Symbol(), 0, 1);
      g_bid_252 = Bid;
      g_ask_260 = Ask;
      if (!gi_348 && !gi_344 && ls_36 == "true") {
         gi_312 = gi_328;
         if (l_iclose_16 > l_iclose_24) {
            gd_316 = fGetLots(OP_SELL);
            if (gd_316 > 0.0) {
               gi_352 = OpenPendingOrder(1, gd_316, g_bid_252, Slippage * gi_222, g_bid_252, 0, 0, gs_296 + "- " + gi_312, Magic, 0, HotPink);
               if (gi_352 < 0) {
                  Print(gd_316, " Mode Not Set: ", ErrorDescription(GetLastError())); // GetLastError()
                  return (0);
               }
               gd_268 = FindLastBuyPrice();
               gi_356 = TRUE;
            }
         } else {
            gd_316 = fGetLots(OP_BUY);
            if (gd_316 > 0.0) {
               gi_352 = OpenPendingOrder(0, gd_316, g_ask_260, Slippage * gi_222, g_ask_260, 0, 0, gs_296 + "- " + gi_312, Magic, 0, Lime);
               if (gi_352 < 0) {
                  Print(gd_316, " True: ", ErrorDescription(GetLastError())); // GetLastError()
                  return (0);
               }
               gd_276 = FindLastSellPrice();
               gi_356 = TRUE;
            }
         }
      }
      if (gi_352 > 0) gi_308 = TimeCurrent() + 60.0 * (60.0 * MaxTradeOpenHours);
      gi_340 = FALSE;
   }
   gi_328 = CountTrades();
   g_price_244 = 0;
   double ld_60 = 0; // ld_56
   for (g_pos_324 = OrdersTotal() - 1; g_pos_324 >= 0; g_pos_324--) {
      OrderSelect(g_pos_324, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
            g_price_244 += OrderOpenPrice() * OrderLots();
            ld_60 += OrderLots();
         }
      }
   }
   if (gi_328 > 0) g_price_244 = NormalizeDouble(g_price_244 / ld_60, Digits);
   if (gi_356) {
      for (g_pos_324 = OrdersTotal() - 1; g_pos_324 >= 0; g_pos_324--) {
         OrderSelect(g_pos_324, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
            if (OrderType() == OP_BUY) {
               g_price_212 = g_price_244 + Take_Profit * gi_222 * Point;
               gd_unused_228 = g_price_212;
               gd_332 = g_price_244 - Stop_loss * gi_222 * Point;
               gi_292 = TRUE;
            }
         }
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
            if (OrderType() == OP_SELL) {
               g_price_212 = g_price_244 - Take_Profit * gi_222 * Point;
               gd_unused_236 = g_price_212;
               gd_332 = g_price_244 + Stop_loss * gi_222 * Point;
               gi_292 = TRUE;
            }
         }
      }
   }
   
   if (gi_356) {
   
      if (gi_292 == TRUE) {
         for (g_pos_324 = OrdersTotal() - 1; g_pos_324 >= 0; g_pos_324--) {
            OrderSelect(g_pos_324, SELECT_BY_POS, MODE_TRADES);
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) OrderModify(OrderTicket(), g_price_244, OrderStopLoss(), g_price_212, 0, Yellow);
            gi_356 = FALSE;
         }
      }
   }
   
   return (0);
}
//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
//| CloseAll                                                         |
//+------------------------------------------------------------------+
void CloseAll()
{  
 
   
   for( int i = OrdersTotal()-1; i >= 0; i-- )
   {
      if( OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false ) { continue; }
           

         while( IsTradeContextBusy() ) { Sleep( 10 ); }
                           
         RefreshRates();
    //     double SymAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );    
     //    double SymBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );
     
    
                               
              if( OrderType() == OP_BUY  ) { OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID),5, CLR_NONE ); }
         else if( OrderType() == OP_SELL ) { OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK ), 5, CLR_NONE ); }
         
                           
         int Err=GetLastError();      
     
       
  
   }
   if(force > 0) {SendMail("Force Close ", StringConcatenate("Equity : " , AccountEquity(), " Daily Level: " , todaybalance - todaylimit, " All time Level : " , secure_Min_balance,max ));force=0;}
}
//+------------------------------------------------------------------+

//==================================================================================================================================
double ND(double ad_0) { // Округление числа с плавающей запятой до указанной точности

   return (NormalizeDouble(ad_0, Digits));
}
//==================================================================================================================================
int fOrderCloseMarket(bool ai_0 = TRUE, bool ai_4 = TRUE) {
   int li_ret_8 = 0;
   for (int l_pos_12 = OrdersTotal() - 1; l_pos_12 >= 0; l_pos_12--) {
      if (OrderSelect(l_pos_12, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
            if (OrderType() == OP_BUY && ai_0) {
               RefreshRates();
               if (!IsTradeContextBusy()) {
                  if (!OrderClose(OrderTicket(), OrderLots(), ND(Bid), 5, CLR_NONE)) {
                     Print("Ошибка закрытия сделки BUY " + OrderTicket());
                     li_ret_8 = -1;
                  }
               } else {
                  if (g_datetime_360 != iTime(NULL, 0, 0)) {
                     g_datetime_360 = iTime(NULL, 0, 0);
                     Print("Попытка закрытия сделки BUY " + OrderTicket() + ". Торговый поток занят");
                  }
                  return (-2);
               }
            }
            if (OrderType() == OP_SELL && ai_4) {
               RefreshRates();
               if (!IsTradeContextBusy()) {
                  if (!OrderClose(OrderTicket(), OrderLots(), ND(Ask), 5, CLR_NONE)) {
                     Print("Ошибка закрытия сделки SELL " + OrderTicket());
                     li_ret_8 = -1;
                  }
               } else {
                  if (g_datetime_364 != iTime(NULL, 0, 0)) {
                     g_datetime_364 = iTime(NULL, 0, 0);
                     Print("Попытка закрытия сделки SELL " + OrderTicket() + ". Торговый поток занят");
                  }
                  return (-2);
               }
            }
         }
      }
   }
   return (li_ret_8);
}
//==================================================================================================================================
double fGetLots(int a_cmd_0) { // Умножение Lotsа
   double  l_lots_4;
   int     l_datetime_12;
   switch (MMType) {
   case 0:
      l_lots_4 = Lots;
      break;
   case 1:
      l_lots_4 = NormalizeDouble(Lots * MathPow(LotExponent, gi_312), Lot_Decimal_0_1_2);
      break;
   case 2:
      l_datetime_12 = 0;
      l_lots_4 = Lots;
      for (int l_pos_20 = OrdersHistoryTotal() - 1; l_pos_20 >= 0; l_pos_20--) {
         if (OrderSelect(l_pos_20, SELECT_BY_POS, MODE_HISTORY)) {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
               if (l_datetime_12 < OrderCloseTime()) {
                  l_datetime_12 = OrderCloseTime();
                  if (OrderProfit() < 0.0) l_lots_4 = NormalizeDouble(OrderLots() * LotExponent, Lot_Decimal_0_1_2);
                  else l_lots_4 = Lots;
               }
            }
         } else return (-3);
      }
   }
   if (AccountFreeMarginCheck(Symbol(), a_cmd_0, l_lots_4) <= 0.0) return (-1);
   if (GetLastError() == 134/* NOT_ENOUGH_MONEY */) return (-2); // GetLastError()   Недостаточно средств для открытия сделки
   return (l_lots_4);
}
//==================================================================================================================================
int CountTrades() { // Учёт количества открытых сделок
   int l_count_0 = 0;
   for (int l_pos_4 = OrdersTotal() - 1; l_pos_4 >= 0; l_pos_4--) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         if (OrderType() == OP_SELL || OrderType() == OP_BUY) l_count_0++;
   }
   return (l_count_0);
}
//==================================================================================================================================
void CloseThisSymbolAll() { // Закрытие всех сделок по этой паре
   for (int l_pos_0 = OrdersTotal() - 1; l_pos_0 >= 0; l_pos_0--) {
      OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
            if (OrderType() ==  OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage * gi_222, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage * gi_222, Red);
         }
         Sleep(1000);
      }
   }
}
//=========== Установка отложенных ордеров =======================================================================================================================
int OpenPendingOrder(int ai_0, double a_lots_4, double a_price_12, int a_slippage_20, double ad_24, int ai_unused_32, int ai_36, string a_comment_40, int a_magic_48, int a_datetime_52, color a_color_56) {
   int l_ticket_60 =   0;
   int l_error_64  =   0;
   int l_count_68  =   0;
   int li_72       = 100;
   switch (ai_0) {
   case 2: // 2
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_BUYLIMIT, a_lots_4, a_price_12, a_slippage_20, StopLong(ad_24, Stop_loss * gi_222), TakeLong(a_price_12, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError(); // GetLastError()
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!((l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */))) break;
         Sleep(1000);
      }
      break;
   case 4: // 4
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_BUYSTOP, a_lots_4, a_price_12, a_slippage_20, StopLong(ad_24, Stop_loss * gi_222), TakeLong(a_price_12, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError(); // GetLastError()
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!((l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */))) break;
         Sleep(5000);
      }
      break;
   case 0: // 0
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         RefreshRates();
         l_ticket_60 = OrderSend(Symbol(), OP_BUY, a_lots_4, Ask, a_slippage_20, StopLong(Bid, Stop_loss * gi_222), TakeLong(Ask, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError(); // GetLastError()
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!((l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */))) break;
         Sleep(5000);
      }
      break;
   case 3: // 3
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_SELLLIMIT, a_lots_4, a_price_12, a_slippage_20, StopShort(ad_24, Stop_loss * gi_222), TakeShort(a_price_12, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError(); // GetLastError()
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!((l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */))) break;
         Sleep(5000);
      }
      break;
   case 5: // 5
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_SELLSTOP, a_lots_4, a_price_12, a_slippage_20, StopShort(ad_24, Stop_loss * gi_222), TakeShort(a_price_12, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError(); // GetLastError()
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!((l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */))) break;
         Sleep(5000);
      }
      break;
   case 1: // 1
      for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
         l_ticket_60 = OrderSend(Symbol(), OP_SELL, a_lots_4, Bid, a_slippage_20, StopShort(Ask, Stop_loss * gi_222), TakeShort(Bid, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
         l_error_64 = GetLastError(); // GetLastError()
         if (l_error_64 == 0/* NO_ERROR */) break;
         if (!((l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */))) break;
         Sleep(5000);
      }
   }
   return (l_ticket_60);
}
//==================================================================================================================================
double StopLong(double ad_0, int ai_8) { 
   if (ai_8 == 0) return (0);
   return (ad_0 - ai_8 * Point);
}
//==================================================================================================================================
double StopShort(double ad_0, int ai_8) { 
   if (ai_8 == 0) return (0);
   return (ad_0 + ai_8 * Point);
}
//==================================================================================================================================
double TakeLong(double ad_0, int ai_8) { 
   if (ai_8 == 0) return (0);
   return (ad_0 + ai_8 * Point);
}
//==================================================================================================================================
double TakeShort(double ad_0, int ai_8) { 
   if (ai_8 == 0) return (0);
   return (ad_0 - ai_8 * Point);
}
//==================================================================================================================================
double CalculateProfit() { // Рассчёт прибыли
   double ld_ret_0 = 0;
   for (g_pos_324 = OrdersTotal() - 1; g_pos_324 >= 0; g_pos_324--) {
      OrderSelect(g_pos_324, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) ld_ret_0 += OrderProfit();
   }
   return (ld_ret_0);
}
//==================================================================================================================================
void TrailingAlls(int ai_0, int ai_4, double a_price_8) { // Общий трейлинг
   int li_16;
   double l_ord_stoploss_20;
   double l_price_28;
   if (ai_4 != 0) {
      for (int l_pos_36 = OrdersTotal() - 1; l_pos_36 >= 0; l_pos_36--) {
         if (OrderSelect(l_pos_36, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
            if (OrderSymbol() == Symbol() || OrderMagicNumber() == Magic) {
               if (OrderType() == OP_BUY) {
                  li_16 = NormalizeDouble((Bid - a_price_8) / Point, 0);
                  if (li_16 < ai_0) continue;
                  l_ord_stoploss_20 = OrderStopLoss();
                  l_price_28 = Bid - ai_4 * Point;
                  if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 > l_ord_stoploss_20)) OrderModify(OrderTicket(), a_price_8, l_price_28, OrderTakeProfit(), 0, Aqua);
               }
               if (OrderType() == OP_SELL) {
                  li_16 = NormalizeDouble((a_price_8 - Ask) / Point, 0);
                  if (li_16 < ai_0) continue;
                  l_ord_stoploss_20 = OrderStopLoss();
                  l_price_28 = Ask + ai_4 * Point;
                  if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 < l_ord_stoploss_20)) OrderModify(OrderTicket(), a_price_8, l_price_28, OrderTakeProfit(), 0, Red);
               }
            }
            Sleep(1000);
         }
      }
   }
}
//==================================================================================================================================
double AccountEquityHigh() { // Определение максимума свободных средств 
   if (CountTrades() == 0) gd_368 = AccountEquity();
   if (gd_368 < gd_376) gd_368 = gd_376;
   else gd_368 = AccountEquity();
   gd_376 = AccountEquity();
   return (gd_368);
}
//==================================================================================================================================
double FindLastBuyPrice() { // Поиск последней цены покупки
   double l_ord_open_price_0;
   int l_ticket_8;
   double ld_unused_12 = 0;
   int l_ticket_20 = 0;
   for (int l_pos_24 = OrdersTotal() - 1; l_pos_24 >= 0; l_pos_24--) {
      OrderSelect(l_pos_24, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) {
         l_ticket_8 = OrderTicket();
         if (l_ticket_8 > l_ticket_20) {
            l_ord_open_price_0 = OrderOpenPrice();
            ld_unused_12 = l_ord_open_price_0;
            l_ticket_20 = l_ticket_8;
         }
      }
   }
   return (l_ord_open_price_0);
}
//==================================================================================================================================
double FindLastSellPrice() { // Поиск последней цены продажи
   double l_ord_open_price_0;
   int    l_ticket_8;
   double ld_unused_12 = 0;
   int    l_ticket_20 = 0;
   for (int l_pos_24 = OrdersTotal() - 1; l_pos_24 >= 0; l_pos_24--) {
      OrderSelect(l_pos_24, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) {
         l_ticket_8 = OrderTicket();
         if (l_ticket_8 > l_ticket_20) {
            l_ord_open_price_0 = OrderOpenPrice();
            ld_unused_12 = l_ord_open_price_0;
            l_ticket_20 = l_ticket_8;
         }
      }
   }
   return (l_ord_open_price_0);
}
//==================================================================================================================================
void Display_Info() { // Вывод информации в углу окна
    gi_1000 = NormalizeDouble((Ask - Bid) / Point, 0);
    Comment("                              maRTI\n", 
            "                              Server:  ", AccountServer(), 
      "\n", "                              TimeCurrent:  ", TimeToStr(TimeCurrent() - 7200, TIME_MINUTES|TIME_SECONDS), // 3600
      "\n", "                              TimeCurrent:  ", TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS),
      "\n", "                              Leverage:  ",  "1:" + DoubleToStr(AccountLeverage(), 0),
       
      "\n", "                              Lot:     ", Lots,
      "\n");
}
//==================================================================================================================================
//==================================================================================================================================
//==================================================================================================================================