Обсуждение статьи "Делаем информационную панель для отображения данных в индикаторах и советниках" - страница 3

 
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);
        }
     }


Кажется баг пропал.


Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
  • 2021.12.25
  • satorifx
  • www.mql5.com
чтобы она была в зоне видимости не вылазила за пределы окна графика CHANGE так же срабатывает. 26 11 при переключении окон ресурс не удаляется при переключении окон происходит событие CHARTEVENT CHANGE
 

Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этом панель была свёрнута, а потом снова запущен на графике.




Завтра попробую разобраться, что там за косяк...

 

Артём, ещё пример из последующей статьи про осцилляторы тоже глючит при сворачивании окна и последующем удалении программы с графика. Там не индикатор, а советник. Вот:



 
Denis Kirichenko #:

Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этом панель была свёрнута, а потом снова запущен на графике.

Завтра попробую разобраться, что там за косяк...

Тут можно проверять причину деинициализации и не сохранять состояние панели в глобальные переменные терминала при снятии советника (или индикатора) с графика. Это не решение проблемы, но её сокрытие. Не гут, конечно. Но для быстрого решения подойдёт.

Либо разбираться в таком поведении. У меня пока время сильно ограничено, к сожалению.

 
Denis Kirichenko #:

Прошёлся по форуму. Проблема уже обсуждалась. К примеру. Добавил в код такую проверку:

Кажется баг пропал.

Спасибо. Добавлю потом к себе в коды класса этой панели. К слову, от статьи к статье, в которых эта панель применялась, в ней были всяческие доработки. По-моему, здесь последняя статья, где использовалась панель. Но не помню, дорабатывал ли я её ещё.
Код класса панели прикрепил сюда.

Цветные буферы в мультисимвольных мультипериодных индикаторах
Цветные буферы в мультисимвольных мультипериодных индикаторах
  • www.mql5.com
В статье пересмотрим структуру индикаторного буфера в мультисимвольных мультипериодных индикаторах и организуем вывод на график цветных буферов этих индикаторов.
Файлы:
Dashboard.mqh  219 kb
 

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

Обсуждение статьи "Делаем информационную панель для отображения данных в индикаторах и советниках"

Denis Kirichenko, 2024.09.23 22:26

Другая напасть. Не обрабатывается разворачивание окна панели, после того, как индикатор сначала был удалён c графика, и при этом панель была свёрнута, а потом снова запущен на графике...


Да, в последней версии Dashboard.mqh такого бага нету. Работает.

 
Denis Kirichenko #:

Да, в последней версии 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) идёт прилипание. При попытке сдвинуть панель после изменений размера графика, он постоянно корректирует координаты и не даёт свободно перемещать окно панели...