#property strict 
//--- описание 
#property description "Скрипт создает графический объект \"Прямоугольная метка\"." 
//--- покажем окно входных параметров при запуске скрипта 
#property script_show_inputs 
//--- входные параметры скрипта 
input string           InpName="RectLabel";         // Имя метки 
input color            InpBackColor=clrSkyBlue;     // Цвет фона 
input ENUM_BORDER_TYPE InpBorder=BORDER_FLAT;       // Тип рамки 
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Угол графика для привязки 
input color            InpColor=clrDarkBlue;        // Цвет плоской границы (Flat) 
input ENUM_LINE_STYLE  InpStyle=STYLE_SOLID;        // Стиль плоской границы (Flat) 
input int              InpLineWidth=3;              // Толщина плоской границы (Flat) 
input bool             InpBack=false;               // Объект на заднем плане 
input bool             InpSelection=true;           // Выделить для перемещений 
input bool             InpHidden=true;              // Скрыт в списке объектов 
input long             InpZOrder=0;                 // Приоритет на нажатие мышью 
//+------------------------------------------------------------------+ 
//| Создает прямоугольную метку                                      | 
//+------------------------------------------------------------------+ 
bool RectLabelCreate(const long             chart_ID=0,               // ID графика 
                     const string           name="RectLabel",         // имя метки 
                     const int              sub_window=0,             // номер подокна 
                     const int              x=0,                      // координата по оси X 
                     const int              y=0,                      // координата по оси Y 
                     const int              width=50,                 // ширина 
                     const int              height=18,                // высота 
                     const color            back_clr=C'236,233,216',  // цвет фона 
                     const ENUM_BORDER_TYPE border=BORDER_SUNKEN,     // тип границы 
                     const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки 
                     const color            clr=clrRed,               // цвет плоской границы (Flat) 
                     const ENUM_LINE_STYLE  style=STYLE_SOLID,        // стиль плоской границы 
                     const int              line_width=1,             // толщина плоской границы 
                     const bool             back=false,               // на заднем плане 
                     const bool             selection=false,          // выделить для перемещений 
                     const bool             hidden=true,              // скрыт в списке объектов 
                     const long             z_order=0)                // приоритет на нажатие мышью 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим прямоугольную метку 
   if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать прямоугольную метку! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим координаты метки 
   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_BGCOLOR,back_clr); 
//--- установим тип границы 
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border); 
//--- установим угол графика, относительно которого будут определяться координаты точки 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 
//--- установим цвет плоской рамки (в режиме Flat) 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линии плоской рамки 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину плоской границы 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим перемещения метки мышью 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Перемещает прямоугольную метку                                   | 
//+------------------------------------------------------------------+ 
bool RectLabelMove(const long   chart_ID=0,       // ID графика 
                   const string name="RectLabel", // имя метки 
                   const int    x=0,              // координата по оси X 
                   const int    y=0)              // координата по оси Y 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- переместим прямоугольную метку 
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось переместить X-координату метки! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось переместить Y-координату метки! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Изменяет размер прямоугольной метки                              | 
//+------------------------------------------------------------------+ 
bool RectLabelChangeSize(const long   chart_ID=0,       // ID графика 
                         const string name="RectLabel", // имя метки 
                         const int    width=50,         // ширина метки 
                         const int    height=18)        // высота метки 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- изменим размеры метки 
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось изменить ширину метки! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось изменить высоту метки! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Изменяет тип границы прямоугольной метки                         | 
//+------------------------------------------------------------------+ 
bool RectLabelChangeBorderType(const long             chart_ID=0,           // ID графика 
                               const string           name="RectLabel",     // имя метки 
                               const ENUM_BORDER_TYPE border=BORDER_SUNKEN) // тип границы 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- изменим тип рамки 
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось изменить тип границы! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Удаляет прямоугольную метку                                      | 
//+------------------------------------------------------------------+ 
bool RectLabelDelete(const long   chart_ID=0,       // ID графика 
                     const string name="RectLabel") // имя метки 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- удалим метку 
   if(!ObjectDelete(chart_ID,name)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось удалить прямоугольную метку! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- размеры окна графика 
   long x_distance; 
   long y_distance; 
//--- определим размеры окна 
   if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance)) 
     { 
      Print("Не удалось получить ширину графика! Код ошибки = ",GetLastError()); 
      return; 
     } 
   if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance)) 
     { 
      Print("Не удалось получить высоту графика! Код ошибки = ",GetLastError()); 
      return; 
     } 
//--- определим координаты прямоугольной метки 
   int x=(int)x_distance/4; 
   int y=(int)y_distance/4; 
//--- установим размеры метки 
   int width=(int)x_distance/4; 
   int height=(int)y_distance/4; 
//--- создадим прямоугольную метку 
   if(!RectLabelCreate(0,InpName,0,x,y,width,height,InpBackColor,InpBorder,InpCorner, 
      InpColor,InpStyle,InpLineWidth,InpBack,InpSelection,InpHidden,InpZOrder)) 
     { 
      return; 
     } 
//--- перерисуем график и подождем одну секунду 
   ChartRedraw(); 
   Sleep(1000); 
//--- изменим размер прямоугольной метки 
   int steps=(int)MathMin(x_distance/4,y_distance/4); 
   for(int i=0;i<steps;i++) 
     { 
      //--- изменим размеры 
      width+=1; 
      height+=1; 
      if(!RectLabelChangeSize(0,InpName,width,height)) 
         return; 
      //--- проверим факт принудительного завершения скрипта 
      if(IsStopped()) 
         return; 
      //--- перерисуем график и подождем 0.01 секунды 
      ChartRedraw(); 
      Sleep(10); 
     } 
//--- задержка в 1 секунду 
   Sleep(1000); 
//--- изменим тип рамки 
   if(!RectLabelChangeBorderType(0,InpName,BORDER_RAISED)) 
      return; 
//--- перерисуем график и подождем 1 секунду 
   ChartRedraw(); 
   Sleep(1000); 
//--- изменим тип рамки 
   if(!RectLabelChangeBorderType(0,InpName,BORDER_SUNKEN)) 
      return; 
//--- перерисуем график и подождем 1 секунду 
   ChartRedraw(); 
   Sleep(1000); 
//--- удалим метку 
   RectLabelDelete(0,InpName); 
   ChartRedraw(); 
//--- подождем 1 секунду 
   Sleep(1000); 
//--- 
  }  |