Проблема с CHARTEVENT_CHART_CHANGE

 

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

Пишу небольшую панель для некоторых операций. Благодаря событию CHARTEVENT_CHART_CHANGE отлавливаю момент, когда изменяется размер окна графика, и корректирую координаты панели, чтобы она была в зоне видимости (не вылазила за пределы окна графика). Но событие CHARTEVENT_CHART_CHANGE так же срабатывает, когда просто переключаешься на соседний график, и этот момент берутся размеры окна уже с того графика, на который переключился. Как следствие - у панели меняются координаты, хотя этого не должно происходить.

Вопрос: как разделить событие CHARTEVENT_CHART_CHANGE на:

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

2) ту часть, когда переключаешься на соседний график

Т.е. как кодом отделить одно от другого?

 
satorifx:

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

Скорее всего у вас в коде ошибка. OnChartEvent это события текущего чарта, а не какого-то другого.

 

Потеря фокуса тоже является событием графика. Я не проверял, но при необходимости в первую очередь проверил-бы именно это

   if(!ChartGetInteger(ChartID(), CHART_BRING_TO_TOP)) 
 
Alexey Viktorov #:

Потеря фокуса тоже является событием графика. Я не проверял, но при необходимости в первую очередь проверил-бы именно это

фокус теряется до такой степени что присылает размеры другого чарта?)

пс. хотя Рождество - возможно всё.
 
Alexey Viktorov #:

Потеря фокуса тоже является событием графика. Я не проверял, но при необходимости в первую очередь проверил-бы именно это

Супер! Сработало на ура! Низкий поклон, Алексей.
 
satorifx #:
Супер! Сработало на ура! Низкий поклон, Алексей.

Расскажите что сработало?
Интересно ведь.

пробовал переключать чарты и в МТ5 и в МТ4 - размеры чарта не изменяются

 
Taras Slobodyanik #:

Расскажите что сработало?
Интересно ведь.

пробовал переключать чарты и в МТ5 и в МТ4 - размеры чарта не изменяются

при переключении на другой чарт, происходит событие CHARTEVENT_CHART_CHANGE.
при возвращение на чарт, происходит два события CHARTEVENT_CHART_CHANGE.

int OnInit() {
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) {
   return(rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   if (id ==CHARTEVENT_CHART_CHANGE) {
      Print("new CHARTEVENT_CHART_CHANGE");
   }

}
 
Nikolai Semko #:

при переключении на другой чарт, происходит событие CHARTEVENT_CHART_CHANGE.
при возвращение на чарт, происходит два события CHARTEVENT_CHART_CHANGE.

как это изменяет размер чарта?

satorifx:

Пишу небольшую панель для некоторых операций. Благодаря событию CHARTEVENT_CHART_CHANGE отлавливаю момент, когда изменяется размер окна графика, и корректирую координаты панели, чтобы она была в зоне видимости (не вылазила за пределы окна графика). 

вангую что человек вернется назад с этим вопросом когда оживут котировки, а его панели не будут обновляться правильно в разных окнах :)

 


Taras Slobodyanik #
:

как это изменяет размер чарта?


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Nikolai Semko, 2021.12.26 11:17

Что удалось выяснить:

  • при переключении окон ресурс не удаляется
  • при переключении окон происходит событие CHARTEVENT_CHART_CHANGE, так как меняется размер окна на размер окна предыдущих установок размера "не на все окно", т.е. словно окно перешло в такой режим
  • целесообразно контролировать активность окна (ChartGetInteger(0, CHART_BRING_TO_TOP)) и выключать формирование битмапа (заполнять канвас) для экономии ресурсов работы процессора в случае неактивности окна


В тестовом индикаторе счетчик сохраняется в ресурсе канваса.


 
Nikolai Semko #:

так это же очевидная Ваша ошибка - использование одного и того же ресурса на многих чартах во многих индикаторах.
ваши индикаторы (или ЕА) не работают если окно не активно - то есть пользователь не сможет использовать несколько копий одновременно на разных чартах.

пс. ну и следовательно - у автора темы не будут работать панели, благодаря вашему совету :)

 
Alexey Viktorov #:

Потеря фокуса тоже является событием графика. Я не проверял, но при необходимости в первую очередь проверил-бы именно это

Сюрприз может крыться в ChartID() vs 0 vs <заранее сохранённый id> в аргументе. При переключении чартов в момент "последнего прости", в последнем OnChartEvent могут быть нюансы :-) 

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