OBJ_BITMAP

Объект "Рисунок".

ObjBitmap

Примечание

Для объекта "Рисунок" можно выбирать область видимости рисунка.

Пример

Следующий скрипт создает на графике несколько картинок. Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах.

 

//--- описание
#property description "Скрипт создает рисунок в окне графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string          InpFile="\\Images\\dollar.bmp"// Имя файла с картинкой
input int             InpWidth=24;                    // X-координата области видимости
input int             InpHeight=24;                   // Y-координата области видимости
input int             InpXOffset=4;                   // Смещение области видимости по X
input int             InpYOffset=4;                   // Смещение области видимости по Y
input color           InpColor=clrRed;                // Цвет рамки при выделении
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID;           // Стиль линии при выделении
input int             InpPointWidth=1;                // Размер точки для перемещений
input bool            InpBack=false;                  // Объект на заднем плане
input bool            InpSelection=false;             // Выделить для перемещений
input bool            InpHidden=true;                 // Скрыт в списке объектов
input long            InpZOrder=0;                    // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает рисунок в окне графика                                   |
//+------------------------------------------------------------------+
bool BitmapCreate(const long            chart_ID=0,        // ID графика
                  const string          name="Bitmap",     // имя рисунка
                  const int             sub_window=0,      // номер подокна
                  datetime              time=0,            // время точки привязки
                  double                price=0,           // цена точки привязки
                  const string          file="",           // имя файла с картинкой
                  const int             width=10,          // X-координата области видимости
                  const int             height=10,         // Y-координата области видимости
                  const int             x_offset=0,        // смещение области видимости по X
                  const int             y_offset=0,        // смещение области видимости по Y
                  const color           clr=clrRed,        // цвет рамки при выделении
                  const ENUM_LINE_STYLE style=STYLE_SOLID// стиль линии при выделении
                  const int             point_width=1,     // размер точки перемещения
                  const bool            back=false,        // на заднем плане
                  const bool            selection=false,   // выделить для перемещений
                  const bool            hidden=true,       // скрыт в списке объектов
                  const long            z_order=0)         // приоритет на нажатие мышью
  {
//--- установим координаты точки привязки, если они не заданы
   ChangeBitmapEmptyPoint(time,price);
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим рисунок
   if(!ObjectCreate(chart_ID,name,OBJ_BITMAP,sub_window,time,price))
     {
      Print(__FUNCTION__,
            ": не удалось создать рисунок в окне графика! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим путь к файлу с картинкой
   if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,file))
     {
      Print(__FUNCTION__,
            ": не удалось загрузить картинку! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим область видимости изображения; если значения ширины или высоты
//--- больше значений ширины и высоты (соответственно) исходного изображения, то
//--- оно не рисуется; если значения ширины и высоты меньше размеров изображения,
//--- то рисуется та его часть, которая соответствует этим размерам
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим, какая часть изображения должна показываться в области видимости
//--- по умолчанию это левая верхняя область изображения; значения позволяют
//--- произвести сдвиг от этого угла и отобразить другую часть изображения
   ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
   ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
//--- установим цвет рамки при включенном режиме выделения объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии рамки при включенном режиме выделения объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер точки привязки, с помощью которой можно перемещать объект
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_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 BitmapSetImage(const long   chart_ID=0,    // ID графика
                    const string name="Bitmap"// имя рисунка
                    const string file="")       // путь к файлу
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- установим путь к файлу с картинкой
   if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,file))
     {
      Print(__FUNCTION__,
            ": не удалось загрузить картинку! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Перемещает рисунок в окне графика                                |
//+------------------------------------------------------------------+
bool BitmapMove(const long   chart_ID=0,    // ID графика
                const string name="Bitmap"// имя рисунка
                datetime     time=0,        // время точки привязки
                double       price=0)       // цена точки привязки
  {
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
   if(!time)
      time=TimeCurrent();
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
   ResetLastError();
//--- переместим точку привязки
   if(!ObjectMove(chart_ID,name,0,time,price))
     {
      Print(__FUNCTION__,
            ": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Изменяет размер области видимости (размер рисунка)               |
//+------------------------------------------------------------------+
bool BitmapChangeSize(const long   chart_ID=0,    // ID графика
                      const string name="Bitmap"// имя рисунка
                      const int    width=0,       // ширина рисунка
                      const int    height=0)      // высота рисунка
  {
//--- сбросим значение ошибки
   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 BitmapMoveVisibleArea(const long   chart_ID=0,    // ID графика
                           const string name="Bitmap"// имя рисунка
                           const int    x_offset=0,    // координата X области видимости
                           const int    y_offset=0)    // координата Y области видимости
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- изменим координаты области видимости рисунка
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset))
     {
      Print(__FUNCTION__,
            ": не удалось изменить X-координату области видимости! Код ошибки = ",GetLastError());
      return(false);
     }
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset))
     {
      Print(__FUNCTION__,
            ": не удалось изменить Y-координату области видимости! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Удаляет рисунок                                                  |
//+------------------------------------------------------------------+
bool BitmapDelete(const long   chart_ID=0,    // ID графика
                  const string name="Bitmap"// имя рисунка
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- удалим метку
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": не удалось удалить рисунок! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Проверяет значения точки привязки и для пустых значений          |
//| устанавливает значения по умолчанию                              |
//+------------------------------------------------------------------+
void ChangeBitmapEmptyPoint(datetime &time,double &price)
  {
//--- если время точки не задано, то она будет на текущем баре
   if(!time)
      time=TimeCurrent();
//--- если цена точки не задана, то она будет иметь значение Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime date[];  // массив для хранения дат видимых баров
   double   close[]; // массив для хранения цен Close
//--- имя файла с картинкой
   string   file="\\Images\\dollar.bmp";
//--- количество видимых баров в окне графика
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- выделение памяти
   ArrayResize(date,bars);
   ArrayResize(close,bars);
//--- заполним массив дат 
   ResetLastError();
   if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
     {
      Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
      return;
     }
//--- заполним массив цен Close
   if(CopyClose(Symbol(),Period(),0,bars,close)==-1)
     {
      Print("Не удалось скопировать значения цен Close! Код ошибки = ",GetLastError());
      return;
     }
//--- определим, как часто надо выводить картинки
   int scale=(int)ChartGetInteger(0,CHART_SCALE);
//--- определим шаг
   int step=1;
   switch(scale)
     {
      case 0:
         step=27;
         break;
      case 1:
         step=14;
         break;
      case 2:
         step=7;
         break;
      case 3:
         step=4;
         break;
      case 4:
         step=2;
         break;
     }
//--- создадим рисунки для значений High и Low баров (с промежутками)
   for(int i=0;i<bars;i+=step)
     {
      //--- создаем рисунки
      if(!BitmapCreate(0,"Bitmap_"+(string)i,0,date[i],close[i],InpFile,InpWidth,InpHeight,InpXOffset,
         InpYOffset,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
        {
         return;
        }
      //--- проверим факт принудительного завершения скрипта
      if(IsStopped())
         return;
      //--- перерисуем график
      ChartRedraw();
      // задержка в 0.05 секунды
      Sleep(50);
     }
//--- задержка в полсекунды
   Sleep(500);
//--- удалим значки "Sell"
   for(int i=0;i<bars;i+=step)
     {
      if(!BitmapDelete(0,"Bitmap_"+(string)i))
         return;
      if(!BitmapDelete(0,"Bitmap_"+(string)i))
         return;
      //--- перерисуем график
      ChartRedraw();
      // задержка в 0.05 секунды
      Sleep(50);
     }
//---
  }