Características da linguagem mql5, subtilezas e técnicas - página 60

 
Alexey Kozitsyn:
Eu não sei de que GUI você está falando, mas na aba de parâmetros da janela do testador você pode definir os campos start e stop. E o testador determina corretamente o número de valores dos parâmetros.

Passo de campo.

 
fxsaber:

Passo de campo.

Desculpe, não o li com atenção.
 
fxsaber:

Campo de passos.

Provavelmente a razão é que os campos de enumeração podem receber valores próprios que não podem ser múltiplos de nenhuma etapa.

 
Alexey Kozitsyn:

A razão é provavelmente que os campos de enumeração podem receber valores próprios, que podem não ser um múltiplo de qualquer passo.

Sim, não é um bug, foi por isso que começamos a falar sobre isso neste tópico. Se quisermos uma etapa de otimização, ela pode ser definida através do MQL para enumerar.

 

Fórum sobre negociação, sistemas de negociação automatizados e testes estratégicos

Bibliotecas: TesterBenchmark

fxsaber, 2017.11.22 16:54

Inserindo apenas uma linha em cada uma das variantes do MT5

#define Comment(A)

Acelerado a 100% em 67%, artesanal em 108%!


Mas esse não é o ponto principal. Conseguimos acelerar os nossos EAs com uma linha! E isto é no Optimizer onde o Comentário não tem qualquer papel.

 
// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам
// Перед использованием должен быть хотя бы один OnTick вызван тестером
bool IsRealTicks( void )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(_Symbol, Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST)));
}


Exemplo de uso

// Советник будет тестироваться только в режиме по реальным тикам
void OnTick()
{
  static bool IsRemove = true;
  
  if (IsRemove)
  {
    IsRemove = MQLInfoInteger(MQL_TESTER) && !IsRealTicks();
    
    if (IsRemove)
    {
      Print("Real ticks mode is needed!");
      
      ExpertRemove();
      
      return;
    }
  }
  
  //........
}
Como fazer isso no OnInit (sem o OnTick) - não sei.
 

Um trecho do diálogo sobre o tema mencionado

fxsaber2017.11.24 08:35
Não utilize expressões em parâmetros de impressão (ou comentários). Especifique os parâmetros separados por vírgulas. Então com certeza todas as conversões de cordas serão anuladas.

Você poderia explicar com um exemplo como estas duas cordas são diferentes no modo Optimize?

Print((string)i + (string)d);
Print(i, d);
Equipe de Suporte2017.11.24 08:44

Ao optimizar no primeiro caso, será calculada uma expressão de cadeia antes da impressão. A impressão em si será chamada, mas não vai funcionar.

No segundo caso, a impressão será chamada, mas não vai funcionar. E a conversão de cordas i+d também não vai funcionar

Em um teste simples, os resultados da primeira e segunda chamadas serão os mesmos tanto no tempo quanto na saída recebida.

Ou seja, é muito mais barato usar impressão com vírgulas para otimizar os modos do que formar um único parâmetro de entrada para ele como uma string.


Por outro lado, se formar tudo como um único fio dentro da impressão, é fácil desactivar a sua formação no modo Optimizar através de

#define Print(A)

mas tal construção não vai funcionar se forem usadas vírgulas. Além disso, tal construção também a desactivará no modo Optimizar.

Print(SendOrder()); // SendOrder будет проигнорирован при #define Print(A)


Portanto (e por outras razões) é melhor não chamar funções realmente importantes dentro da Impressão. Como resultado, se você cuidar do desempenho no modo Otimizar, você ainda precisará fazer algo como isto

static const bool IsNotOptim = !MQLInfoInteger(MQL_OPTIMIZATION);

if (IsNotOptim)
{
  const string Str = GetString(); // дорогой вызов
  
  Print(Str);
//  Comment(Str); 
//  Alert(Str);
}
 
fxsaber:

Um trecho do diálogo sobre o tema mencionado

Ou seja, é muito mais barato usar impressão com vírgulas para otimizar os modos do que formar um único parâmetro de entrada como uma string para ele.


Por outro lado, se você formar tudo como uma única linha dentro da Impressão, é fácil desativar sua formação no modo Otimizar através de

mas tal construção não vai funcionar se forem usadas vírgulas. Além disso, tal construção também a desactivará no modo Optimizar.


Portanto (e por outras razões) é melhor não chamar funções realmente importantes dentro da Impressão. No final, se você se importa com o desempenho no modo Optimize, você ainda precisará fazer algo como isto

Desculpe, talvez eu não entenda, mas por que chamar funções importantes dentro da impressão?
 
Vladislav Andruschenko:
Desculpe, talvez eu não entenda, por que eu preciso chamar funções importantes para impressão?

Não é proibido.

 
fxsaber:

Não é proibido.

Eu concordo.

só queria saber qual é o objectivo?

Agora encontrei um problema com mais de 1000 negócios no histórico e quando chamo a função de processamento do histórico, por exemplo, para calcular o lucro do histórico. + Não sei porque me estou a preocupar com este problema. Isto é, as citações vêm com um atraso.