Объекты находятся там, где их нет. Почему?

 

Вот скрин:

Здесь видно, что индикатор, который работает на этом окне отрисовал прямоугольник. Я специально выбрал самый простой паттерн, чтобы продемонстрировать то, что я хочу уточнить.

Так вот, если двигаться от реального времени в историю, имеется прямоугольник по двум свечам и рядом подпись DBLHC. Как я понимаю, до этого паттерна DBLHC больше объектов на графике нет. Их реально нет. я для определённых экспериментов запускаю скрипт, чтобы вывести в журнал объекты, которые можно увидеть за, допустим, 9 свечей.

void OnStart() {
//---
  string objName = "";

   for (int i = 0; i < 9; i++) {
     objName = ObjectName(i);
     if (objName == "") continue;
//     Print("Time[", i, "] = " + Time[i]);
     Print("Time[", i, "] = ", Time[i], " :: объект ", objName, " на индексе ", i);
   }
}

Реазультат меня удивил. Вот, что я увидел:

2019.11.05 12:07:53.516 Script FindObjects USDCAD,M5: removed
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: uninit reason 0
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: Time[8] = 2019.11.05 10:25:00 :: îáúåêò PAPATTERN_DB__1_1572826200 íà èíäåêñå 8
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: Time[7] = 2019.11.05 10:30:00 :: îáúåêò PAPATTERN_DB__1_1572650700 íà èíäåêñå 7
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: Time[6] = 2019.11.05 10:35:00 :: îáúåêò PAPATTERN_DB__1_1572649800 íà èíäåêñå 6
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: Time[5] = 2019.11.05 10:40:00 :: îáúåêò PAPATTERN_DB__1_1572648900 íà èíäåêñå 5
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: Time[4] = 2019.11.05 10:45:00 :: îáúåêò PAPATTERN_DB__1_1572645000 íà èíäåêñå 4
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: Time[3] = 2019.11.05 10:50:00 :: îáúåêò PAPATTERN_DB__1_1572642600 íà èíäåêñå 3
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: Time[2] = 2019.11.05 10:55:00 :: îáúåêò PAPATTERN_DB__1_1572639900 íà èíäåêñå 2
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: Time[1] = 2019.11.05 11:00:00 :: îáúåêò PAPATTERN_DB__1_1572636300 íà èíäåêñå 1
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: Time[0] = 2019.11.05 11:05:00 :: îáúåêò PAPATTERN_DB__1_1572630300 íà èíäåêñå 0
2019.11.05 12:07:53.514 FindObjects USDCAD,M5: initialized
2019.11.05 12:07:53.503 Script myTests\FindObjects USDCAD,M5: loaded successfully
По таймингу видно, что, якобы, находятся объекты на каждом баре. Как это понимать? Там их реально нет.
 
Viktar Dzemikhau:

Вот скрин:

Здесь видно, что индикатор, который работает на этом окне отрисовал прямоугольник. Я специально выбрал самый простой паттерн, чтобы продемонстрировать то, что я хочу уточнить.

Так вот, если двигаться от реального времени в историю, имеется прямоугольник по двум свечам и рядом подпись DBLHC. Как я понимаю, до этого паттерна DBLHC больше объектов на графике нет. Их реально нет. я для определённых экспериментов запускаю скрипт, чтобы вывести в журнал объекты, которые можно увидеть за, допустим, 9 свечей.

Реазультат меня удивил. Вот, что я увидел:

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

ObjectName(i) выдаёт i-ый объект по счёту. Не по свече.

Время объекта (смотря что за объект, какое время смотреть), ObjectGetInteger(chart,object,OBJPROP_TIME1)

надо сравнивать это время со временем свечи

 
Viktar Dzemikhau:

Вот скрин:

Здесь видно, что индикатор, который работает на этом окне отрисовал прямоугольник. Я специально выбрал самый простой паттерн, чтобы продемонстрировать то, что я хочу уточнить.

Так вот, если двигаться от реального времени в историю, имеется прямоугольник по двум свечам и рядом подпись DBLHC. Как я понимаю, до этого паттерна DBLHC больше объектов на графике нет. Их реально нет. я для определённых экспериментов запускаю скрипт, чтобы вывести в журнал объекты, которые можно увидеть за, допустим, 9 свечей.

Реазультат меня удивил. Вот, что я увидел:

По таймингу видно, что, якобы, находятся объекты на каждом баре. Как это понимать? Там их реально нет.
void OnStart() {
//---
  string objName = "";

   for (int i = 0; i < 9; i++) 
   {
     objName = ObjectName(i);
     if (objName != "")
     запрос времени обьекта по имени обьекта //Print("Time[", i, "] = ", Time[i], " :: объект ", objName, " на индексе ", i);
   }
}

Проверьте по имени, а не по пустому имени...

Вы берете номер свечи по порядку 1,2,3,4 ....  И берете имя обьекта по порядку.... по этому у Вас так и получается....   Нет никакой связи между тем как называется обьект и временем свечи по порядку....

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

 
Vladimir Pastushak:

Проверьте по имени, а не по пустому имени...

Вы берете номер свечи по порядку 1,2,3,4 ....  И берете имя обьекта по порядку.... по этому у Вас так и получается....   Нет никакой связи между тем как называется обьект и временем свечи по порядку....

Хотя да. Поздно вчера занялся этим, не учёл, что там не по индексу в таймсерии, а по индексу в перечне всех объектов ищется.


Maxim Kuznetsov:

ObjectName(i) выдаёт i-ый объект по счёту. Не по свече.

Время объекта (смотря что за объект, какое время смотреть), ObjectGetInteger(chart,object,OBJPROP_TIME1)

надо сравнивать это время со временем свечи

Хм. Получается, я вижу решение вопроса лишь как добавить (в индюке, которые отрисовывает паттерны или ещё в чём-либо, что их отрисовывает) в имя объекта время появления бара, на котором определённый объект появился и дальше уже брать время открытия бара и сравнивать его с временем открытия объекта. Тогда будет точно всё находится. Кроме того, конечно, можно сравнить ещё и по названию паттерна и ещё какие-то данные в имя поместить.
 

Только что я переписал скрипт. Вот он:

void OnStart() {
//---
  string objName = "";
  datetime objTime;

   for (int i = 0; i < 17; i++) {
     objName = ObjectName(i);
     objTime = (datetime)ObjectGetInteger(0, objName, OBJPROP_TIME);
     Print("objName = ", objName);
     Print("objTime = ", objTime);
     if (Time[i] != objTime) continue;

     for (int obj = ObjectsTotal() - 1; obj == 0; obj--) {
       Print("i = ", i, " " , StrToTime(StringSubstr(objName, 11)));
     }
   }

}

Всё-таки есть какие-то странности. Вот скрин:

В журнале вот что:

2019.11.05 17:29:30.617 Script FindObjects USDCAD,M1: removed
2019.11.05 17:29:30.615 FindObjects USDCAD,M1: uninit reason 0

2019.11.05 17:29:30.615 FindObjects USDCAD,M1: objTime = 2019.11.05 16:18:00
2019.11.05 17:29:30.615 FindObjects USDCAD,M1: objName = PAPATTERN_DB__2_1572970740
2019.11.05 17:29:30.615 FindObjects USDCAD,M1: objTime = 2019.11.05 16:05:00
2019.11.05 17:29:30.615 FindObjects USDCAD,M1: objName = PAPATTERN_DB__2_1572969900
2019.11.05 17:29:30.615 FindObjects USDCAD,M1: objTime = 2019.11.05 16:17:00
2019.11.05 17:29:30.615 FindObjects USDCAD,M1: objName = PAPATTERN_DB__1_1572970740
2019.11.05 17:29:30.615 FindObjects USDCAD,M1: objTime = 2019.11.05 16:04:00
2019.11.05 17:29:30.615 FindObjects USDCAD,M1: objName = PAPATTERN_DB__1_1572969900
2019.11.05 17:29:30.615 FindObjects USDCAD,M1: initialized
2019.11.05 17:29:30.595 Script myTests\FindObjects USDCAD,M1: loaded successfully
Вопрос на скрине. На самом последнем баре, на котором отрисован прямоугольник, согласно принту типа нет объекта. Почему?
 

У Вас два прямоугольника.

Прямоугольник имеет две точки времени.

Два прямоугольника == 4 точки времени. Вы получили 4 принта.

 
Вы бы написали четко что хотите сделать....
 
Vladimir Pastushak:

У Вас два прямоугольника.

Прямоугольник имеет две точки времени.

Два прямоугольника == 4 точки времени. Вы получили 4 принта.

Да. Последний треугольник отрисован по барам с временами открытия от 16:17 по 16:19. Т.е. 1-ая точка 16:17, а 2-ая точка 16:19. Между ними есть бар 16:18, который между 1-ым и последним баром. По логике, должно было принтануться 2 точки крайние 1-ая = 16:17 и 2-ая = 16:19, а, на самом деле, в журнале 16:17 и 16:18, хотя 16:18 не должна принтоваться, так как это не начальный и не конечный бар, по которым отрисован треугольник.

 
Vladimir Pastushak:
Вы бы написали четко что хотите сделать....
Да, я хочу понять как оптимально и надёжно решить вопрос, с нахождением объекта в индикаторе. Если объект имеется, но нужно его удалить целиком и перерисовать. Такие ситуации бывают. Если с буферами всё понятно. Буфер, находящийся на каком-то экстремуме можно очистить, и переписать, а с объектом не так. Вот я на скрипте и экспериментирую..