Вопрос по принудительной перерисовке графика при смене инструмента/ТФ

 

Добрый день, камрады!

 

Суть проблемы: Индикатором рисую  объекты на графике - тут все работает. При смене ТФ и смене инструмента не всегда происходит перерисовка индикатора.

Видимое решение: использовать ChartRedraw().

 

Собственно вопрос: пока никак не могу найти информацию по тому, как поймать момент, когда мне нужно вызывать принудительную перерисовку графика. 

 

Прошу поделиться информацией и возможным решением, если кто-то владеет вопросом.

Может быть использовать OnChartEvent() c CHARTEVENT_CHART_CHANGE - по этому признаку перерисовывать график?  Если я прав, то прошу объяснить, как этот вариант правильно использовать - первая попытка ни к чему позитивному не привела: вычитываю событие, сравниваю с CHARTEVENT_CHART_CHANGE и в случае совпадения вызываю ChartRedraw();

 Заранее спасибо!!! 

 
Примерно так
static ENUM_TIMEFRAMES period = PERIOD_CURRENT;

if(period != PERIOD_CURRENT)
{
  period = PERIOD_CURRENT;
  ChartRedraw();
}

Проверка символа так-же.
 
Egor Murikov:

Добрый день, камрады!

 

Суть проблемы: Индикатором рисую  объекты на графике - тут все работает. При смене ТФ и смене инструмента не всегда происходит перерисовка индикатора.

Видимое решение: использовать ChartRedraw().

 ...

 Заранее спасибо!!! 

Выделенное говорит о том, что индикатор у вас не верно сделан. Ведь он при переинициализации должен сделать полный пересчёт. Он видимо не делает.

Покажите как рассчитываете?
 
Alexey Viktorov:
Примерно так
static ENUM_TIMEFRAMES period = PERIOD_CURRENT;

if(period != PERIOD_CURRENT)
{
  period = PERIOD_CURRENT;
  ChartRedraw();
}

Проверка символа так-же.

Ох, спасибо Алексей, оперативно ответ получил - не ожидал!

Вечерком сяду и проанализирую - вроде бы изящно ложится на проблему. 

 Спасибо большое! 

 
Artyom Trishkin:
Выделенное говорит о том, что индикатор у вас не верно сделан. Ведь он при переинициализации должен сделать полный пересчёт. Он видимо не делает.

Покажите как рассчитываете?

Артем, только из дома, ближе к вечеру смогу сделать

 
Доброго времени суток всем!

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

В связи с этим возникают вопросы:
1) можно ли в OnInit() принудительно подгрузить котировки по нужному символу/ТФ на заданном диапазоне времени?
2) можно ли как-то проконтролировать готовность котировок к работе?

Заранее спасибо!
 
Egor Murikov:
Доброго времени суток всем!

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

В связи с этим возникают вопросы:
1) можно ли в OnInit() принудительно подгрузить котировки по нужному символу/ТФ на заданном диапазоне времени?
2) можно ли как-то проконтролировать готовность котировок к работе?

Заранее спасибо!

CopyRates() и другие функции копирования котировок на нужном ТФ и символе запускают обновление соответствующей информации в терминале и докачку данных, если они отсутствуют. Повторять, пока не вернёт больше ноля.
 
Egor Murikov:
Доброго времени суток всем!

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

В связи с этим возникают вопросы:
1) можно ли в OnInit() принудительно подгрузить котировки по нужному символу/ТФ на заданном диапазоне времени?
2) можно ли как-то проконтролировать готовность котировок к работе?

Заранее спасибо!

Я это победил вот так, была точно такая-же проблема. Этот код в OnInit

  ArraySetAsSeries(OPEN,true);
    for(int e=0; e<5; e++) { // вот это помогло
     CopyOpen(Symbol(),Period(),0,(int)ChartGetInteger(0,CHART_WIDTH_IN_BARS,0),OPEN);
    }
 

Спасибо за ответы )

Доберусь до дома - плотно займусь в рамках рекомендаций. 

В сторону CopyRates() и иже с ней я посматривал, но почему-то они у меня не отложились в голове - наверное, устал - невнимателен был.

По результатам - отпишусь и еще раз спасибо скажу ) 

 

Просто ChartRedraw() после создания объектов. Чаще всего достаточно просто в конце OnTick(). Не важно будете переключать таймфрейм или нет. Конечно в деините тоже надо, после удаления объектов. В общем, всегда после любых действий с графическими объектами, если надо, что бы эти действия отобразились на графике тут же.

 

 
Egor Murikov:
Доброго времени суток всем!

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

В связи с этим возникают вопросы:
1) можно ли в OnInit() принудительно подгрузить котировки по нужному символу/ТФ на заданном диапазоне времени?
2) можно ли как-то проконтролировать готовность котировок к работе?

Заранее спасибо!
В ините не следует этого делать. В начале OnTick() надо делать. Желательно постоянно, на каждом тике. В случае не готовности таймфрейма, затем, после его построения производить полный перерасчет индикатора. Проверка готовности таймфрейма, а так же запуск его построение выполняется функцией Bars() (МТ5). Здесь же вопрос про МТ4? Если МТ4, то в начале OnTick() вызывать ArrayCopySeries() и проверять ошибку, если нет ошибки 4066.
Причина обращения: