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 11

 

Ainda não entendi como atualizar a tabela....

Há dados dinâmicos na tabela e precisamos atualizá-los por meio de um cronômetro.

Tentei limpá-los primeiro usando o método Clear(), mas apareceu um erro:

 invalid pointer access in 'Element.mqh' (106,70)

How to update it? Não encontrei um exemplo em nenhum dos artigos. Em todos os artigos, a tabela é preenchida com dados estáticos.

 
Juer:

Como atualizar a tabela que não entendi....

Há dados dinâmicos na tabela, precisamos atualizá-los por meio de um cronômetro.

Tento limpá-los primeiro usando o método Clear(), mas aparece um erro:

Como atualizá-lo? Não encontrei um exemplo em nenhum dos artigos. Em todos os artigos, a tabela é preenchida com dados estáticos.

 
Anatoli Kazharski:

Obrigado. Só que ele não leva em conta a classificação.

Ao classificar, as linhas podem mudar sua posição....

 
Juer:

Obrigado. Só que isso não leva em conta a classificação.

Ao classificar, as linhas podem mudar de posição...

Você mesmo pode controlar a classificação. Há um método público CTable::SortData() para essa finalidade.

Exemplo e a versão mais recente da classe CTable aqui: Atualizações da biblioteca EasyAndFast

 
Anatoli Kazharski:

Você mesmo pode controlar a classificação. Há um método público CTable::SortData() para essa finalidade.

Exemplo e a versão mais recente da classe CTable aqui: Atualizações da biblioteca EasyAndFast

Ainda não está claro. Não existe um método para determinar quantas linhas da tabela não estão vazias. Estou enviando informações sobre ordens abertas para a tabela. As ordens podem aparecer ou fechar. Preciso examinar todos os valores da tabela e compará-los por ticket.... É inconveniente, mas é possível.

Além disso, você poderia me ajudar com a classificação. Preciso criar uma linha na tabela análoga à que está na guia Comércio. Uma linha que resuma o lucro em posições abertas, comissões, etc. Ou seja, as colunas dessa linha serão as mesmas da tabela, mas com valores totais. Então, como posso colocar essa linha em primeiro lugar na lista para que a classificação não seja aplicada a ela?

 
Juer:

Ainda não está claro. Não há nenhum método para determinar quantas linhas da tabela não estão vazias. Estou enviando informações sobre ordens abertas para a tabela. As ordens podem aparecer ou fechar. Preciso examinar todos os valores da tabela e compará-los por ticket.... Não é conveniente, mas é possível.

...

Examine você mesmo as linhas e veja se elas estão vazias ou não.

O artigo Trading Expert Advisor with GUI: Filling with functionality (Parte II) mostra em detalhes como isso pode ser implementado.

Mais informações:

...

Além disso, você pode me falar sobre classificação. Preciso criar uma linha na tabela análoga à que está na guia Comércio. Uma linha que resuma o lucro em posições abertas, comissões etc. Ou seja, as colunas dessa linha serão as mesmas da tabela, mas com valores totais. Então, como posso colocar essa linha em primeiro lugar na lista e não aplicar a classificação a ela?

Não existe essa possibilidade na biblioteca. Como opção, você pode criar uma segunda tabela sem cabeçalhos com uma linha acima da primeira tabela e gerar valores totais nela.

 
Anatoli Kazharski:

Percorra você mesmo as filas e veja se elas estão vazias ou não.

O artigo Trading Expert Advisor with GUI: Filling with functionality (Parte II) mostra em detalhes como isso pode ser implementado.

A biblioteca não tem esse recurso. Como opção, você pode criar uma segunda tabela sem cabeçalhos com uma linha acima da primeira tabela e gerar valores totais nela.

No exemplo do artigo, novamente, o número de linhas é constante, mas o meu é dinâmico. Mas percebi que tenho que fazer isso manualmente.

A segunda tabela acima não é uma solução ruim, mas como lidar com a alteração da largura das colunas na tabela principal...? Como sincronizar com a segunda?

Outra pergunta. Se eu tiver a primeira coluna, ela simplesmente indica o número de série do registro. Ela não está sujeita a classificação. Existe alguma maneira de tornar uma determinada coluna não classificada?

 
Juer:

No exemplo do artigo, novamente, o número de linhas é constante, mas o meu é dinâmico. Mas eu entendo, é feito à mão, então o que há de errado com isso.

Onde você viu um número constante de linhas? O número de posições e o número de caracteres usados mudam e essas mudanças são refletidas nas tabelas.


Juer:

A segunda tabela acima não é uma solução ruim, mas e quanto a alterar a largura das colunas na tabela principal...? Como sincronizar com a segunda tabela?

Outra pergunta. Se eu tiver a primeira coluna, ela simplesmente indica o número de série do registro. Ela não está sujeita a classificação. Existe alguma maneira de tornar uma determinada coluna não classificada?

Não, não há.

 
Anatoli Kazharski:

Onde você viu um número constante de linhas? O número de posições e o número de caracteres usados mudam e essas mudanças são refletidas nas tabelas.

Sinceramente, não entendo muito bem como você atualiza as posições ali. Vejo que, para atualizar a tabela de caracteres, basta excluir todas as linhas. Mas ainda não entendo como a tabela de posições é atualizada:

//+------------------------------------------------------------------+
//| Definir valores na tabela de posições
//+------------------------------------------------------------------+
void CProgram::SetValuesToPositionsTable(string &symbols_name[])
  {
//--- Verificar se está fora do intervalo
   uint symbols_total =::ArraySize(symbols_name);
   uint rows_total    =m_table_positions.RowsTotal();
   if(symbols_total<rows_total)
      return;
//--- Vamos colocar os indicadores na tabela
   for(uint r=0; r<rows_total; r++)
     {
      int    positions_total =PositionsTotal(symbols_name[r]);
      double pos_volume      =PositionsVolumeTotal(symbols_name[r]);
      double buy_volume      =PositionsVolumeTotal(symbols_name[r],POSITION_TYPE_BUY);
      double sell_volume     =PositionsVolumeTotal(symbols_name[r],POSITION_TYPE_SELL);
      double pos_profit      =PositionsFloatingProfitTotal(symbols_name[r]);
      double buy_profit      =PositionsFloatingProfitTotal(symbols_name[r],POSITION_TYPE_BUY);
      double sell_profit     =PositionsFloatingProfitTotal(symbols_name[r],POSITION_TYPE_SELL);
      double average_price   =PositionAveragePrice(symbols_name[r]);
      string deposit_load    =::DoubleToString(DepositLoad(false,average_price,symbols_name[r],pos_volume),2)+"/"+
                              ::DoubleToString(DepositLoad(true,average_price,symbols_name[r],pos_volume),2)+"%";
      //--- Definir valores
      m_table_positions.SetValue(0,r,symbols_name[r]);
      m_table_positions.SetValue(1,r,(string)positions_total);
      m_table_positions.SetValue(2,r,::DoubleToString(pos_volume,2));
      m_table_positions.SetValue(3,r,::DoubleToString(buy_volume,2));
      m_table_positions.SetValue(4,r,::DoubleToString(sell_volume,2));
      m_table_positions.SetValue(5,r,::DoubleToString(pos_profit,2));
      m_table_positions.SetValue(6,r,::DoubleToString(buy_profit,2));
      m_table_positions.SetValue(7,r,::DoubleToString(sell_profit,2));
      m_table_positions.SetValue(8,r,deposit_load);
      m_table_positions.SetValue(9,r,::DoubleToString(average_price,(int)::SymbolInfoInteger(symbols_name[r],SYMBOL_DIGITS)));
      //--- Definir a cor
      m_table_positions.TextColor(3,r,(buy_volume>0)? clrBlack : clrLightGray);
      m_table_positions.TextColor(4,r,(sell_volume>0)? clrBlack : clrLightGray);
      m_table_positions.TextColor(5,r,(pos_profit!=0)? (pos_profit>0)? clrGreen : clrRed : clrLightGray);
      m_table_positions.TextColor(6,r,(buy_profit!=0)? (buy_profit>0)? clrGreen : clrRed : clrLightGray);
      m_table_positions.TextColor(7,r,(sell_profit!=0)?(sell_profit>0)? clrGreen : clrRed : clrLightGray);
     }
  }

Não estou entendendo uma coisa. Se houver menos símbolos do que linhas na tabela, você simplesmente não a atualiza?

Preciso atualizar os valores de fato a cada tick. Seria correto excluir todas as linhas e preencher a tabela novamente a cada vez?

 

Juer:

Preciso atualizar os valores de fato em cada marcação. Seria correto excluir todas as linhas e preencher a tabela novamente a cada vez?

Se você só precisa atualizar os valores, não é necessário excluir nada.

Se você precisar alterar o número de linhas na tabela, uma maneira de fazer isso é mostrada.

A segunda maneira é usar o método CTable::Rebuilding(). Mas, nesse caso, você terá de definir algumas propriedades da tabela (cabeçalhos, largura das colunas etc.) novamente.