233 lines
No EOL
21 KiB
MQL5
233 lines
No EOL
21 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| GraphFunction.mqh |
|
|
//| Copyright 2021, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2021, MetaQuotes Ltd."
|
|
#property link "https://www.mql5.com"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Создает горизонтальную линию |
|
|
//+------------------------------------------------------------------+
|
|
bool HLineCreate(const long chart_ID=0, // ID графика
|
|
const string name="HLine", // имя линии
|
|
const int sub_window=0, // номер подокна
|
|
double price=0, // цена линии
|
|
const color clr=clrRed, // цвет линии
|
|
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
|
|
const int width=1, // толщина линии
|
|
const string tooltip="", // всплывающая подсказка
|
|
const bool back=false, // на заднем плане
|
|
const bool selection=true, // выделить для перемещений
|
|
const bool hidden=true, // скрыт в списке объектов
|
|
const long z_order=0) // приоритет на нажатие мышью
|
|
{
|
|
//--- если цена не задана, то установим ее на уровне текущей цены Bid
|
|
if(!price)
|
|
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
|
|
//--- сбросим значение ошибки
|
|
ResetLastError();
|
|
//--- создадим горизонтальную линию
|
|
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
|
|
{
|
|
Print(__FUNCTION__,
|
|
": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError());
|
|
return(false);
|
|
}
|
|
//--- установим цвет линии
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
|
|
//--- установим стиль отображения линии
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
|
|
//--- установим толщину линии
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
|
|
//--- отобразим на переднем (false) или заднем (true) плане
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
|
|
//--- включим (true) или отключим (false) режим перемещения линии мышью
|
|
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
|
|
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
|
|
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
|
|
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);
|
|
//--- успешное выполнение
|
|
|
|
if (StringLen(tooltip))
|
|
{
|
|
ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,tooltip);
|
|
}
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Перемещение горизонтальной линии |
|
|
//+------------------------------------------------------------------+
|
|
bool HLineMove(const long chart_ID=0, // ID графика
|
|
const string name="HLine", // имя линии
|
|
double price=0) // цена линии
|
|
{
|
|
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
|
|
if(!price)
|
|
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
|
|
//--- сбросим значение ошибки
|
|
ResetLastError();
|
|
//--- переместим горизонтальную линию
|
|
if(!ObjectMove(chart_ID,name,0,0,price))
|
|
{
|
|
Print(__FUNCTION__,
|
|
": не удалось переместить горизонтальную линию! Код ошибки = ",GetLastError());
|
|
return(false);
|
|
}
|
|
//--- успешное выполнение
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Удаляет горизонтальную линию |
|
|
//+------------------------------------------------------------------+
|
|
bool HLineDelete(const long chart_ID=0, // ID графика
|
|
const string name="HLine") // имя линии
|
|
{
|
|
//--- сбросим значение ошибки
|
|
ResetLastError();
|
|
//--- удалим горизонтальную линию
|
|
if(!ObjectDelete(chart_ID,name)&&(GetLastError()!=4202))
|
|
{
|
|
Print(__FUNCTION__,
|
|
": не удалось удалить горизонтальную линию! Код ошибки = ",GetLastError());
|
|
return(false);
|
|
}
|
|
//--- успешное выполнение
|
|
return(true);
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Создает объект "Текст" |
|
|
//+------------------------------------------------------------------+
|
|
bool TextCreate(const long chart_ID=0, // ID графика
|
|
const string name="Text", // имя объекта
|
|
const int sub_window=0, // номер подокна
|
|
datetime time=0, // время точки привязки
|
|
double price=0, // цена точки привязки
|
|
const string text="Text", // сам текст
|
|
const string font="Arial", // шрифт
|
|
const int font_size=10, // размер шрифта
|
|
const color clr=clrRed, // цвет
|
|
const double angle=0.0, // наклон текста
|
|
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
|
|
const bool back=false, // на заднем плане
|
|
const bool selection=false, // выделить для перемещений
|
|
const bool hidden=true, // скрыт в списке объектов
|
|
const long z_order=0) // приоритет на нажатие мышью
|
|
{
|
|
//--- установим координаты точки привязки, если они не заданы
|
|
ChangeTextEmptyPoint(time,price);
|
|
//--- сбросим значение ошибки
|
|
ResetLastError();
|
|
//--- создадим объект "Текст"
|
|
if(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price))
|
|
{
|
|
Print(__FUNCTION__,
|
|
": не удалось создать объект \"Текст\"! Код ошибки = ",GetLastError());
|
|
return(false);
|
|
}
|
|
//--- установим текст
|
|
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
|
|
//--- установим шрифт текста
|
|
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
|
|
//--- установим размер шрифта
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
|
|
//--- установим угол наклона текста
|
|
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
|
|
//--- установим способ привязки
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
|
|
//--- установим цвет
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
|
|
//--- отобразим на переднем (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 TextMove(const long chart_ID=0, // ID графика
|
|
const string name="Text", // имя объекта
|
|
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 TextChange(const long chart_ID=0, // ID графика
|
|
const string name="Text", // имя объекта
|
|
const string text="Text") // текст
|
|
{
|
|
//--- сбросим значение ошибки
|
|
ResetLastError();
|
|
//--- изменим текст объекта
|
|
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
|
|
{
|
|
Print(__FUNCTION__,
|
|
": не удалось изменить текст! Код ошибки = ",GetLastError());
|
|
return(false);
|
|
}
|
|
//--- успешное выполнение
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Удаляет объект "Текст" |
|
|
//+------------------------------------------------------------------+
|
|
bool TextDelete(const long chart_ID=0, // ID графика
|
|
const string name="Text") // имя объекта
|
|
{
|
|
//--- сбросим значение ошибки
|
|
ResetLastError();
|
|
//--- удалим объект
|
|
if(!ObjectDelete(chart_ID,name))
|
|
{
|
|
Print(__FUNCTION__,
|
|
": не удалось удалить объект \"Текст\"! Код ошибки = ",GetLastError());
|
|
return(false);
|
|
}
|
|
//--- успешное выполнение
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Проверяет значения точки привязки и для пустых значений |
|
|
//| устанавливает значения по умолчанию |
|
|
//+------------------------------------------------------------------+
|
|
void ChangeTextEmptyPoint(datetime &time,double &price)
|
|
{
|
|
//--- если время точки не задано, то она будет на текущем баре
|
|
if(!time)
|
|
time=TimeCurrent();
|
|
//--- если цена точки не задана, то она будет иметь значение Bid
|
|
if(!price)
|
|
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
|
|
} |