Discussão do artigo "Interfaces Gráficas X: Gestão avançada de listas e tabelas. Otimização do código (build 7)" - página 3

 

Tol, sei que este não é o tópico correto, mas desde a última atualização....

Em geral: notei isso há muito tempo, mas estava esperando essa atualização sair (para o caso de ser corrigido, mas não...).

Se houver uma janela com um gráfico (CStandartChart) e uma janela localizada na parte superior do subgráfico, se a conexão com o servidor for perdida e depois restaurada, o gráfico de objeto ficará mais alto do que as outras janelas.

Seria necessário redesenhar a janela mais alta de alguma forma. É claro que você pode rastrear isso em seu programa CP, mas me parece que a biblioteca deveria fazer essas coisas.

(Ela fica muito lenta, mas isso provavelmente se deve à gravação em tempo real).


 
Artyom Trishkin:

...

Se houver uma janela com um gráfico (CStandartChart) e uma janela localizada na parte superior do subgráfico, se a conexão com o servidor for perdida e depois restaurada, o objeto do gráfico ficará mais alto do que as outras janelas.

Seria necessário redesenhar a janela mais alta de alguma forma. É claro que você pode rastrear isso em seu programa CP, mas me parece que a biblioteca deveria fazer essas coisas.

(Ela fica muito lenta, mas isso provavelmente se deve à gravação em tempo real).

Ok, obrigado pela mensagem. Ainda não testei com a desconexão/reconexão. Verei o que posso fazer.

Por que os freios estão tão ruins? Qual programa é usado para gravar? Está muito lento. Parece que o processador está 100% carregado? Tentei gravar com o Fast Stone Capture e usar ativamente a GUI no aplicativo MQL. Tudo está normal, nada fica lento assim.

 
Anatoli Kazharski:

Ok, obrigado pela mensagem. Ainda não testei com a desconexão/reconexão. Verei o que posso fazer.

Qual é o motivo da lentidão? Com qual programa está sendo usado para gravar? Está muito lento. Parece que o processador está 100% carregado? Tentei gravar com o Fast Stone Capture e usar ativamente a GUI no aplicativo MQL. Tudo está bem, nada fica lento assim.

Versão gratuita da oCam. Mas, a propósito, sem a gravação em tempo real, a câmera também fica mais lenta. Há muitos objetos. E, no cronômetro, é preciso examinar muitos símbolos em busca de níveis de cruzamento de preços, que são próprios para cada símbolo, respectivamente, e a lista de símbolos é dinâmica, e também precisa ser monitorada quanto a alterações. Uma coisa é boa: depois da atualização, não precisei refazê-la como da última vez ;))).
 

Artyom Trishkin:
...

Mas, a propósito, também estou diminuindo a velocidade sem a gravação em tempo real.

Há muitos objetos.

E o cronômetro precisa examinar muitos símbolos em busca de níveis de cruzamento de preço, que são diferentes para cada símbolo, e a lista de símbolos é dinâmica, e também precisa ser monitorada quanto a alterações.

...
E com que frequência essas verificações são feitas?
 
Anatoli Kazharski:
E com que frequência essas verificações são feitas?

Temporizador:

//+------------------------------------------------------------------+
//| Temporizador|
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//---
   static int count=0;
   if(count<500)
     {
      count+=TIMER_STEP_MSC;
      return;
     }
//--- Zerar o contador
   count=0;
//--- Veja a mudança no Market Watch
   if(IsChangeSymbolListInMW()) {
      UpdateAllDataAndTables();
      }
//--- Capturar o aparecimento de novas barras
   bool need_update=false;
   for(int i=0; i<ArraySize(m_array_new_bar); i++) {
      if(m_array_new_bar[i].isNewBar()>0) {
         string sy=m_array_new_bar[i].GetSymbol();
         ENUM_TIMEFRAMES timeframe=m_array_new_bar[i].GetPeriod();
         Print("Novo Bar".,sy," em ",GetNameTF(timeframe));
         if(timeframe==PERIOD_D1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_d1); j++) delete m_array_symbols_new_sig_d1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_d1);
            }
         if(timeframe==PERIOD_W1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_w1); j++) delete m_array_symbols_new_sig_w1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_w1);
            }
         if(timeframe==PERIOD_MN1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_mn); j++) delete m_array_symbols_new_sig_mn[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_mn);
            }
         need_update=true;
         }
      }
   if(need_update) {
      UpdateAllDataAndTables();
      }
//--- Alterando os textos de valores na janela principal
   short row=(short)m_table_base_symbol_list.SelectedItem();
   ChangeTextData(row);

//--- Procurando por critérios de notificação D1, W1, MN1
   GetNotify(m_sorted_struct_symbols_d1,m_array_symbols_new_sig_d1,PERIOD_D1);
   GetNotify(m_sorted_struct_symbols_w1,m_array_symbols_new_sig_w1,PERIOD_W1);
   GetNotify(m_sorted_struct_symbols_mn,m_array_symbols_new_sig_mn,PERIOD_MN1);
//--- Redesenhar o gráfico
   m_chart.Redraw();
  }
//+------------------------------------------------------------------+
Etapa do cronômetro (TIMER_STEP_MSC) 16
 
Artyom Trishkin:

Temporizador:

...
etapa do cronômetro (TIMER_STEP_MSC) 16

É necessário fazer esse tipo de verificação de condição exatamente no temporizador?

Se for no cronômetro, por que com tanta frequência?

Você pode tentar reduzir a etapa e definir um intervalo diferente para cada grupo de condições. Eu adicionei a classe CTimeCounter para essa finalidade. Leia o artigo novamente para entender como usá-la. Seção: Aplicação para teste de itens

 
Anatoli Kazharski:

É necessário verificar condições desse tipo no cronômetro?

Se no cronômetro, por que com tanta frequência?

Você pode tentar reduzir a etapa e definir um intervalo diferente para cada grupo de condições. Eu adicionei a classe CTimeCounter para essa finalidade. Leia o artigo novamente para entender como usá-la. Seção: aplicativo de teste de item

Sim, já estou pensando nisso.

A verificação de uma nova barra pode ser feita com menos frequência, é claro, pois não é crítica. Mas a verificação dos níveis de cruzamento de preços em alguns símbolos (a lista deles muda dinamicamente, respectivamente, e as instâncias da classe de trabalho com ticks são adicionadas/removidas dinamicamente) deve ser feita com frequência suficiente para poder determinar os fatos dos cruzamentos a tempo.

Quando li que agora é possível ter um intervalo diferente para eventos diferentes, pensei imediatamente nessa necessidade.

 
Artyom Trishkin:

... Mas a verificação de cruzamento por preços de níveis em alguns símbolos (a lista deles muda dinamicamente, respectivamente, e as instâncias da classe de trabalho com ticks são adicionadas/removidas dinamicamente) deve ser feita com frequência suficiente para poder determinar os fatos dos cruzamentos no tempo.

Portanto, se você trabalha com ticks, é melhor fazer essas verificações em OnTick(). Por que o cronômetro deve ser cinzelado a cada 16 ms?
 
Anatoli Kazharski:
Portanto, se você trabalha com ticks, é melhor fazer essas verificações em OnTick(). Por que o cronômetro deve ser ajustado a cada 16 ms?
É uma moeda múltipla. O que é OnTick()?
 
Artyom Trishkin:
É uma moeda múltipla. O que é OnTick()?

Por meio de eventos, então. Mas não por meio de um cronômetro com essa frequência. Em geral, os freios estão do seu lado, não do lado da biblioteca ou da gravação de vídeo. Não tenho mais perguntas.