//+------------------------------------------------------------------+ //| 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); }