//+------------------------------------------------------------------+
//|                                                  Pastuch 1.6.mq4 |
//|                                         Copyright 2015, Ketariec |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Ketariec"
#property link      "https://www.mql5.com"
#property version   "1.6"
#property strict
#include <WinUser32.mqh>

#property description "Советник закрывает все ордера по профиту (% прибыли) от баланса начала недели или тралит эквити, и отжимает кнопку Автоторговли."
#property description "Может закрывать ордера с одним мэйджиком, может все, может все с исключением до 3-х ордеров с мэйджиками исключения."

#import "user32.dll"
// Считывает описатель оpгана упpавления, содеpжащийся в указанном блоке диалога. Возвpащаемое значение: идентификатоp оpгана упpавления; 0 - если указанный оpган упpавления не существует.
int      GetDlgItem(int hDlg,        // Блок диалога, содеpжащий оpган упpавления.
                     int nIDDlgItem); // Идентификатоp оpгана упpавления.
// Возвращает идентификатор hierarchyid, представляющий n-го предка данного элемента.
int      GetAncestor(int hWnd,      // Идентификатоp окна.
                      int gaFlags);  // Уровень окна от текущего окна (1, 2, 3...).
int      SendMessageA(int  hWnd,      // Окно, пpинимающее сообщение или $FFFF для посылки всем всплывающим окнам в системе.
                       int  Msg,       // Тип сообщения.
                       int  wParam,    // Дополнительная инфоpмация о сообщении.
                       int& lParam[]); // Дополнительная инфоpмация о сообщении.
                  
#import

extern ENUM_DAY_OF_WEEK    Day1         = MONDAY;// День начала торговой недели
extern int                 Haur         = 0;     // Час начала торговой недели
extern double              Balans       = 0;     // Начальный баланс счета
extern bool                AutoOFF      = true;  // Отжимать ли кнопку Автоторговли
extern int                 Profit       = 10;    // Стоп процент прибыли (профит)
extern bool                Tral         = true;  // Включение трала
extern int                 ProfitTral   = 5;     // Уровень включения трала
extern double              K            = 2;     // Шаг трала в % от депозита 
extern double              K1           = 2;     // Откат в % от депозита
extern int                 Magic        = 0;     // Мэйджик ордеров
extern int                 Magic_1      = 0;     // Мэйджик неудаляемых ордеров (если 0 - таких нет)
extern int                 Magic_2      = 0;     // Мэйджик неудаляемых ордеров (если 0 - таких нет)
extern int                 Magic_3      = 0;     // Мэйджик неудаляемых ордеров (если 0 - таких нет)
extern int                 Slippage     = 5;
extern bool                Breakiven    = false; // Включение безубытка
extern int                 BreakShag    = 5;     // Порог срабатывания БУ в % от депо
extern int                 BreakProc    = 2;     // Величина БУ в % от депо
extern string              Indi         = "Принудительное закрытие ордеров ";
extern bool                DeletClose   = false;
extern ENUM_DAY_OF_WEEK    Day2         = MONDAY;// День закрытия
extern int                 Haur2        = 0;     // Час закрытия



color Clr, Clr1, Clr2, Clr3, Color, Color1, Color2, Color3;
string st = " ", st1 = " ", st2 = " ", st3 = " ";
static double G = 0;
static bool G1 = false;
double P = ProfitTral, com;
static double B;
double E;
static bool Go = false;
static bool GoTB = true;
double C;
double Pr;
double Prof; 

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{if(Digits == 3 || Digits == 5)
  {Slippage  *=10;
  
  }
 if(G1 == true) {G1 = false;}
 P = ProfitTral;
//+------------------------------------------------------------------+
      ObjectCreate ("Pastuch",OBJ_LABEL,0,0,0);      // Создаём новый объект 
      ObjectSet    ("Pastuch",OBJPROP_CORNER, CORNER_RIGHT_LOWER);// Угол привязки            
      ObjectSet    ("Pastuch",OBJPROP_XDISTANCE,25);// Координата Х
      ObjectSet    ("Pastuch",OBJPROP_YDISTANCE,50);// Координата Y
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
      ObjectCreate ("Pastuch1",OBJ_LABEL,0,0,0);      // Создаём новый объект 
      ObjectSet    ("Pastuch1",OBJPROP_CORNER, CORNER_RIGHT_LOWER);// Угол привязки            
      ObjectSet    ("Pastuch1",OBJPROP_XDISTANCE,25);// Координата Х
      ObjectSet    ("Pastuch1",OBJPROP_YDISTANCE,25);// Координата Y
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
      ObjectCreate ("Pastuch2",OBJ_LABEL,0,0,0);      // Создаём новый объект 
      ObjectSet    ("Pastuch2",OBJPROP_CORNER, CORNER_RIGHT_LOWER);// Угол привязки            
      ObjectSet    ("Pastuch2",OBJPROP_XDISTANCE,25);// Координата Х
      ObjectSet    ("Pastuch2",OBJPROP_YDISTANCE,75);// Координата Y
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
      ObjectCreate ("Pastuch3",OBJ_LABEL,0,0,0);      // Создаём новый объект 
      ObjectSet    ("Pastuch3",OBJPROP_CORNER, CORNER_RIGHT_LOWER);// Угол привязки            
      ObjectSet    ("Pastuch3",OBJPROP_XDISTANCE,25);// Координата Х
      ObjectSet    ("Pastuch3",OBJPROP_YDISTANCE,10);// Координата Y
//+------------------------------------------------------------------+
   

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  clearChart();
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{/*if(CountBuy() == 0) // Выставляет ордера для проверки советника
   {double SL = NormalizeDouble(Ask - 1000*Point, Digits);
    double TP = NormalizeDouble(Bid + 6000*Point, Digits);
    double Lot = 0.1;
      int ticket = OrderSend(Symbol(), OP_BUY, Lot, Bid, Slippage, 0, 0, "", 0,0, Blue);  
      if(ticket > 0)
       {if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
         {OrderModify(ticket, OrderOpenPrice(), SL, 0, 0, Blue);
          Print("Buy order opened : ",OrderOpenPrice());
         } else Print("Error opening Buy order : ",GetLastError());
       }
   }
  */
//+------------------------------------------------------------------------------++
//+------------------------------------------------------------------------------++


 if(IsExpertEnabled() == true)
 {Go = false;
 if(DayOfWeek() == Day1 && TimeHour(TimeCurrent()) == Haur && TimeMinute(TimeCurrent()) <= 20)
  {B = AccountBalance(); Go = true; st = " "; Clr = clrNONE;}
 if(Go == false) 
  {if(Balans != 0 && B != AccountBalance())
    {B = Balans; Go = true;}
   if(Balans == 0 && B != AccountBalance())
    {st = "НЕККОРЕКТНЫЙ БАЛАНС СЧЕТА!!! ВНЕСИТЕ БАЛАНС ВРУЧНУЮ. ";
     Clr = clrRed;
     Go = false;
    }
  }
 GoTB = true;
 if(Tral == true && Breakiven == true)
  {GoTB = false;
   st1 = "Ошибка Трала или БУ ";
   Clr1 = clrRed;
  } 
 
 if(Go == true && GoTB == true)
 {
 E = AccountEquity(); 
 st1 = "  ";
 Clr1 = clrNONE; 
 st2 = "  ";
 Clr2 = clrNONE;
 
  
 C = E - B;
 Pr = NormalizeDouble((C * 100)/B,2);
 if(Pr < 0)
  {Clr = clrTomato;
   st = "Убыток составляет  " + DoubleToString(Pr,2) + " % от депозита";
  }
 if(Pr >= 0)
  {Clr = clrGreen;
   st = "Профит составляет  " + DoubleToString(Pr,2) + " % от депозита";
  }
 if(Magic_1 != 0)
  {st3 = "Исключение  " + DoubleToString(Magic_1,0); Clr3 = clrPurple;}
 if(Magic_2 != 0)
  {st3 = st3 + "  " + DoubleToString(Magic_2,0); Clr3 = clrPurple;}
 if(Magic_3 != 0)
  {st3 = st3 + "  " + DoubleToString(Magic_3,0); Clr3 = clrPurple;}
 if(Magic_1 == 0 && Magic_2 == 0 && Magic_3 == 0)
  {st3 = " "; Clr3 = clrNONE;}
    
 if(Tral == false)
  {st1 = "Трал отключен";
   Clr1 = clrCoral;
   if(Profit != 0 && Pr >= Profit && CountTrade() > 0)
    {if(Magic > 0)
      {DeletOrder(); CloseOrder();}
     if(Magic == 0 && Magic_1 == 0 && Magic_2 == 0 && Magic_3 == 0)
      {DeletOrder2(); CloseOrder2();}
     if(Magic == 0 && (Magic_1 != 0 || Magic_2 != 0 || Magic_3 != 0))
      {DeletOrder3(); CloseOrder3();}
   st1 = "Ордера сняты по стоп-профиту ";
   Clr1 = clrGreen;
   if(CountTrade() == 0)
    {if(AutoOFF == true) {Torg();}}
  }
  }

 if(Tral == true)
  {st1 = "Трал включен." ;
   Clr1 = clrDarkOliveGreen;

   if(Pr >= P && CountTrade() > 0)
    {if(G1 == false) {G = P - K1; G1 = true;}
     if(Pr >= P + K )
      {P = P + K;}
     if(G < P)
      {G = P - K1; G1 = true;}
     
    }
   st1 = st1 + " Уровень закрытия  " + DoubleToString(G,2) + " %";
   Clr1 = clrDarkOliveGreen;
  

 if(Pr < G && G > 0)
  {if(Magic > 0)
    {DeletOrder(); CloseOrder();}
   if(Magic == 0 && Magic_1 == 0 && Magic_2 == 0 && Magic_3 == 0)
    {DeletOrder2(); CloseOrder2();}
   if(Magic == 0 && (Magic_1 != 0 || Magic_2 != 0 || Magic_3 != 0))
     {DeletOrder3(); CloseOrder3();}
   st1 = "Ордера сняты по тралу, уровень бу =  " + DoubleToString(G,2) + " %";
   Clr1 = clrGreen;
   Print("Уровень БУ (G) =  ", DoubleToString(G,2), ";  Эквити =  ", DoubleToString(E,2), ";  Баланс =  ", DoubleToString(B,2));
   if(CountTrade() == 0)
    {if(AutoOFF == true) {Torg();}}
  }
 if(Profit != 0 && Pr >= Profit && CountTrade() > 0)
  {if(Magic > 0)
    {DeletOrder(); CloseOrder();}
   if(Magic == 0 && Magic_1 == 0 && Magic_2 == 0 && Magic_3 == 0)
    {DeletOrder2(); CloseOrder2();}
   if(Magic == 0 && (Magic_1 != 0 || Magic_2 != 0 || Magic_3 != 0))
    {DeletOrder3(); CloseOrder3();}
   st1 = "Ордера сняты по стоп-профиту ";
   Clr1 = clrGreen;
   if(CountTrade() == 0)
    {if(AutoOFF == true) {Torg();}}
  }
  }
 
if(Breakiven == true)
 {G = 0;
  st1 = st1 + "  БУ включен  " ;
  Clr1 = clrAqua;
  if(Pr >= BreakShag)
   {G = BreakProc;
    st1 = st1 + DoubleToString(G,2) + " %";
    Clr1 = clrAqua;
    if(Pr < G && G != 0)
     {if(Magic > 0)
       {DeletOrder(); CloseOrder();}
      if(Magic == 0 && Magic_1 == 0 && Magic_2 == 0 && Magic_3 == 0)
       {DeletOrder2(); CloseOrder2();}
      if(Magic == 0 && (Magic_1 != 0 || Magic_2 != 0 || Magic_3 != 0))
       {DeletOrder3(); CloseOrder3();}
      st1 = "Ордера сняты по БУ, уровень бу =  " + DoubleToString(G,2) + " %";
      Clr1 = clrGreen;
      Print("Уровень БУ (G) =  ", DoubleToString(G,2), ";  Эквити =  ", DoubleToString(E,2), ";  Баланс =  ", DoubleToString(B,2));
      if(CountTrade() == 0)
      {if(AutoOFF == true) {Torg();}}
     }
   }
 }
 if(Breakiven == false && Tral == false)
  {G = 0;
   st1 = st1 + "  БУ выключен";
  }
  
//+---------------------------------------------------------------------+
if(DeletClose == true)
 {if(DayOfWeek() == Day2 && TimeHour(TimeCurrent()) >= Haur2)
   {if(Magic > 0)
     {DeletOrder(); CloseOrder();
      st2 = "Принудительное закрытие. День " + DoubleToString(DayOfWeek(),0) + " Час " + DoubleToString(TimeHour(TimeCurrent()),0); Clr2 = clrRed;
      if(AutoOFF == true) {Torg();}
     }
    if(Magic == 0 && Magic_1 == 0 && Magic_2 == 0 && Magic_3 == 0)
     {DeletOrder2(); CloseOrder2();
      st2 = "Принудительное закрытие. День " + DoubleToString(DayOfWeek(),0) + " Час " + DoubleToString(TimeHour(TimeCurrent()),0); Clr2 = clrRed;
      if(AutoOFF == true) {Torg();}
     }
    if(Magic == 0 && (Magic_1 != 0 || Magic_2 != 0 || Magic_3 != 0))
     {DeletOrder3(); CloseOrder3();
      st2 = "Принудительное закрытие. День " + DoubleToString(DayOfWeek(),0) + " Час " + DoubleToString(TimeHour(TimeCurrent()),0); Clr2 = clrRed;
      if(AutoOFF == true) {Torg();}
     }
   }
 }
  
 } 
 Color = Clr;
 Color1 = Clr1;
 Color2 = Clr2;
 Color3 = Clr3; 
 string Text  = st;    // Текст для отображения 
 string Text1 = st1;
 string Text2 = st2;
 string Text3 = st3;
 ObjectSetText("Pastuch",Text,10,"Arial",Color);// Текстовое описание объекта
 ObjectSetText("Pastuch1",Text1,10,"Arial",Color1);// Текстовое описание объекта  
 ObjectSetText("Pastuch2",Text2,10,"Arial",Color2);// Текстовое описание объекта 
 ObjectSetText("Pastuch3",Text3,10,"Arial",Color3);// Текстовое описание объекта 
 Comment("Баланс  ", DoubleToString(B,2), "\n", "Эквити  ", DoubleToString(E,2), "\n", "Стоп-профит  ", DoubleToString(Profit,0), " %", "\n", "Стоп-трал  ", DoubleToString(G,2), " %", "\n", "Уровень отката  ", DoubleToString(P,2), " %", "\n", "Уровень перевода выше  ", DoubleToString(P + K,2), " %", "\n", "Кол-во ордеров  ", CountTrade());
}
}
//+------------------------------------------------------------------+

 int CountBuyStop()
   {   int count = 0;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       { if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES)== true)
          {if(Magic > 0)
            {if (OrderMagicNumber () == Magic)
              { if (OrderType () == OP_BUYSTOP)
                count ++;
              }
            }
           if(Magic == 0)
            { if (OrderType () == OP_BUYSTOP)
                count ++;
            }
          }
       }        
         return (count);
   }
   int CountSellStop ()
   {   int count = 0;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       { if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) == true)
          {if(Magic > 0)
            {if(OrderMagicNumber () == Magic)
              {if (OrderType () == OP_SELLSTOP)
                count ++;
              }
            }
           if(Magic == 0)
            {if (OrderType () == OP_SELLSTOP)
                count ++;
            }
          } 
       }
       return (count);
   }
int CountBuyLimit()
   {   int count = 0;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       { if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES)== true)
          {if(Magic > 0)
            {if(OrderMagicNumber () == Magic)
              { if (OrderType () == OP_BUYLIMIT)
                count ++;
              }
            }
           if(Magic == 0)
            {if (OrderType () == OP_BUYLIMIT)
                count ++;
            }
          }
       }
       return (count);
   }
   int CountSellLimit ()
   {   int count = 0;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       { if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) == true)
          {if(Magic > 0)
            {if(OrderMagicNumber () == Magic)
              {if (OrderType () == OP_SELLLIMIT)
                count ++;
              }
            }
           if(Magic == 0)
            {if (OrderType () == OP_SELLLIMIT)
                count ++;
            }
          }
       } 
       return (count);
   }  
int CountBuy ()
   {   int count = 0;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       { if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES)== true)
          {if(Magic > 0)
            {if(OrderMagicNumber () == Magic)
              {if (OrderType () == OP_BUY)
                count ++;
              }
            }
           if(Magic == 0)
            {if (OrderType () == OP_BUY)
                count ++;
            }
          }
       }
       return (count);
   }
  
int CountSell ()
   {   int count = 0;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       { if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) == true)
          {if(Magic > 0)
            {if(OrderMagicNumber () == Magic)
              {if (OrderType () == OP_SELL)
                count ++;
              }
            }
           if(Magic == 0)
            {if (OrderType () == OP_SELL)
                count ++;
            }
          }
       }
       return (count);
   }
 int CountTrade()
    {int Count = CountBuy() + CountBuyStop() + CountSell() + CountSellStop() + CountBuyLimit() + CountSellLimit();
     return(Count);
    }
//+---------------------------------------------------------------------+

void DeletOrder()
   {int count = 0;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       {if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) == true)
         {if (OrderMagicNumber() == Magic)
          {if (OrderType () == OP_BUYSTOP || OrderType() == OP_BUYLIMIT)
            {if(OrderDelete(OrderTicket(), Blue) == true)
               {Print(Symbol(), "  Отложенные ордера удалены ");} else {Print(Symbol(), "  Ошибка удаления ордеров ", GetLastError());}
            }
            
          if (OrderType () == OP_SELLSTOP || OrderType() == OP_SELLLIMIT)
            {if(OrderDelete(OrderTicket(), Red) == true)
               {Print(Symbol(), "  Отложенные ордера удалены ");} else {Print(Symbol(), "  Ошибка удаления ордеров  ", GetLastError());}
            }
          }
         }
       }
   }
 void CloseOrder()
   {int count = 0;
    double pAsk, pBid;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       {if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) == true)
         {if (OrderMagicNumber() == Magic)
          {if (OrderType () == OP_BUY)
            {pBid=MarketInfo(OrderSymbol(), MODE_BID);
             if(OrderClose(OrderTicket(),OrderLots(), pBid, Slippage, Blue) == true)
               {Print(OrderSymbol(), "  Ордер BUY успешно закрыт ");}
                else {Print(OrderSymbol(), "  Ошибка закрытия  ", GetLastError());
                      Sleep(10000); 
                      RefreshRates();
                     }
            }
            
          if (OrderType () == OP_SELL)
            {pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
             if(OrderClose(OrderTicket(),OrderLots(), pAsk, Slippage, Red) == true)
               {Print(OrderSymbol(), "  Ордер SELL успешно закрыт ");}
             else {Print(OrderSymbol(), "  Ошибка закрытия  ", GetLastError());
                   Sleep(10000); 
                   RefreshRates();
                  }
            }
          }
         }
       }
   }
void DeletOrder2()
   {int count = 0;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       {if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) == true)
         {if (OrderType () == OP_BUYSTOP || OrderType() == OP_BUYLIMIT)
            {if(OrderDelete(OrderTicket(), Blue) == true)
               {Print(Symbol(), "  Отложенные ордера удалены ");} else {Print(Symbol(), "  Ошибка удаления ордеров ", GetLastError());}
            }
            
          if (OrderType () == OP_SELLSTOP || OrderType() == OP_SELLLIMIT)
            {if(OrderDelete(OrderTicket(), Red) == true)
               {Print(Symbol(), "  Отложенные ордера удалены ");} else {Print(Symbol(), "  Ошибка удаления ордеров  ", GetLastError());}
            }
         }
       }
       
   }
 void CloseOrder2()
   {int count = 0;
    double pAsk, pBid;
      for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       {if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) == true)
         {if (OrderType () == OP_BUY)
            {pBid=MarketInfo(OrderSymbol(), MODE_BID);
             if(OrderClose(OrderTicket(),OrderLots(), pBid, Slippage, Blue) == true)
               {Print(OrderSymbol(),"  Ордер BUY успешно закрыт ");}
             else {Print(OrderSymbol(), "  Ошибка закрытия  ", GetLastError());
                   Sleep(10000); 
                   RefreshRates();
                  }
            }
                    
          if (OrderType () == OP_SELL)
            {pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
             if(OrderClose(OrderTicket(),OrderLots(), pAsk, Slippage, Red) == true)
               {Print(OrderSymbol(), "  Ордер SELL успешно закрыт ");} 
             else {Print(OrderSymbol(), "  Ошибка закрытия  ", GetLastError());
                   Sleep(10000); 
                   RefreshRates();
                  }
            }
         }
       }
      
   }
void DeletOrder3()
   {int count = 0;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       {if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) == true)
         {if (OrderMagicNumber() != Magic_1 || OrderMagicNumber() != Magic_2 || OrderMagicNumber() != Magic_3)
          {if (OrderType () == OP_BUYSTOP || OrderType() == OP_BUYLIMIT)
            {if(OrderDelete(OrderTicket(), Blue) == true)
               {Print(Symbol(), "  Отложенные ордера удалены ");} else {Print(Symbol(), "  Ошибка удаления ордеров ", GetLastError());}
            }
            
          if (OrderType () == OP_SELLSTOP || OrderType() == OP_SELLLIMIT)
            {if(OrderDelete(OrderTicket(), Red) == true)
               {Print(Symbol(), "  Отложенные ордера удалены ");} else {Print(Symbol(), "  Ошибка удаления ордеров  ", GetLastError());}
            }
          }
         }
       }
   }
 void CloseOrder3()
   {int count = 0;
    double pAsk, pBid;
       for (int trade = OrdersTotal () - 1; trade >=-1; trade --)
       {if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) == true)
         {if (OrderMagicNumber() != Magic_1 || OrderMagicNumber() != Magic_2 || OrderMagicNumber() != Magic_3)
          {if (OrderType () == OP_BUY)
            {pBid=MarketInfo(OrderSymbol(), MODE_BID);
             if(OrderClose(OrderTicket(),OrderLots(), pBid, Slippage, Blue) == true)
               {Print(OrderSymbol(), "  Ордер BUY успешно закрыт ");}
                else {Print(OrderSymbol(), "  Ошибка закрытия  ", GetLastError());
                      Sleep(10000); 
                      RefreshRates();
                     }
            }
            
          if (OrderType () == OP_SELL)
            {pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
             if(OrderClose(OrderTicket(),OrderLots(), pAsk, Slippage, Red) == true)
               {Print(OrderSymbol(), "  Ордер SELL успешно закрыт ");}
             else {Print(OrderSymbol(), "  Ошибка закрытия  ", GetLastError());
                   Sleep(10000); 
                   RefreshRates();
                  }
            }
          }
         }
       }
   }   
//+---------------------------------------------------------+
void Torg() {
   if (IsExpertEnabled()) ExpertEnabled (false);
      else ExpertEnabled (true);
}

// Функция включения/отключения эксперта.
void ExpertEnabled (bool Switch) // TRUE - включить эксперт, FALSE - отключить эксперт.
{
  int HandlWindow = WindowHandle (Symbol(), Period()); // Системный дескриптор окна.
  int HandlMT4;        // Системный дескриптор окна МТ4.
  int HandlToolbar;    // Системный дескриптор окна инструментов.

  int    ArIntTemp[1]; // Временный массив.
  //----
  if ((Switch && !IsExpertEnabled()) || (!Switch && IsExpertEnabled()) )  {
     HandlMT4 = GetAncestor (HandlWindow, 2); 
     HandlToolbar = GetDlgItem (HandlMT4, 0x63);
     ArIntTemp[0] = HandlToolbar;
     SendMessageA (HandlMT4, WM_COMMAND, 33020, ArIntTemp);
  }
}
//+----------------------------------------------------------------+
/// Очистить график от своих объектов
int clearChart() {
	int obj_total = ObjectsTotal();
	string name;
	int count = 0;
	for (int i = obj_total - 1; i >= 0; i--) {
		name = ObjectName(i);
		if (StringFind(name, "Pastuch") == 0) {
			ObjectDelete(name);
			count++;
		}			
	}
	return(count);
}