//+------------------------------------------------------------------+
//|                                               Skylover Dream.mq4 |
//|                                          Copyright 2014, Kolosov |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Kolosov"
#property link      ""
#property version   "1.00"
#property strict

//+------------------------------------------------------------------+
//| Parameters                                                       |
//+------------------------------------------------------------------+
extern double  mm    =  1.0;        // Просадка от: 0 - св. маржа; 1 - депозит; 2 - эквити
extern double  dd    =  50.0;       // Уровень просадки (в %)
extern color   ddc   =  clrRed;     // Цвет надписи просадки
extern bool    fl_lp =  true;       // Отображать уровень профита?
extern double  lp    =  5.0;       // Уровень профита (в %)
extern color   lpc   =  clrBlue;    // Цвет надписи профита
extern bool    fl_bu =  true;       // Отображать уровень безубытка?
extern color   buc   =  clrGreen;   // Цвет уровня безубыточности
extern int     mn    =  0;          // Магики (0 - если руками)
extern int     tx_fs =  8;          // Размер шрифта
extern bool    fl_cl =  true;       // Закрывать ордера при достижении профита?
extern bool    fl_ll =  true;       // Закрывать ордера при достижении убытка?
extern int     slip  =  5;          // Проскальзывание
extern int     attem =  3;          // Количество попыток закрытия
extern string  B1    =  "Блок ММ";  // Блок настройки МаниМенеджмента
extern bool    fl_MM =  true;       // Использовать МаниМенеджмент?
extern double  lot   =  0.01;       // Лот при ММ = false
extern double  risk  =  5.0;        // Процент риска на сделку
extern double  stop  =  20.0;       // Стоплосс


// Цвета кнопок и панели
color buy_clr    =  clrPaleGreen;
color sel_clr    =  clrCoral;
color cls_clr    =  clrGreenYellow;
color close_cl   =  clrOrchid;

// Для кнопок
extern ENUM_BASE_CORNER InpCorner=  CORNER_RIGHT_UPPER;  // Угол графика для привязки кнопок
string           InpFont         =  "Calibri";           // Шрифт
int              InpFontSize     =  11;                  // Размер шрифта
color            InpColor        =  clrBlack;            // Цвет текста
color            InpBorderColor  =  clrNONE;             // Цвет границы
bool             InpState        =  false;               // Нажата/Отжата
bool             InpBack         =  false;               // Объект на заднем плане
bool             InpSelection    =  false;               // Выделить для перемещений
bool             InpHidden       =  true;                // Скрыт в списке объектов
long             InpZOrder       =  0;                   // Приоритет на нажатие мышью

// Координаты кнопок и размеры
extern int x_coor = 10; // Координата X
extern int y_coor = 20; // Координата Y
int x_size = 65;
int y_size = 20;
int x_step = 5;
int y_step = 15;
int y_panl = 155;
int n      = 1;

// Имена
string Button[4] = {"button_buy", "button_sell", "button_profit", "button_close"};

// Структура с информацией по просадкам и профитам
struct dd_value 
{
   string buy_text[2];
   string sell_text[2];
   string buy_name[2];
   string sell_name[2];
   string buy_text_nm[2];
   string sell_text_nm[2];
   string buy_bu_name;
   string sell_bu_name;
} new_dd;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   new_dd.buy_name[0]     = "buy_level_pr_"  + Symbol();
   new_dd.buy_name[1]     = "buy_level_dd_"  + Symbol();
   new_dd.sell_name[0]    = "sell_level_pr_" + Symbol();
   new_dd.sell_name[1]    = "sell_level_dd_" + Symbol();
   new_dd.buy_text_nm[0]  = "buy_text_pr_"   + Symbol();
   new_dd.buy_text_nm[1]  = "buy_text_dd_"   + Symbol();
   new_dd.sell_text_nm[0] = "sell_text_pr_"  + Symbol();
   new_dd.sell_text_nm[1] = "sell_text_dd_"  + Symbol();
   new_dd.buy_bu_name     = "buy_bu_name_"   + Symbol();
   new_dd.sell_bu_name    = "sell_bu_name_"  + Symbol();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ObjectDelete(new_dd.buy_name[0]);
   ObjectDelete(new_dd.buy_name[1]);
   ObjectDelete(new_dd.sell_name[0]);
   ObjectDelete(new_dd.sell_name[1]);
   ObjectDelete(new_dd.buy_text_nm[0]);
   ObjectDelete(new_dd.buy_text_nm[1]);
   ObjectDelete(new_dd.sell_text_nm[0]);
   ObjectDelete(new_dd.sell_text_nm[1]);
   ObjectDelete(new_dd.buy_bu_name);
   ObjectDelete(new_dd.sell_bu_name);
   
   for (int i = 0; i <  4; i++) ButtonDelete(0, Button[i]);
   
   Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double eq, eqdd;
   DrawLine(eq, eqdd);
   DrawElement();
   
   if (fl_cl) 
      if (Profit() > eq) 
      { 
         Close_ALL(OP_BUY); 
         Sleep(1000);
         Close_ALL(OP_SELL);
      }
   
   if (fl_ll)
      if (Profit() < eqdd)
      {
         Close_ALL(OP_BUY);
         Sleep(1000);
         Close_ALL(OP_SELL);
      }
   
   //Comment("eq = ", eq , ", eqdd = ", eqdd);
}
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   bool selected;
   //--- проверим событие на нажатие кнопки мышки
   if (id == CHARTEVENT_OBJECT_CLICK) {
      string clickedChartObject = sparam;
      //--- если нажатие на объекте с именем buttonID
      // Кнопка BUY
      if (clickedChartObject == Button[0]) {
         selected = ObjectGetInteger(0,Button[0],OBJPROP_STATE);
         //--- если кнопка нажата
         if (selected)  { 
            Buy_event();
            ObjectSetInteger(0,Button[0],OBJPROP_STATE,false);
         }
      }
      // Кнопка SELL
      if (clickedChartObject == Button[1]) {
         selected = ObjectGetInteger(0,Button[1],OBJPROP_STATE);
         //--- если кнопка нажата
         if (selected)  { 
            Sell_event();
            ObjectSetInteger(0,Button[1],OBJPROP_STATE,false);
         }
      }
      // Кнопка CLOSE ALL Profit
      if (clickedChartObject == Button[2]) {
         selected = ObjectGetInteger(0,Button[2],OBJPROP_STATE);
         //--- если кнопка нажата
         if (selected)  { 
            Close_ALLP(OP_BUY);
            Close_ALLP(OP_SELL);
            ObjectSetInteger(0,Button[2],OBJPROP_STATE,false);
         }
      }
      // Кнопка CLOSE ALL
      if (clickedChartObject == Button[3]) {
         selected = ObjectGetInteger(0,Button[3],OBJPROP_STATE);
         //--- если кнопка нажата
         if (selected)  {
            Close_ALL(OP_BUY);
            Close_ALL(OP_SELL);
            ObjectSetInteger(0,Button[3],OBJPROP_STATE,false);
         }
      }

      ChartRedraw(); // принудительно перерисуем все объекты на графике
   }
   
}
bool Buy_event()
{
   double Lot = LotValue();
   
   int nn = 1;
   if (Digits == 3 || Digits == 5) nn = 10;
   
   for (int it = 1; it <= attem; it++) {
      if (!OrderSend(Symbol(),OP_BUY,Lot,Ask,slip*nn,0.0,0.0,"SkyLover Dream (Buy)",mn,0,clrBlue)) {
         Print("Error open Buy: " + IntegerToString(GetLastError(),0,' '));
      } else break;
   }
   
   return (true);
}

bool Sell_event()
{
   double Lot = LotValue();
   
   int nn = 1;
   if (Digits == 3 || Digits == 5) nn = 10;
   
   for (int it = 1; it <= attem; it++) {
      if (!OrderSend(Symbol(),OP_SELL,Lot,Bid,slip*nn,0.0,0.0,"SkyLover Dream (Sell)",mn,0,clrRed)) {
         Print("Error open Sell: " + IntegerToString(GetLastError(),0,' '));
      } else break;
   }
   
   return (true);
}
//+------------------------------------------------------------------+
//| Функция закрытия всех ордеров                                    |
//+------------------------------------------------------------------+
void Close_ALL(int type)
{
   int nn = 1;
   if (Digits == 3 || Digits == 5) nn = 10;
   
   if (OrdersTotal() > 0) {
      for (int i = OrdersTotal()-1; i >= 0; i--) {
         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
            if (OrderMagicNumber() != mn || OrderSymbol() != Symbol()) continue;
         
            for (int it = 1; it <= attem; it++) {
               if (OrderType() == OP_BUY && type == OP_BUY) {
                  if (!OrderClose(OrderTicket(),OrderLots(),Bid,slip*nn,clrYellow)) 
                     Print("Failed to close order!");
                  else break;
               }
               if (OrderType() == OP_SELL && type == OP_SELL) {
                  if (!OrderClose(OrderTicket(),OrderLots(),Ask,slip*nn,clrYellow)) 
                     Print("Failed to close order!");
                  else break;
               }
            }
         }
      }   
   }
   return;
}
//+------------------------------------------------------------------+
//| Функция закрытия всех плюсовых ордеров                           |
//+------------------------------------------------------------------+
void Close_ALLP(int type)
{
   int nn = 1;
   if (Digits == 3 || Digits == 5) nn = 10;
   
   if (OrdersTotal() > 0) {
      for (int i = OrdersTotal()-1; i >= 0; i--) {
         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
            if (OrderMagicNumber() != mn || OrderSymbol() != Symbol()) continue;
            if (OrderProfit() <= 0) continue;
         
            for (int it = 1; it <= attem; it++) {
               if (OrderType() == OP_BUY && type == OP_BUY) {
                  if (!OrderClose(OrderTicket(),OrderLots(),Bid,slip*nn,clrYellow)) 
                     Print("Failed to close order!");
                  else break;
               }
               if (OrderType() == OP_SELL && type == OP_SELL) {
                  if (!OrderClose(OrderTicket(),OrderLots(),Ask,slip*nn,clrYellow)) 
                     Print("Failed to close order!");
                  else break;
               }
            }
         }
      }   
   }
   return;
}
//+------------------------------------------------------------------+
void DrawLine(double &a, double &b)
{
   // Величина депозита
   double balance = 0;
   if (mm == 0) balance = AccountFreeMargin();
   if (mm == 1) balance = AccountBalance();
   if (mm == 2) balance = AccountEquity();
   
   // Найдём просадку, выраженную в денежном эквиваленте
   double money_dd = - balance * dd / 100.0;
   b = money_dd;
   
   // Вычисление ДДПрайс
   double PB = ProfitPrice(Symbol(), OP_BUY,  mn, money_dd);
   double PS = ProfitPrice(Symbol(), OP_SELL, mn, money_dd);
   
   // Текст
   new_dd.buy_text[1]  = "DD = " + DoubleToStr(dd,2) + "% | " + DoubleToStr(money_dd,2) + " " + AccountCurrency();
   new_dd.sell_text[1] = "DD = " + DoubleToStr(dd,2) + "% | " + DoubleToStr(money_dd,2) + " " + AccountCurrency();
   
   // Рисуем
   SetPriceLine(PB, new_dd.buy_name[1],  ddc);
   SetText(new_dd.buy_text_nm[1],new_dd.buy_text[1],ddc,TimeCurrent(),NormalizeDouble(PB,Digits),tx_fs);

   SetPriceLine(PS, new_dd.sell_name[1], ddc);
   SetText(new_dd.sell_text_nm[1],new_dd.sell_text[1],ddc,TimeCurrent(),NormalizeDouble(PS,Digits),tx_fs);
   
   // Найдём профит, выраженный в денежном эквиваленте
   double money_lp = balance * lp / 100.0;
   a = money_lp;

   // Вычисление ДДПрайс
   double PBDD = ProfitPrice(Symbol(), OP_BUY,  mn, money_lp);
   double PSDD = ProfitPrice(Symbol(), OP_SELL, mn, money_lp);
   
   if (fl_lp) {   
      // Текст
      new_dd.buy_text[0]  = "Profit = " + DoubleToStr(lp,2) + "% | " + DoubleToStr(money_lp,2) + " " + AccountCurrency();
      new_dd.sell_text[0] = "Profit = " + DoubleToStr(lp,2) + "% | " + DoubleToStr(money_lp,2) + " " + AccountCurrency();
      
      // Рисуем
      SetPriceLine(PBDD, new_dd.buy_name[0],  lpc);
      SetText(new_dd.buy_text_nm[0],new_dd.buy_text[0],lpc,TimeCurrent(),NormalizeDouble(PBDD,Digits),tx_fs);
      SetPriceLine(PSDD, new_dd.sell_name[0], lpc);
      SetText(new_dd.sell_text_nm[0],new_dd.sell_text[0],lpc,TimeCurrent(),NormalizeDouble(PSDD,Digits),tx_fs);
   }
   
   if (fl_bu) {
      // Найдём профит, выраженный в денежном эквиваленте
      double money_bu = 0.0;

      // Вычисление ДДПрайс
      double PBBU = ProfitPrice(Symbol(), OP_BUY,  mn, money_bu);
      double PSBU = ProfitPrice(Symbol(), OP_SELL, mn, money_bu);
      
      // Рисуем
      SetPriceLine(PBBU, new_dd.buy_bu_name,  buc);
      SetPriceLine(PSBU, new_dd.sell_bu_name, buc);
   }
   //if (PBDD != 0) return (PBDD);
   //if (PSDD != 0) return (PSDD);
   //else return (0.0);
}
//+------------------------------------------------------------------+
double Profit()
{
   double temp = 0.0;

   for (int i = 0; i < OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() == Symbol()) {
            if (OrderMagicNumber() == mn) {
               temp += OrderProfit() + OrderCommission() + OrderSwap();
            }
         }
      }
   }
   return (temp);
}
//+------------------------------------------------------------------+
double ProfitPrice(string fSymbol, int fType, int fMagic=0, double MyProfit=0.0)
{
   //Функция возвращает цену, на которую необходимо установить уровень TakeProfit, чтобы получить прибыль MyProfit
   double SummPrice=0.0, SummLots=0.0, Formula=0.0, SummLoss=0.0;
   int k = 0;
   int total = OrdersTotal();
   for (int i = total-1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if(OrderSymbol()==fSymbol) {
            if(OrderMagicNumber()==fMagic || fMagic==0) {
               if(OrderType()==fType) {
                  k++;
                  SummLots=SummLots+OrderLots();
                  SummPrice=SummPrice+OrderOpenPrice()*OrderLots();
                  SummLoss=SummLoss+OrderCommission()+OrderSwap();
               }
            }
         }
      }
   }//Next i  
   
   if(k>0){
      if(fType==OP_BUY){
         Formula = SummPrice/SummLots + 
         (MyProfit-SummLoss) * MarketInfo(fSymbol, MODE_POINT) / 
         (MarketInfo(fSymbol, MODE_TICKVALUE) * SummLots);
      } else {
         Formula = SummPrice/SummLots - 
         (MyProfit-SummLoss) * MarketInfo(fSymbol, MODE_POINT) / 
         (MarketInfo(fSymbol, MODE_TICKVALUE) * SummLots);
      }
   }
   
   return(NormalizeDouble(Formula,Digits));
}//ProfitPrice()

//+------------------------------------------------------------------+
void SetPriceLine(double Price=0.0, string NameLine = "MyLine", color ColorLine = DarkOliveGreen){
   int indWnd=0;
   //hWnd = WindowFind(window);
   if (ObjectFind(NameLine)==-1) ObjectCreate(NameLine, OBJ_HLINE, indWnd, 0, Price);
   if(Price==0.0){
      ObjectDelete(NameLine);
   }else{
      ObjectSet(NameLine, OBJPROP_PRICE1, Price);
      ObjectSet(NameLine, OBJPROP_COLOR, ColorLine);
   }
}//SetPriceLine()

//+------------------------------------------------------------------+
bool SetText(string nm, string tx, color cl, datetime time, double price, int fs) 
{
   time += 5*Period()*60;
   //--- сбросим значение ошибки
   ResetLastError();
   //--- создадим объект "Текст"
   if (ObjectFind(nm) < 0) {
      ObjectCreate(0, nm, OBJ_TEXT, 0, time, price);
   } 
   
   ObjectMove(0, nm, 0, time, price);
   ObjectSetString( 0, nm, OBJPROP_TEXT, tx);
   ObjectSetInteger(0, nm, OBJPROP_FONTSIZE, fs);
   ObjectSetDouble( 0, nm, OBJPROP_ANGLE, 0.0);
   ObjectSetInteger(0, nm, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
   ObjectSetInteger(0, nm, OBJPROP_COLOR, cl);
   ObjectSetInteger(0, nm, OBJPROP_BACK, false);
   ObjectSetInteger(0, nm, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0 ,nm, OBJPROP_SELECTED,   false);
   
   return (true);
}
double LotValue()
{
   if (!fl_MM) return (lot);
   
   // Величина депозита
   double Free = 0;
   if (mm == 0) Free = AccountFreeMargin();
   if (mm == 1) Free = AccountBalance();
   if (mm == 2) Free = AccountEquity();
   
   double LotVal  = MarketInfo(Symbol(),MODE_TICKVALUE)/(MarketInfo(Symbol(),MODE_TICKSIZE) / 
                    MarketInfo(Symbol(),MODE_POINT));  //стоимость 1 пункта для 1 лота
   double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);
   double Step    = MarketInfo(Symbol(),MODE_LOTSTEP);
   
   if (LotVal == 0) return (0);
   if (Step   == 0) return (0);
   
   int nn = 1;
   if (Digits == 3 || Digits == 5) nn = 10;
   
   double Lot     = MathFloor((Free * risk / 100.0) / (stop * nn * LotVal) / Step) * Step;
   
   if (Lot < Min_Lot) Lot = Min_Lot;
   if (Lot > Max_Lot) Lot = Max_Lot;
   Lot = NormalizeDouble(Lot,2);
   
   return (Lot);
}

void DrawElement()
{
   double Lot = LotValue();
   // Кнопка для покупок
   int x_buy = x_coor, y_buy = y_coor;   
   if (InpCorner == 1)  x_buy = x_coor + 2*x_size + x_step;
   if (InpCorner == 2)  y_buy = y_coor + y_panl + 3*y_size + 3*x_step;
   if (InpCorner == 3) {x_buy = x_coor + 2*x_size + x_step; y_buy = y_coor + y_panl + 3*y_size + 3*x_step;}
   
   string text = "Buy " + DoubleToStr(Lot,2);
   if (!ButtonCreate(0,Button[0],0,x_buy,y_buy,x_size,y_size,InpCorner,text,InpFont,InpFontSize,
      InpColor,buy_clr,InpBorderColor,InpState,InpBack,InpSelection,InpHidden,InpZOrder)) {
      return;
   }
   
   // Кнопка для продаж
   int x_sell = x_coor + x_size + x_step, y_sell = y_coor;
   if (InpCorner == 1)  x_sell = x_coor + x_size;
   if (InpCorner == 2)  y_sell = y_coor + y_panl + 3*y_size + 3*x_step;
   if (InpCorner == 3) {x_sell = x_coor + x_size; y_sell = y_coor + y_panl + 3*y_size + 3*x_step;}
   
   text = "Sell " + DoubleToStr(Lot,2);
   if (!ButtonCreate(0,Button[1],0,x_sell,y_sell,x_size,y_size,InpCorner,text,InpFont,InpFontSize,
      InpColor,sel_clr,InpBorderColor,InpState,InpBack,InpSelection,InpHidden,InpZOrder)) {
      return;
   }
   
   // Кнопка для закрытия всех ордеров в просадке
   int x_profit = x_coor, y_profit = y_coor + y_size + x_step;
   if (InpCorner == 1)  x_profit = x_coor + 2*x_size + x_step;
   if (InpCorner == 2)  y_profit = y_coor + y_panl + 2*y_size + 2*x_step;
   if (InpCorner == 3) {x_profit = x_coor + 2*x_size + x_step; y_profit = y_coor + y_panl + 2*y_size + 2*x_step;}
   
   text = "Close Profit Order";
   if (!ButtonCreate(0,Button[2],0,x_profit,y_profit,2*x_size+x_step,y_size,InpCorner,text,InpFont,InpFontSize,
      InpColor,cls_clr,InpBorderColor,InpState,InpBack,InpSelection,InpHidden,InpZOrder)) {
      return;
   }
   
   // Кнопка для закрытия всех ордеров в профите
   int x_close = x_coor, y_close = y_coor + 2*y_size + 2*x_step;
   if (InpCorner == 1)  x_close = x_coor + 2*x_size + x_step;
   if (InpCorner == 2)  y_close = y_coor + y_panl + y_size + x_step;
   if (InpCorner == 3) {x_close = x_coor + 2*x_size + x_step; y_close = y_coor + y_panl + y_size + x_step;}
   
   text = "Close All";
   if (!ButtonCreate(0,Button[3],0,x_close,y_close,2*x_size+x_step,y_size,InpCorner,text,InpFont,InpFontSize,
      InpColor,close_cl,InpBorderColor,InpState,InpBack,InpSelection,InpHidden,InpZOrder)) {
      return;
   }
   ChartRedraw();
}

//+------------------------------------------------------------------+
//| Создает кнопку                                                   |
//+------------------------------------------------------------------+
bool ButtonCreate(const long              chart_ID=0,               // ID графика
                  const string            name="Button",            // имя кнопки
                  const int               sub_window=0,             // номер подокна
                  const int               x=0,                      // координата по оси X
                  const int               y=0,                      // координата по оси Y
                  const int               width=50,                 // ширина кнопки
                  const int               height=18,                // высота кнопки
                  const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                  const string            text="Button",            // текст
                  const string            font="Arial",             // шрифт
                  const int               font_size=10,             // размер шрифта
                  const color             clr=clrBlack,             // цвет текста
                  const color             back_clr=C'236,233,216',  // цвет фона
                  const color             border_clr=clrNONE,       // цвет границы
                  const bool              state=false,              // нажата/отжата
                  const bool              back=false,               // на заднем плане
                  const bool              selection=false,          // выделить для перемещений
                  const bool              hidden=true,              // скрыт в списке объектов
                  const long              z_order=0)                // приоритет на нажатие мышью
{
   //--- сбросим значение ошибки
   ResetLastError();
   //--- создадим кнопку
   if (ObjectFind(name) == -1) {
      ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0);
   }
   
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);                 // установим координаты кнопки
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);                 // установим размер кнопки
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);               // установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetString( chart_ID,name,OBJPROP_TEXT,text);                   // установим текст
   ObjectSetString( chart_ID,name,OBJPROP_FONT,font);                   // установим шрифт текста
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);          // установим размер шрифта
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);                   // установим цвет текста
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);            // установим цвет фона
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);     // установим цвет границы
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);                   // отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);                 // переведем кнопку в заданное состояние
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);        // включим (true) или отключим (false) режим перемещения кнопки мышью
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);               // скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);              // установим приоритет на получение события нажатия мыши на графике
   
   //--- успешное выполнение
   return(true);
}
//+------------------------------------------------------------------+
//| Удаляет кнопку                                                   |
//+------------------------------------------------------------------+
bool ButtonDelete(const long   chart_ID=0,    // ID графика
                  const string name="Button") // имя кнопки
{
   //--- сбросим значение ошибки
   ResetLastError();
   //--- удалим кнопку
   if (ObjectFind(chart_ID,name) >= 0) 
      ObjectDelete(chart_ID,name);
   //--- успешное выполнение
   return(true);
}