//+------------------------------------------------------------------+
//|                                                   Lot_Volume.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict

extern   double Risk          = 10;
extern   double Step_TP       = 2;

         string Button_ON              = "Button_ON";
         int    x_Button_ON            = 50;
         int    y_Button_ON            = 20;
         int XSIZE_Button_ON           = 42;
         int YSIZE_Button_ON           = 26;
         
         string Button_auction         = "Button_auction";
         int    x_Button_auction       = 50;
         int    y_Button_auction       = 50;
         int XSIZE_Button_auction      = 42;
         int YSIZE_Button_auction      = 26;
         
         color  Color         = DeepSkyBlue;
         string Name_Objecdt  = "LS";
         string Name_Stop     = "STOP";
         string text_name     = "my_OBJ_TEXT_object";
         string Name_TP       = "TP";
         double Price         = 0;
         
         int Magic            = 12345;
         


int OnInit()
  {
      

   return(0);
  }


void OnDeinit(const int reason)
  {
   //удаляем линию
   ObjectDelete(0, Name_Objecdt);
   ObjectDelete(0, text_name);
   ObjectDelete(0, Name_Stop);
   ObjectDelete(0, Name_TP);
   ObjectDelete(0, Button_ON);
   ObjectDelete(0, Button_auction);
  }

void OnTick()
  {
         // перенес из OnInit
         if(ObjectFind(0, Button_ON) < 0)
         {
                  if(ObjectCreate(0,Button_ON,OBJ_BUTTON,0,0,0) == true)
                  {
                     //--- установим координаты кнопки
                     ObjectSetInteger(0,Button_ON,OBJPROP_XDISTANCE,x_Button_ON);
                     ObjectSetInteger(0,Button_ON,OBJPROP_YDISTANCE,y_Button_ON);
                     //--- установим размер кнопки
                     ObjectSetInteger(0,Button_ON,OBJPROP_XSIZE,XSIZE_Button_ON);
                     ObjectSetInteger(0,Button_ON,OBJPROP_YSIZE,YSIZE_Button_ON);
                     //--- установим угол графика, относительно которого будут определяться координаты точки
                     ObjectSetInteger(0,Button_ON,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
                     //--- установим текст
                     ObjectSetString(0,Button_ON,OBJPROP_TEXT,"OFF");
                     //--- установим шрифт текста
                     ObjectSetString(0,Button_ON,OBJPROP_FONT,"Arial");
                     //--- установим размер шрифта
                     ObjectSetInteger(0,Button_ON,OBJPROP_FONTSIZE,8);
                     //--- установим цвет текста
                     ObjectSetInteger(0,Button_ON,OBJPROP_COLOR,clrBlack);
                     //--- установим цвет фона
                     ObjectSetInteger(0,Button_ON,OBJPROP_BGCOLOR,clrTurquoise);
                     //--- установим цвет границы
                     ObjectSetInteger(0,Button_ON,OBJPROP_BORDER_COLOR,Black);
                     //--- отобразим на переднем (false) или заднем (true) плане
                     ObjectSetInteger(0,Button_ON,OBJPROP_BACK,false);
                     //--- переведем кнопку в заданное состояние
                     ObjectSetInteger(0,Button_ON,OBJPROP_STATE,false);
                     //--- включим (true) или отключим (false) режим перемещения кнопки мышью
                     ObjectSetInteger(0,Button_ON,OBJPROP_SELECTABLE,false);
                     ObjectSetInteger(0,Button_ON,OBJPROP_SELECTED,false);
                     //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
                     ObjectSetInteger(0,Button_ON,OBJPROP_HIDDEN,false);
                     //--- установим приоритет на получение события нажатия мыши на графике
                     ObjectSetInteger(0,Button_ON,OBJPROP_ZORDER,0);
                  }
          }
          if(ObjectGetInteger(0,Button_ON, OBJPROP_STATE, 0) == true)
          {
                     // собираем кнопку продажи
     
            if(ObjectFind(0, Button_auction) < 0)
            {   
                     if(ObjectCreate(0,Button_auction,OBJ_BUTTON,0,0,0) == true)
                     {
                     //--- установим координаты кнопки
                     ObjectSetInteger(0,Button_auction,OBJPROP_XDISTANCE,x_Button_auction);
                     ObjectSetInteger(0,Button_auction,OBJPROP_YDISTANCE,y_Button_auction);
                     //--- установим размер кнопки
                     ObjectSetInteger(0,Button_auction,OBJPROP_XSIZE,XSIZE_Button_auction);
                     ObjectSetInteger(0,Button_auction,OBJPROP_YSIZE,YSIZE_Button_auction);
                     //--- установим угол графика, относительно которого будут определяться координаты точки
                     ObjectSetInteger(0,Button_auction,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
                     //--- установим шрифт текста
                     ObjectSetString(0,Button_auction,OBJPROP_FONT,"Arial");
                     //--- установим размер шрифта
                     ObjectSetInteger(0,Button_auction,OBJPROP_FONTSIZE,8);
                     //--- установим цвет границы
                     ObjectSetInteger(0,Button_auction,OBJPROP_BORDER_COLOR,Black);
                     //--- отобразим на переднем (false) или заднем (true) плане
                     ObjectSetInteger(0,Button_auction,OBJPROP_BACK,false);
                     //--- переведем кнопку в заданное состояние
                     ObjectSetInteger(0,Button_auction,OBJPROP_STATE,false);
                     //--- включим (true) или отключим (false) режим перемещения кнопки мышью
                     ObjectSetInteger(0,Button_auction,OBJPROP_SELECTABLE,false);
                     ObjectSetInteger(0,Button_auction,OBJPROP_SELECTED,false);
                     //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
                     ObjectSetInteger(0,Button_auction,OBJPROP_HIDDEN,false);
                     //--- установим приоритет на получение события нажатия мыши на графике
                     ObjectSetInteger(0,Button_auction,OBJPROP_ZORDER,0);
                     }
            }
     
     //-----------------------------------------
  
  
     ObjectSetString(0,Button_ON,OBJPROP_TEXT,"ON");
     if(ObjectFind(0, Name_Objecdt)< 0)
     {
         // даем линию
         if(Price == 0)
         {
             Price = Bid - 200 * Point;
         }
         Line_creating(Name_Objecdt, Color, Price, true, true);
     }
   
   if(ObjectFind(0, text_name)< 0)
   {
         // создаем текст
      double chart_max_price=ChartGetDouble(0,CHART_PRICE_MAX,0);
      //--- создадим объект Label
      ObjectCreate(0,text_name,OBJ_TEXT,0,TimeCurrent(),chart_max_price);
      //--- зададим цвет текста
      ObjectSetInteger(0,text_name,OBJPROP_COLOR,Color);
      //--- установим текст для объекта Label
      ObjectSetString(0,text_name,OBJPROP_TEXT,"- ждем обновления котировок -");
      //--- установим шрифт надписи
      ObjectSetString(0,text_name,OBJPROP_FONT,"Trebuchet MS");
      //--- установим размер шрифта
      ObjectSetInteger(0,text_name,OBJPROP_FONTSIZE,14);
      //--- установим привязку к правому верхнему углу
      ObjectSetInteger(0,text_name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
      //--- запретим выделение объекта мышкой
      ObjectSetInteger(0,text_name,OBJPROP_SELECTABLE,false);
      //--- отрисуем на графике
      ChartRedraw(0);
   }
//----------------------------------------------------------------------------  
//-------------------------------- Работа с линией и лотом -------------------
             
      double SL            = 0;
      double lot_min       = MarketInfo(Symbol(), MODE_MINLOT);
      double lot_max       = MarketInfo(Symbol(), MODE_MAXLOT);
      double lot_step      = MarketInfo(Symbol(), MODE_LOTSTEP);
      double lotcost       = MarketInfo(Symbol(), MODE_TRADEALLOWED);
      double lot           = 0;
      double UsdPerPip     = 0;
      double Risk_Closed   = Risk;
      double Max_Price     = 0;
      double Money         = 0;
      double Price_TP      = 0;
       
         Price = NormalizeDouble(ObjectGetDouble(0, Name_Objecdt, OBJPROP_PRICE), Digits);
         
//------------------------------------------ SELL ----------------------------
         if(Price > Bid && Price > Ask) 
         {
         SL = NormalizeDouble(NormalizeDouble(Price - Bid, Digits)*100000, 0);
            Price_TP = NormalizeDouble(Ask-((Price - Ask)*Step_TP), Digits);
            
            //--- установим текст
               ObjectSetString(0,Button_auction,OBJPROP_TEXT,"SELL");
            //--- установим цвет фона
               ObjectSetInteger(0,Button_auction,OBJPROP_BGCOLOR,clrOrangeRed);
            //--- установим цвет текста
               ObjectSetInteger(0,Button_auction,OBJPROP_COLOR,clrBlack);
             
            ObjectDelete(0, Name_TP);
            Line_creating(Name_TP, LimeGreen, Price_TP, false, false);
         }
//------------------------------------------ BUY ---------------------------
         if(Price < Ask && Price < Bid) 
         {
         SL = NormalizeDouble(NormalizeDouble(Ask - Price, Digits)*100000, 0);
            Price_TP = NormalizeDouble(Bid + ((Bid - Price)*Step_TP), Digits);
            
            
               //--- установим текст
               ObjectSetString(0,Button_auction,OBJPROP_TEXT,"BUY");
            //--- установим цвет фона
               ObjectSetInteger(0,Button_auction,OBJPROP_BGCOLOR,clrGreen);
            //--- установим цвет текста
               ObjectSetInteger(0,Button_auction,OBJPROP_COLOR,clrWhite);
            
            ObjectDelete(0, Name_TP); 
            Line_creating(Name_TP, LimeGreen, Price_TP, false, false);
         }
// ------------------------------------ no SELL, no BUY ---------------------
         if(Price < Ask && Price > Bid) SL = 0;
         
//------------------------------------------------------------------------------------     
         lot = NormalizeDouble(AccountBalance()/MarketInfo(Symbol(), MODE_TICKVALUE), 2) * Risk_Closed/100;
         
         UsdPerPip = lot/SL;
         
//------------------------------------------------------------------------------------
//---------------------- блок для отрисовки макс линии -------------------------------
//------------------------------------------------------------------------------------
          
// ----------------------------------------- BUY ----------------------------
         if(Price > Bid && Price > Ask) 
         {
             Max_Price = Bid + NormalizeDouble(lot/lot_min * Point, Digits);
         }
// ----------------------------------------- SELL ---------------------------
         if(Price < Ask && Price < Bid) 
         {
             Max_Price = Ask - NormalizeDouble(lot/lot_min * Point, Digits);
         }
// ---------------------------------- no SELL, no BUY -----------------------
         if(Price < Ask && Price > Bid) Max_Price = Price;
         
         if(Max_Price < Price)
         { 
               ObjectDelete(0, Name_Stop);
               Line_creating(Name_Stop, Red, Max_Price, false, false);
         }
         if(Max_Price > Price)
         { 
               ObjectDelete(0, Name_Stop);
               Line_creating(Name_Stop, Red, Max_Price, false, false);
         }
         if(Price < Ask && Price > Max_Price)ObjectDelete(0, Name_Stop);
         if(Price > Ask && Price < Max_Price)ObjectDelete(0, Name_Stop);
            
//------------------------------------------------------------------------------------
     
         lot = NormalizeDouble(UsdPerPip/lotcost, 2);
         
         lot = NormalizeDouble(lot/lot_step, 0) * lot_step;
     
     if(lot < lot_min) 
     {
         lot = lot_min;
         Risk_Closed = (lot * SL)*100/AccountBalance();
     }
     
     if(lot > lot_max) lot = lot_max;
     
     Money = NormalizeDouble((lot * SL)*MarketInfo(Symbol(), MODE_TICKVALUE), 2);
    
     ObjectSetString(0,text_name,OBJPROP_TEXT,"Потери = -"+ 
                     DoubleToStr(Money,2)+ " " +
                     AccountInfoString(ACCOUNT_CURRENCY)+ " ~ " +"Риск = "+ 
                     DoubleToStr(Risk_Closed, 2)+ 
                     "% ~ " + "Лот = "+ 
                     DoubleToStr(lot, 2)+ " " + " ~ " + "Курс = " +
                     DoubleToStr(MarketInfo(Symbol(), MODE_TICKVALUE), 2));  
                     
 }
  else 
  {
   ObjectSetString(0,Button_ON,OBJPROP_TEXT,"OFF");
   ObjectDelete(0, Name_Objecdt);
   ObjectDelete(0, text_name);
   ObjectDelete(0, Name_Stop);
   ObjectDelete(0, Name_TP);
   ObjectDelete(0, Button_auction);
  }
  }

//- ФУНКЦИЯ №1  ---------------------- создание ГОРИЗОНТАЛЬНОЙ линии ---------------------------------------------
                                                                                                               //
 void Line_creating(string line_name, color line_color, double line_price, bool selectable, bool selected)     //
 {                                                                                                             //
   if(ObjectCreate(0, line_name,OBJ_HLINE,0,0,line_price) == true)                                             //
   {                                                                                                           //
      ObjectSetInteger(0,line_name,OBJPROP_COLOR,line_color);         //--- установим цвет линии               //
      ObjectSetInteger(0,line_name,OBJPROP_STYLE,STYLE_DASH);         //--- установим стиль отображения линии  //
      ObjectSetInteger(0,line_name,OBJPROP_SELECTABLE, selectable);   //--- можно выделить                     //
      ObjectSetInteger(0,line_name,OBJPROP_SELECTED, selected);       //--- можно переместить                  //
   }                                                                                                           //
 }                                                                                                             //
//----------------------------------------------------------------------------------------------------------------
//- ФУНКЦИЯ №2 ---------------------- создать кнопку -------------------------------------------------------------
