Discussão do artigo "Como criar um painel de informações para exibir dados em indicadores e Expert Advisors" - página 3

 
Denis Kirichenko #:
Até agora, descobri que é assim que o evento CHARTEVENT_CHART_CHANGE(9) é tratado.

Portanto, é natural que, quando o foco é retirado da janela do gráfico, seus tamanhos se tornem diferentes.

Aqui está o processamento:

//--- Se a programação for alterada
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- Obtenha o número da subjanela do gráfico (ele pode mudar ao excluir a janela de qualquer indicador)
      this.m_wnd=this.GetSubWindow();
      //--- Obter as novas dimensões do gráfico
      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);
      //--- Determinar se o tamanho do painel está fora da janela do gráfico
      this.m_higher_wnd=this.HigherWnd();
      this.m_wider_wnd=this.WiderWnd();
      //--- Se a altura do gráfico tiver mudado - ajuste a posição vertical do painel
      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);
        }
      //--- Se a largura do gráfico tiver mudado - ajuste a posição horizontal do painel
      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);
        }
     }

Você deve tentar controlar o foco do gráfico e não reagir às alterações caso a janela do gráfico esteja fora de foco. Ou algo mais nesse sentido. Infelizmente, ainda não posso executá-lo e testá-lo para identificar as causas exatas e o método de correção.

 

Eu examinei o fórum. O problema já foi discutido. Por exemplo. Adicionei essa verificação ao código:

//--- Se a programação for alterada
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      //--- Obtenha o número da subjanela do gráfico (ele pode mudar ao excluir a janela de qualquer indicador)
      this.m_wnd=this.GetSubWindow();
      l ong value;
      //--- redefinir o valor do erro
      ::ResetLastError();
      //--- obter o valor da propriedade
      if(!::ChartGetInteger(m_chart_id, CHART_BRING_TO_TOP, m_wnd, value))
         {
         //--- enviar a mensagem de erro para o registro "Experts".
         Print(__FUNCTION__ + ", Error Code = ", ::GetLastError());
         return;
         }
      // se não estiver exibindo o gráfico em cima de todos os outros - exit
      if(value == 0)
         return;
      //--- Obter as novas dimensões do gráfico
      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);
      //--- Determinar se o tamanho do painel está fora da janela do gráfico
      this.m_higher_wnd=this.HigherWnd();
      this.m_wider_wnd=this.WiderWnd();
      //--- Se a altura do gráfico tiver mudado - ajuste a posição vertical do painel
      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);
        }
      //--- Se a largura do gráfico tiver mudado - ajuste a posição horizontal do painel
      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);
        }
     }


O bug parece ter desaparecido.


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

Outro problema. O desdobramento da janela do painel não é processado depois que o indicador foi removido do gráfico e o painel foi minimizado e, em seguida, iniciado novamente no gráfico.




Amanhã tentarei descobrir qual é o erro....

 

Artem, outro exemplo do artigo subsequente sobre osciladores também apresenta falhas ao minimizar a janela e, em seguida, excluir o programa do gráfico. Não se trata de um indicador, mas de um Expert Advisor. Veja aqui:



 
Denis Kirichenko #:

Outro problema. O desdobramento da janela do painel não é tratado depois que o indicador foi removido do gráfico e o painel foi minimizado e, em seguida, reiniciado no gráfico.

Amanhã tentarei descobrir qual é o erro....

Aqui você pode verificar a causa da desinicialização e não salvar o estado do painel nas variáveis globais do terminal ao remover um Expert Advisor (ou indicador) do gráfico. Isso não é uma solução para o problema, mas sua ocultação. É claro que isso não é bom. Mas serve para uma solução rápida.

Ou você precisa examinar esse comportamento. Infelizmente, tenho pouco tempo por enquanto.

 
Denis Kirichenko #:

Eu examinei o fórum. O problema já foi discutido. Por exemplo. Adicionei essa verificação ao código:

O bug parece ter desaparecido.

Obrigado. Adicionarei essa classe de painel aos meus códigos mais tarde. A propósito, de artigo para artigo, no qual esse painel foi usado, houve todos os tipos de aprimoramentos. Acho que aqui está o último artigo em que o painel foi usado. Mas não me lembro se já o aperfeiçoei.
Anexei o código da classe do painel aqui.

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

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Discussão do artigo "Criando um painel de informações para exibir dados em indicadores e Expert Advisors"

Denis Kirichenko, 2024.09.23 22:26

Outro problema. Ele não lida com o desdobramento da janela do painel, depois que o indicador foi removido do gráfico e o painel foi minimizado e, em seguida, iniciado novamente no gráfico....


Sim, na versão mais recente do Dashboard.mqh não existe esse erro. Ele funciona.

 
Denis Kirichenko #:

Sim, na versão mais recente do Dashboard.mqh não há esse erro. Ele funciona.

Bom.
 

O novo babador também tem um bug. Se você iniciar o painel em um gráfico e depois brincar com o tamanho da janela do gráfico, o painel ficará preso na parte inferior quando a janela for restaurada. E ele não quer sair de lá ((


 

Artem, tenho uma pergunta. No método void CDashboard::Move(int x, int y), existe uma coisa dessas:

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


Em particular, estou interessado nesse bloco. Ou seja, se a altura do painel for menor que a da janela do gráfico e se seu ponto Y (canto superior esquerdo) for menor que a diferença entre a altura da janela e a altura do painel, corrigida em 2 pixels, o ponto superior do painel receberá o valor dessa diferença. Por que isso acontece, qual é o motivo?

Em suma, é por causa do método CDashboard::Move(int x, int y) que ocorre o travamento. Quando você tenta mover o painel depois de alterar o tamanho do gráfico, ele corrige constantemente as coordenadas e não permite que você mova a janela do painel livremente...