#property strict
//--- описание
#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);
}
//---
} |