А что у нас с Z-order-ом?

 

Судя по всему (в справке както сразу не нашел, если есть где - укажите плиз) в пятерке объекты "по вертикали" располагаются по мере их создания. т.е. если я напишу

ObjectCreate    (Chart_ID, Name1, OBJ_EDIT, 0, 0, 0);
ObjectCreate    (Chart_ID, Name2, OBJ_EDIT, 0, 0, 0);
ObjectCreate    (Chart_ID, Name3, OBJ_EDIT, 0, 0, 0);

то объект Name1 будет расположен в самом низу стопки объектов, Name2 будет "лежать над ним", а Name3 над двумя предыдущими. и если они будут перекрывать друг друга то, Name1 будет выглядывать из под обеих лежащих над ним.

Однако если трейдер (по ошибке) удалит объект Name1, а эксперт обнаружив удаление (разработчик обязан предусмотреть такой вариант) снова создаст его, то это будет уже четвертый созданный объект и располагаться он будет не так, как его удаленная инкарнация а с самого верху, что есть совершенно неправильно!

Вот код

//+------------------------------------------------------------------+
//|                                                      Z-Order.mq5 |
//|                           Copyright © 2006-2010, Sergey Kravchuk |
//|                                         http://forextools.com.ua |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006-2010, Sergey Kravchuk"
#property link      "http://forextools.com.ua"
#property version   "1.00"

void OnStart()
{
  string Name1 = "n1", Name2 = "n2", Name3 = "n3";

  ObjectCreate    (0, Name1, OBJ_EDIT, 0, 0, 0);
  ObjectSetInteger(0, Name1, OBJPROP_XDISTANCE, 10);
  ObjectSetInteger(0, Name1, OBJPROP_YDISTANCE, 10);
  ObjectSetInteger(0, Name1, OBJPROP_BGCOLOR, Red);  
  

  ObjectCreate    (0, Name2, OBJ_EDIT, 0, 0, 0);
  ObjectSetInteger(0, Name2, OBJPROP_XDISTANCE, 20);
  ObjectSetInteger(0, Name2, OBJPROP_YDISTANCE, 20);
  ObjectSetInteger(0, Name2, OBJPROP_BGCOLOR, Green);  
  

  ObjectCreate    (0, Name3, OBJ_EDIT, 0, 0, 0);
  ObjectSetInteger(0, Name3, OBJPROP_XDISTANCE, 30);
  ObjectSetInteger(0, Name3, OBJPROP_YDISTANCE, 30);
  ObjectSetInteger(0, Name3, OBJPROP_BGCOLOR, Blue);  
  
  ChartRedraw();
  
  MessageBox ("Удаляем и создаем снова");
  
  ObjectDelete (0, Name1);

  ObjectCreate    (0, Name1, OBJ_EDIT, 0, 0, 0);
  ObjectSetInteger(0, Name1, OBJPROP_XDISTANCE, 10);
  ObjectSetInteger(0, Name1, OBJPROP_YDISTANCE, 10);
  ObjectSetInteger(0, Name1, OBJPROP_BGCOLOR, Red);  
  
  ChartRedraw();
}

Вот так выглядит нормальное создание объектов:

До удаления 

А вот так после восстановления удаленного самого нижнего самого первого объекта:

После удаления и восстановления

неадекватно как то :(


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

Надо или вернуть старый механизм сортировки по алфавиту, или дать возможность разработчику явно задавать номер объекта в стопке по вертикали. Последнее более предпочтительно, поскольку гораздо более гибче можно управлять объектами. 

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
Причина обращения: