Denis Kirichenko #: Пока что выяснил, что так обрабатывается событие CHARTEVENT_CHART_CHANGE(9).
Так то естественно - при уводе фокуса с окна графика, его размеры становятся другими.
Вот тут обработка:
//--- Если график изменёнif(id==CHARTEVENT_CHART_CHANGE)
{
//--- Получаем номер подокна графика (он может измениться при удалении окна какого-либо индикатора)this.m_wnd=this.GetSubWindow();
//--- Получаем новые размеры графикаint w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
//--- Определяем выход размеров панели за пределы окна графикаthis.m_higher_wnd=this.HigherWnd();
this.m_wider_wnd=this.WiderWnd();
//--- Если высота графика изменилась - корректируем расположение панели по вертикалиif(this.m_chart_h!=h)
{
this.m_chart_h=h;
int y=this.m_y;
if(this.m_y+this.m_h>h-1)
y=h-this.m_h-1;
if(y<1)
y=1;
this.Move(this.m_x,y);
}
//--- Если ширина графика изменилась - корректируем расположение панели по горизонталиif(this.m_chart_w!=w)
{
this.m_chart_w=w;
int x=this.m_x;
if(this.m_x+this.m_w>w-1)
x=w-this.m_w-1;
if(x<1)
x=1;
this.Move(x,this.m_y);
}
}
Нужно попробовать контролировать фокус графика и не реагировать на изменения в случае, если окно графика не в фокусе. Ну или как-то ещё в том же направлении. К сожалению, я пока не могу запустить и протестировать, чтобы точно указать причины и метод устранения.
Прошёлся по форуму. Проблема уже обсуждалась. К примеру. Добавил в код такую проверку:
//--- Если график изменёнif(id==CHARTEVENT_CHART_CHANGE)
{
//--- Получаем номер подокна графика (он может измениться при удалении окна какого-либо индикатора)this.m_wnd=this.GetSubWindow();
long value;
//--- сбросим значение ошибки
::ResetLastError();
//--- получим значение свойстваif(!::ChartGetInteger(m_chart_id, CHART_BRING_TO_TOP, m_wnd, value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"Print(__FUNCTION__ + ", Error Code = ", ::GetLastError());
return;
}
// если это не показ графика поверх всех других - выходимif(value == 0)
return;//--- Получаем новые размеры графикаint w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
//--- Определяем выход размеров панели за пределы окна графикаthis.m_higher_wnd=this.HigherWnd();
this.m_wider_wnd=this.WiderWnd();
//--- Если высота графика изменилась - корректируем расположение панели по вертикалиif(this.m_chart_h!=h)
{
this.m_chart_h=h;
int y=this.m_y;
if(this.m_y+this.m_h>h-1)
y=h-this.m_h-1;
if(y<1)
y=1;
this.Move(this.m_x,y);
}
//--- Если ширина графика изменилась - корректируем расположение панели по горизонталиif(this.m_chart_w!=w)
{
this.m_chart_w=w;
int x=this.m_x;
if(this.m_x+this.m_w>w-1)
x=w-this.m_w-1;
if(x<1)
x=1;
this.Move(x,this.m_y);
}
}
чтобы она была в зоне видимости не вылазила за пределы окна графика CHANGE так же срабатывает. 26 11 при переключении окон ресурс не удаляется при переключении окон происходит событие CHARTEVENT CHANGE
Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этомпанель была свёрнута, а потом снова запущен на графике.
Артём, ещё пример из последующей статьи про осцилляторы тоже глючит при сворачивании окна и последующем удалении программы с графика. Там не индикатор, а советник. Вот:
Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этомпанель была свёрнута, а потом снова запущен на графике.
Завтра попробую разобраться, что там за косяк...
Тут можно проверять причину деинициализации и не сохранять состояние панели в глобальные переменные терминала при снятии советника (или индикатора) с графика. Это не решение проблемы, но её сокрытие. Не гут, конечно. Но для быстрого решения подойдёт.
Либо разбираться в таком поведении. У меня пока время сильно ограничено, к сожалению.
Прошёлся по форуму. Проблема уже обсуждалась. К примеру. Добавил в код такую проверку:
Кажется баг пропал.
Спасибо. Добавлю потом к себе в коды класса этой панели. К слову, от статьи к статье, в которых эта панель применялась, в ней были всяческие доработки. По-моему, здесь последняя статья, где использовалась панель. Но не помню, дорабатывал ли я её ещё. Код класса панели прикрепил сюда.
В статье пересмотрим структуру индикаторного буфера в мультисимвольных мультипериодных индикаторах и организуем вывод на график цветных буферов этих индикаторов.
Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этомпанель была свёрнута, а потом снова запущен на графике...
Да, в последней версии Dashboard.mqh такого бага нету. Работает.
У новой биб-ки тоже есть баг. Если запустить панель на графике, а потом поиграться с размерами окна графика, то при восстановлении окна панелька прилипает к нижней части. И зараза никак оттуда не хочет вылезать ((
Артём, такой вопрос. В методе void CDashboard::Move(int x, int y) есть такое:
if(!m_higher_wnd)
{
if(y + h > m_chart_h - 2)
y = m_chart_h - h - 2;
if(y < 1)
y = 1;
}
else
{
if(y > 1)
y = 1;
if(y < m_chart_h - h - 2)
y = m_chart_h - h - 2;
}
В частности интересует вот этот блок. Т.е. если панель по высоте меньше окна графика, и если её точка Y(левый верхний угол) ниже разницы высоты окна и высоты панели с поправкой на 2 пикселя, то верхней точке панели присвоим значение этой разницы. А почему так, какой смысл?
Короче это из-за метода CDashboard::Move(int x, int y) идёт прилипание. При попытке сдвинуть панель после изменений размера графика, он постоянно корректирует координаты и не даёт свободно перемещать окно панели...
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Пока что выяснил, что так обрабатывается событие CHARTEVENT_CHART_CHANGE(9).
Так то естественно - при уводе фокуса с окна графика, его размеры становятся другими.
Вот тут обработка:
Нужно попробовать контролировать фокус графика и не реагировать на изменения в случае, если окно графика не в фокусе. Ну или как-то ещё в том же направлении. К сожалению, я пока не могу запустить и протестировать, чтобы точно указать причины и метод устранения.
Прошёлся по форуму. Проблема уже обсуждалась. К примеру. Добавил в код такую проверку:
Кажется баг пропал.
Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этом панель была свёрнута, а потом снова запущен на графике.
Завтра попробую разобраться, что там за косяк...
Артём, ещё пример из последующей статьи про осцилляторы тоже глючит при сворачивании окна и последующем удалении программы с графика. Там не индикатор, а советник. Вот:
Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этом панель была свёрнута, а потом снова запущен на графике.
Завтра попробую разобраться, что там за косяк...
Тут можно проверять причину деинициализации и не сохранять состояние панели в глобальные переменные терминала при снятии советника (или индикатора) с графика. Это не решение проблемы, но её сокрытие. Не гут, конечно. Но для быстрого решения подойдёт.
Либо разбираться в таком поведении. У меня пока время сильно ограничено, к сожалению.
Прошёлся по форуму. Проблема уже обсуждалась. К примеру. Добавил в код такую проверку:
Кажется баг пропал.
Спасибо. Добавлю потом к себе в коды класса этой панели. К слову, от статьи к статье, в которых эта панель применялась, в ней были всяческие доработки. По-моему, здесь последняя статья, где использовалась панель. Но не помню, дорабатывал ли я её ещё.
Код класса панели прикрепил сюда.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Обсуждение статьи "Делаем информационную панель для отображения данных в индикаторах и советниках"
Denis Kirichenko, 2024.09.23 22:26
Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этом панель была свёрнута, а потом снова запущен на графике...
Да, в последней версии Dashboard.mqh такого бага нету. Работает.
Да, в последней версии Dashboard.mqh такого бага нету. Работает.
У новой биб-ки тоже есть баг. Если запустить панель на графике, а потом поиграться с размерами окна графика, то при восстановлении окна панелька прилипает к нижней части. И зараза никак оттуда не хочет вылезать ((
Артём, такой вопрос. В методе void CDashboard::Move(int x, int y) есть такое:
В частности интересует вот этот блок. Т.е. если панель по высоте меньше окна графика, и если её точка Y(левый верхний угол) ниже разницы высоты окна и высоты панели с поправкой на 2 пикселя, то верхней точке панели присвоим значение этой разницы. А почему так, какой смысл?
Короче это из-за метода CDashboard::Move(int x, int y) идёт прилипание. При попытке сдвинуть панель после изменений размера графика, он постоянно корректирует координаты и не даёт свободно перемещать окно панели...