Можно ли получить список объектов в порядке их отрисовки?

 

Возникла задача получить список объектов, которые создал индюк. Индюк скомпилирован, соответственно, у меня нет доступа к исходному коду. Логика там очень суровая, поэтому писать я подобное щяс точно не хочу. Разве что чутка позже. Так вот. Индюк рисует горизонтальные линии в определённые моменты. Мне нужно иметь возможность получить последнюю или предпоследнюю линию, её тип и другие свойства.

Я написал скрипт что бы проверить, какие имено объектов можно вывести пройдясь по всем индекса объектов до последнего. Ограничился типом линий OBJ_VLINE.

void OnStart() {
  int objCounts = ObjectsTotal(OBJ_VLINE);
  Print("objCounts = ", objCounts);
  string objName = "";
  
  for (int obj = 0; obj < objCounts; obj++) {
    objName = ObjectName(obj);
    if (ObjectType(objName) != OBJ_VLINE) continue;
    Print("obj = ", obj, " ; objType = ", ObjectType(objName), " ; objName = ", objName);
  }
}

В журнале вижу:

2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 650 ; objType = 0 ; objName = #i-fma_sar-new_TREND_UP___2018.09.11 09:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 649 ; objType = 0 ; objName = #i-fma_sar-new_TREND_UP___2018.09.05 16:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 648 ; objType = 0 ; objName = #i-fma_sar-new_TREND_UP___2018.08.31 09:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 647 ; objType = 0 ; objName = #i-fma_sar-new_TREND_UP___2018.08.24 18:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 646 ; objType = 0 ; objName = #i-fma_sar-new_TREND_UP___2018.08.15 21:15
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 645 ; objType = 0 ; objName = #i-fma_sar-new_TREND_UP___2018.07.09 09:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 644 ; objType = 0 ; objName = #i-fma_sar-new_TREND_UP___2018.06.12 09:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 643 ; objType = 0 ; objName = #i-fma_sar-new_TREND_UP___2018.04.09 10:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 642 ; objType = 0 ; objName = #i-fma_sar-new_TREND_DN___2018.09.10 05:45
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 641 ; objType = 0 ; objName = #i-fma_sar-new_TREND_DN___2018.08.31 16:30
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 640 ; objType = 0 ; objName = #i-fma_sar-new_TREND_DN___2018.08.30 17:30
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 639 ; objType = 0 ; objName = #i-fma_sar-new_TREND_DN___2018.08.23 21:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 638 ; objType = 0 ; objName = #i-fma_sar-new_TREND_DN___2018.08.10 10:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 637 ; objType = 0 ; objName = #i-fma_sar-new_TREND_DN___2018.08.10 08:45
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 636 ; objType = 0 ; objName = #i-fma_sar-new_TREND_DN___2018.06.19 09:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 635 ; objType = 0 ; objName = #i-fma_sar-new_TREND_DN___2018.05.24 16:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: obj = 634 ; objType = 0 ; objName = #i-fma_sar-new_TREND_DN___2018.03.26 17:00
2018.09.19 18:46:55.359 readCommentsFromObjects #GDAXI,H1: objCounts = 651

Если присмотреться, можно увидеть, что в имени объектов в конце присутствует дата и время создания объекта. Но очерёдность какая-то левая. Т.е. не в очерёдность создания объектов в порядке следования баров к самому последнему.. а в разброс. Например, можно видеть по 2-м выделенным жёлтым цветов в журнале данным.

По нормальному они должны быть рядом, а не в разброс. Это если посмотреть на реальные данные, в том числе, и на график можно понять. Но объекты в цикле от 0 до ObjectsTotal() какие-то не упорядоченные. Как это вообще поправить? И зачем такое нужно вообще?

 
Viktar Dzemikhau:

Возникла задача получить список объектов, которые создал индюк. Индюк скомпилирован, соответственно, у меня нет доступа к исходному коду. Логика там очень суровая, поэтому писать я подобное щяс точно не хочу. Разве что чутка позже. Так вот. Индюк рисует горизонтальные линии в определённые моменты. Мне нужно иметь возможность получить последнюю или предпоследнюю линию, её тип и другие свойства.

Я написал скрипт что бы проверить, какие имено объектов можно вывести пройдясь по всем индекса объектов до последнего. Ограничился типом линий OBJ_VLINE.

В журнале вижу:

Если присмотреться, можно увидеть, что в имени объектов в конце присутствует дата и время создания объекта. Но очерёдность какая-то левая. Т.е. не в очерёдность создания объектов в порядке следования баров к самому последнему.. а в разброс. Например, можно видеть по 2-м выделенным жёлтым цветов в журнале данным.

По нормальному они должны быть рядом, а не в разброс. Это если посмотреть на реальные данные, в том числе, и на график можно понять. Но объекты в цикле от 0 до ObjectsTotal() какие-то не упорядоченные. Как это вообще поправить? И зачем такое нужно вообще?

  Кроме даты и времени в имени объекта ещё есть направление (TREND_UP  TREND_DN). Вероятно индикатор строит сначала линии UP, а затем DN. Если хотите получить упорядоченный список, то надо из имени выделять время, а потом повозиться с сортировкой.

 
Из распечатки очевидно, что объекты отсортированы по имени.  Это логично, т.к. оно необходимо для быстрого поиска объекта по его имени (а не перебором)
 
Alexey Navoykov:
Из распечатки очевидно, что объекты отсортированы по имени.  Это логично, т.к. оно необходимо для быстрого поиска объекта по его имени (а не перебором)

Это понятно. Но, навряд ли, индикатор их сортирует. Странно, что нет нативных средств для перебора объектов, как типа в таймсерии. Это вполне логично и удобно было бы. А так чувствую придётся писать алгоритм сортировки, что является дополнительным головняком.

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

 
Aleksandr Prozorov:

  Кроме даты и времени в имени объекта ещё есть направление (TREND_UP  TREND_DN). Вероятно индикатор строит сначала линии UP, а затем DN. Если хотите получить упорядоченный список, то надо из имени выделять время, а потом повозиться с сортировкой.

Я тоже подумал о сортировке. Либо ещё вариант,  раз сортировать, а дальше всё что дальше чем какое-то колено удалять из массива. Дальше мониторить последний отрисованный объект и, если он появился, то добавлять в рабочий массив с необходимым количеством объектов. Но мне такой вариант не нравится. Странно, что нативно нет вообще никакой сортировки. Это даже не странно, а удивительно.
 
Aleksandr Prozorov:

Если хотите получить упорядоченный список, то надо из имени выделять время, а потом повозиться с сортировкой.

Время выделять не обязательно, если оно является временем созданием объекта.  Просто получаем свойство OBJPROP_CREATETIME.  Хотя не знаю, что работает быстрее.

 

Имена объектов все однотипные и понятные.
Можно просто перебирать бары, и на каждом баре проверять наличие линии (так же как вершины в зигзаге).
Хотя в МТ5 это будет медленнее, чем в МТ4.

(быстрее отсортировать)

 
Alexey Navoykov:

Время выделять не обязательно, если оно является временем созданием объекта.  Просто получаем свойство OBJPROP_CREATETIME.  Хотя не знаю, что работает быстрее.

Это да. Я тоже это увидел в перечне функций

Taras Slobodyanik:

Имена объектов все однотипные и понятные.
Можно просто перебирать бары, и на каждом баре проверять наличие линии (так же как вершины в зигзаге).
Хотя в МТ5 это будет медленнее, чем в МТ4.

(быстрее отсортировать)

Так по-барово проверить наличие объекта на каждом, вроде как не возможно. Я не встретил такой функции. Разве что перебор всех по циклу от 0 до ObjectsTotal(). Но к барам так не привязаться никак..
 
Viktar Dzemikhau:

Это да. Я тоже это увидел в перечне функций

Так по-барово проверить наличие объекта на каждом, вроде как не возможно. Я не встретил такой функции. Разве что перебор всех по циклу от 0 до ObjectsTotal(). Но к барам так не привязаться никак..

Есть время открытия бара и есть время создания объекта, и наконец, есть iBarShift()

 
Viktar Dzemikhau:

Это понятно. Но, навряд ли, индикатор их сортирует. Странно, что нет нативных средств для перебора объектов, как типа в таймсерии. Это вполне логично и удобно было бы. А так чувствую придётся писать алгоритм сортировки, что является дополнительным головняком.

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

Имя объекта формируется последовательно. 

Вертикальные линии (VLINE) не соответствуют затеянной Вами ветке и вносят свой сумбур. Она ведь вертикальная,- только от времени зависит; а разместить ее можно когда угодно... 

 
Viktar Dzemikhau:

Так по-барово проверить наличие объекта на каждом, вроде как не возможно. Я не встретил такой функции. Разве что перебор всех по циклу от 0 до ObjectsTotal(). Но к барам так не привязаться никак..

так а что мешает сгенерировать самому имя для линии, и проверить наличие объекта на баре?

objName = #i-fma_sar-new_TREND_UP___2018.09.11 09:00

то есть
имя = "#i-fma_sar-new_TREND_UP___"+время бара
имя = "#i-fma_sar-new_TREND_DN___"+время бара

и ищем объект по имени 

if(ObjectFind(сhartID,имя)>=0)