Не удалось создать текстовую метку. Помогите разобраться пожалуйста

 
Добрый день, помогите пожалуйста разобраться в индикаторе
в OnCalculate

есть код: 
      Label(0,"Menuel0",0,233,1,CORNER_LEFT_UPPER,"Меню","Tahoma",8,White,0.0,ANCHOR_LEFT_UPPER,false,false,true,0);
где:
"Menuel0" - OBJ_LABEL

так вот, в ЭКСПЕРТАХ через промежуток времени, каждый раз выходит сообщение:

2019.07.12 23:02:01.066 test GBPUSD,H4: Label: Код ошибки = 4200
Как я понял она означает что уже создана текстовая метка


Что делать? как избавиться от этого не удалив просто Print

Может нужно как то проверить создана она или нет, и если не создана создать её. Подскажите как правильно. Спасибо

bool Label(const long              chart_ID=0,               // ID графика
                 const string            name="Label",             // имя метки
                 const int               sub_window=0,             // номер подокна
                 const int               x=0,                      // координата по оси X
                 const int               y=0,                      // координата по оси Y
                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                 const string            text="Label",             // текст
                 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)                // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим текстовую метку
   if(!ObjectCreate(chart_ID,name,OBJ_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_CORNER,corner);
//--- установим текст
   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);
  }
 
ares96:
Добрый день, помогите пожалуйста разобраться в индикаторе
в OnCalculate

есть код: 
где:

так вот, в ЭКСПЕРТАХ через промежуток времени, каждый раз выходит сообщение:

2019.07.12 23:02:01.066 test GBPUSD,H4: Label: Код ошибки = 4200
Как я понял она означает что уже создана текстовая метка


Что делать? как избавиться от этого не удалив просто  Print

Может нужно как то проверить создана она или нет, и если не создана создать её. Подскажите как правильно. Спасибо

Всё зависит от задачи. Функция Label(...)в Вашем коде пытается постоянно создать объект, но при её вызове имя у него не меняется и всегда = "Menuel0". Соответственно нужно либо удалять объект "Menuel0" перед вызовом функции, либо придумать уникальное имя которое не будет повторятся, например "Menuel1".

Если же Вы просто хотите изменить объект(например изменить текст метки) то лучше создать его один раз, например в OnInit(),а потом просто менять его свойства.

 
Sergey Kolemanov:

Всё зависит от задачи. Функция Label(...)в Вашем коде пытается постоянно создать объект, но при её вызове имя у него не меняется и всегда = "Menuel0". Соответственно нужно либо удалять объект "Menuel0" перед вызовом функции, либо придумать уникальное имя которое не будет повторятся, например "Menuel1".

Если же Вы просто хотите изменить объект(например изменить текст метки) то лучше создать его один раз, например в OnInit(),а потом просто менять его свойства.

Самый лучший вариант, перед созданием проверить существование объекта с таким именем. Зачем удалять и создавать новый? Какой в этом смысл???

 
Спасибо всем кто отписался, подскажите пожалуйста как сделать:
проверить существование объекта с таким именем.
 
ares96:
Спасибо всем кто отписался, подскажите пожалуйста как сделать:

Привет. Можно через функцию.

ObjectFind - Графические объекты - Справочник MQL4
ObjectFind - Графические объекты - Справочник MQL4
  • docs.mql4.com
Функция возвращает индекс окна, которому принадлежит искомый объект. В случае неудачи функция вернет -1. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError(). При использовании варианта функции без указания идентификатора графика подразумевается работа с собственным графиком и осуществляется прямой...
 
Спасибо, подскажите почему при нажатии на какую либо кнопку в индикаторе снова появляется текст:
2019.07.12 23:02:01.066 test GBPUSD,H4: Label: Код ошибки = 4200

Что лучше всего сделать?
 
ares96:
Спасибо, подскажите почему при нажатии на какую либо кнопку в индикаторе снова появляется текст:

Что лучше всего сделать?

Проще перед ObjectCreate() написать строчку:

ObjectDelete(chart_ID, name);
 
Alexey Viktorov:

Самый лучший вариант, перед созданием проверить существование объекта с таким именем. Зачем удалять и создавать новый? Какой в этом смысл???

Я же написал что всё зависит от того, что требуется ТС, а коли он неудосужился объяснить алгоритм я и привёл возможные решения. Проверять существование объекта это само собой обязательно. Удалять и создавать новый нужно например в случае когда есть необходимость скрыть / развернуть созданную панель
 

Проверять не обязательно, т.к. это же происходит при попытке создания нового объекта. Вместо ObjectFind() можно так:

void Text(int i,string text="",color Color=EMPTY_VALUE,int Anch=ANCHOR_RIGHT_UPPER,int shift=0)
{
   string name=obj_pref+IntegerToString(i);
   if(ObjectCreate(0,name,OBJ_LABEL,0,0,0))
   {
   ObjectSetInteger(0,name,OBJPROP_CORNER,Corn);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,4+shift);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,(i+1)*(int)(FS*1.4)+2);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
   ObjectSetString (0,name,OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FS);
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,Anch);
   }
   ObjectSetInteger(0,name,OBJPROP_COLOR,Color==EMPTY_VALUE?CL:Color);
   ObjectSetString (0,name,OBJPROP_TEXT,text);
}

Смысл в том, что (для данного примера) текст и цвет может меняться, а остальное - нет. Если создание с ошибкой (т.е. метка уже есть) изменить цвет и текст. 

В вашем случае, вместо удаления можно привязку сделать за видимой областью.

Удаление может создать моргание. Не приятно для глаз ;)