Не видит стрелку на графике

 

Всем здравия!

Удивительная проблема с графическим объектом!

Суть проблемы такова: при открытии текущей свечи на предыдущей появляется стрелка. Она не буферная. Если открыть "Список объектов", то в списке она появляется как объект только при выборе "Отобразить все". Объект - Arrow, есть имя, время, цена и код. Если я на 0-й свече кодом запускаю поиск объекта с типом Arrow и временем Time[1], то мне не находит ни одного объекта. Если же я меняю время на Time[2] и начинаю поиск стрелки через свечу после появления, то все нормально, объект находится.

В чем прикол? Я первый раз с таким встречаюсь.

Индикатор привязан к железу, выложить тут не могу

 
sportoman:

Всем здравия!

Удивительная проблема с графическим объектом!

Суть проблемы такова: при открытии текущей свечи на предыдущей появляется стрелка. Она не буферная. Если открыть "Список объектов", то в списке она появляется как объект только при выборе "Отобразить все". Объект - Arrow, есть имя, время, цена и код. Если я на 0-й свече кодом запускаю поиск объекта с типом Arrow и временем Time[1], то мне не находит ни одного объекта. Если же я меняю время на Time[2] и начинаю поиск стрелки через свечу после появления, то все нормально, объект находится.

В чем прикол? Я первый раз с таким встречаюсь.

Индикатор привязан к железу, выложить тут не могу

как гипотеза - в индикаторе не вызвали ChartRedraw после создания стрелки. Или принципиально отрисовали с небольшой задержкой (не зря-же стрелка не буферная)

попробуйте вызвать самостоятельно ChartRedraw на открытии бара и после этого на следующем входе таймера уже искать свою стрелку.

bool needFindArrow=false;

void OnInit() {

EventSetMillisecondTimer(50); // по вкусу, часто

}

void OnTick() {

if (IsNewBar()) {

ChartRedraw() ; // принудительно перерисовать чарт

                needFindArrow=true;

                return;

        }

void OnTimer() {

if (needFindArrow) {

/// ТУТ ИЩЕМ СТРЕЛКУ на Time[1]

                needFindArrow=false;

        }

}

 
Maxim Kuznetsov #:

как гипотеза - в индикаторе не вызвали ChartRedraw после создания стрелки. Или принципиально отрисовали с небольшой задержкой (не зря-же стрелка не буферная)

попробуйте вызвать самостоятельно ChartRedraw на открытии бара и после этого на следующем входе таймера уже искать свою стрелку.

bool needFindArrow=false;

void OnInit() {

EventSetMillisecondTimer(50); // по вкусу, часто

}

void OnTick() {

if (IsNewBar()) {

ChartRedraw() ; // принудительно перерисовать чарт

                needFindArrow=true;

                return;

        }

void OnTimer() {

if (needFindArrow) {

/// ТУТ ИЩЕМ СТРЕЛКУ на Time[1]

                needFindArrow=false;

        }

}

Не знаю, на тестере это поможет или надо на реале пробовать?


Забыл написать, что  точно при открытии новой свечи алерт срабатывает

 
sportoman #:

Не знаю, на тестере это поможет или надо на реале пробовать?


Забыл написать, что  точно при открытии новой свечи алерт срабатывает

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

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

 
Maxim Kuznetsov #:

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

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

ты гений!!! После обращения к буферу заработало!!!!!!!! Спасибо!!!!!!!!

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