Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 714

 
dimnik:

Com a utilização da OnTradeTransaction, o tempo de optimização mudou estranhamente. Um sistema em 15M, muito simples, histórico anual, uma corrida ocorre em 0,3 - 0,4 segundos.

Após o início da optimização, as primeiras 200-300 corridas vão a menos de um segundo, as seguintes abrandam até 15-20 segundos (50 vezes!);

Sem sobreaquecimento do processador ou trolling, mais de metade da memória é livre (de 16GB).

Antes de utilizar o manipulador da OnTradeTransaction não havia nada parecido - ainda mais complexos Expert Advisors em pequenos prazos eram optimizados com aproximadamente a mesma velocidade.

O HistoryDealSelect afecta tanto a velocidade? Como podemos eliminar os desfasamentos?

void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if( trans.type != TRADE_TRANSACTION_DEAL_ADD) return;
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   long     deal_type         =0;
   double   deal_volume       =0;
   long     deal_magic        =0;
   if(HistoryDealSelect(trans.deal))
     {
      deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
      deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
      deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
     }
   else
      return;
   if (deal_type == DEAL_TYPE_BUY && deal_magic == MagicNumber) current_position += deal_volume;
   if (deal_type == DEAL_TYPE_SELL && deal_magic == MagicNumber) current_position -= deal_volume;
      
  }


Mostre-me todo o código.
 

Hi!

Quem sabe - como exibir as barras à direita da barra de zero no indicador e quantas no máximo? (previsão de preço a fazer)

 
dimnik:

É a HistóriaDealSelect que afecta gravemente a velocidade? Como pode ser eliminada a desaceleração?

Os programadores recomendam minimizar as funções de histórico de chamadas (caro) - através do cache de histórico.

Afixei uma solução de trabalho em kodobase (MT4Orders), mas provavelmente não lhe servirá.

Não vi nenhum atraso após a utilização do cache.

Embora, a sua OnTradeTransaction não deve abrandar, mesmo que não seja escrita de forma óptima.

 
Renat Akhtyamov:

Hi!

Quem sabe - como exibir as barras à direita da barra de zero no indicador e quantas no máximo? (previsão de preço a fazer)

Adicione PeriodSeconds() ao tempo de abertura da última barra e desenhe ali uma vela com objectos gráficos. A quantidade máxima será mostrada à direita. Mas ainda não verifiquei como será exibido se houver uma saída. Provavelmente, deve ser tido em conta por si só.
 
Alexey Viktorov:
Adicione PeriodSeconds() ao tempo de abertura da última barra e desenhe ali uma vela com objectos gráficos. No máximo, será visível à direita. Mas ainda não verifiquei como será exibido se houver uma saída. Provavelmente, dever-se-ia ter em conta.
Obrigado, eu tenho-o!
 
Alexey Viktorov:
Adicionar PeriodSeconds() ao tempo de abertura da última barra e desenhar o candelabro ali. No máximo, vê-lo-ão à direita. Mas ainda não verifiquei a sua aparência. Provavelmente, é necessário ter em conta.

No gráfico desenha uma continuação, mas infelizmente não na janela indicadora.

Talvez eu esteja errado, é claro...

O que pensa - posso continuar a linha indicadora para além da barra de zero à direita?

 
Quem sabe - é possível continuar a linha indicadora para além da barra de zero à direita?
 
Renat Akhtyamov:
Quem sabe - pode a linha indicadora ser estendida para além da barra zero para a direita?
Pode. É possível definir um turno, mas provavelmente não será possível calcular por valores inexistentes, e o tempo não é utilizado para exibir o indicador. É por isso que eu estava a falar sobre a exibição de barras usando elementos gráficos. O ObjectCreate() contém tanto o número da janela (subjanela) como o tempo. Não deve haver quaisquer problemas na criação de elementos gráficos.
 
Alexey Viktorov:
Pode. Pode deslocá-lo, mas o cálculo provavelmente não será feito utilizando valores inexistentes e o tempo não é utilizado na visualização do indicador. É por isso que eu estava a falar sobre a exibição de barras usando elementos gráficos. O ObjectCreate() contém tanto o número da janela (subjanela) como o tempo. Por conseguinte, não deve haver problemas na criação de elementos gráficos.

Na janela do gráfico, utilizando os carimbos temporais, pode referir-se a futuras barras pretendidas. Tem funcionado.

No entanto, não posso fazer o mesmo na janela indicadora. Isto é, não posso escrever valores no buffer de indicadores com o índice -1, -2, etc.

A questão é esta.

É claro, em princípio. A solução consiste em criar um indicador por objectos gráficos.

 
Renat Akhtyamov:

Na janela do gráfico, utilizando os carimbos temporais, pode referir-se a futuras barras pretendidas. Tem funcionado.

No entanto, não posso fazer o mesmo na janela indicadora. Isto é, não posso escrever valores no buffer de indicadores com o índice -1, -2, etc.

A questão é esta.

Em princípio, é claro. A solução consiste em criar o indicador por objectos gráficos.

Calcular o segundo buffer nos seus valores normais, por exemplo (se quisermos calcular 10 barras para mostrar "futuro"), então calcular este buffer nos valores Buff[9] -- Buff[8] -- Buff[n] -- Buff[0], e depois mostrar este buffer com um desvio não zero. Definir a compensação de buffer para o número desejado de barras no futuro - 10 neste caso