При программном переименовании объектов генерируется событие CHARTEVENT_OBJECT_DELETE

 

Особенность, можно сказать, из серии "Филосифия mql4" (не проверял на mt5). Если кто-то в алгоритме планирует обработку CHARTEVENT_OBJECT_DELETE и в коде будет программное переименование графических объектов, то следует учитывать этот нюанс...

Вот код индикатора, в котором отлавливается событие CHARTEVENT_OBJECT_DELETE:

int OnInit() {
//--- indicator buffers mapping
   ChartSetInteger(0, CHART_EVENT_OBJECT_DELETE, true);
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
   Comment("");
}


void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
//---
   if(id == CHARTEVENT_OBJECT_DELETE) {
      printf("Object %s deleted",sparam);
   }
}

Вот простой скрипт, который просто устанавливает новое имя для трендовых линий:

void OnStart() {
//---
int total = ObjectsTotal(0,0,OBJ_TREND);
   for(int i = 0; i < total; i++){
      string name = ObjectName(0,i,0,OBJ_TREND);
      ObjectSetString(0,name,OBJPROP_NAME,name+name);
   }
}


Если переименовывать руками, то событие CHARTEVENT_OBJECT_DELETE не генерируется терминалом. А вот если программно, то генерируется. Мечта дня - чтобы это убрали)


Есть ли какая-то возможность узнать кто изменил графический объект: это были чьи-то руки или это был алгоритм? Это так же пригодится для отсечения лишних дополнительных циклов при наличии обработки CHARTEVENT_OBJECT_CHANGE (когда что-то меняется алгоритмом, то это событие, как я понял, так же генерируется... и нужно флаги всякие добавлять)

 
Yevhenii Levchenko:

Особенность, можно сказать, из серии "Филосифия mql4" (не проверял на mt5). Если кто-то в алгоритме планирует обработку CHARTEVENT_OBJECT_DELETE и в коде будет программное переименование графических объектов, то следует учитывать этот нюанс...

Вот код индикатора, в котором отлавливается событие CHARTEVENT_OBJECT_DELETE:

Вот простой скрипт, который просто устанавливает новое имя для трендовых линий:


Если переименовывать руками, то событие CHARTEVENT_OBJECT_DELETE не генерируется терминалом. А вот если программно, то генерируется. Мечта дня - чтобы это убрали)


Есть ли какая-то возможность узнать кто изменил графический объект: это были чьи-то руки или это был алгоритм? Это так же пригодится для отсечения лишних дополнительных циклов при наличии обработки CHARTEVENT_OBJECT_CHANGE (когда что-то меняется алгоритмом, то это событие, как я понял, так же генерируется... и нужно флаги всякие добавлять)

Когда-то давно, было в документации написано, что при переименовании объекта происходит удаление и новое построение объекта с новым именем. Сейчас при беглом просмотре документации я этого не нашёл. Возможно на форуме кто-то их разработчиков это объяснял. 

А по хорошему при удалении объекта надо проверять его имя, а не просто печатать его. Событие работает не просто так. Удалили какой либо объект, сработало событие, проверили имя, и при совпадении имени с заданным выполнили тот или иной код. Тогда не будет никакой непредвиденной реакции.

 

Alexey Viktorov #:

Тогда не будет никакой непредвиденной реакции.

Ее и так не будет, когда узнал, что она есть :)

Причина обращения: