Características del lenguaje mql5, sutilezas y técnicas - página 60

 
Alexey Kozitsyn:
No sé de qué interfaz gráfica hablas, pero en la pestaña de parámetros de la ventana del comprobador puedes establecer los campos de inicio y parada. Y el comprobador determina correctamente el número de valores de los parámetros.

Paso de campo.

 
fxsaber:

Paso de campo.

Lo siento, no lo he leído con atención.
 
fxsaber:

Campo de paso.

Probablemente la razón es que a los campos de enumeración se les pueden dar valores propios que pueden no ser un múltiplo de ningún paso.

 
Alexey Kozitsyn:

La razón es probablemente que los campos de enumeración pueden recibir valores propios, que pueden no ser un múltiplo de ningún paso.

Sí, no es un bug, por eso empezamos a hablar de ello en este hilo. Si queremos un paso de optimización, se puede establecer a través de MQL para enum.

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: TesterBenchmark

fxsaber, 2017.11.22 16:54

Inserción de una sola línea en cada una de las variantes de MT5

#define Comment(A)

Acelerado en un 67% y artesanal en un 108%.


Pero ese no es el punto principal. ¡Conseguimos acelerar nuestros EAs con una línea! Y esto es en el Optimizador donde el Comentario no juega ningún papel.

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


Ejemplo 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;
    }
  }
  
  //........
}
Cómo hacer esto en OnInit (sin OnTick) - no lo sé.
 

Un fragmento del diálogo sobre el tema mencionado

fxsaber2017.11.24 08:35
No utilice expresiones en los parámetros de impresión (o de comentario). Especifique los parámetros separados por comas. Entonces seguro que todas las conversiones de cadenas serán anuladas

¿Podría explicar con un ejemplo en qué se diferencian estas dos cadenas en el modo Optimizar?

Print((string)i + (string)d);
Print(i, d);
Equipo de apoyo2017.11.24 08:44

Al optimizar en el primer caso, se calculará una expresión de cadena antes de la impresión. Se llamará a la propia impresión, pero no funcionará.

En el segundo caso, se llamará a Print, pero no funcionará. Y la conversión de cadena i+d tampoco funcionará

En una prueba sencilla, los resultados de la primera y la segunda llamada serán los mismos tanto en tiempo como en resultado recibido.

Es decir, es mucho más barato utilizar Print con comas para los modos de optimización que formar un único parámetro de entrada para ello como una cadena.


Por otro lado, si forma todo como una sola cadena justo dentro de Print, es fácil desactivar su formación en el modo Optimize mediante

#define Print(A)

pero dicha construcción no funcionará si se utilizan comas. Además, dicha construcción la desactivará también en el modo de optimización

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


Por lo tanto (y por otras razones) es mejor no llamar a funciones realmente importantes dentro de Print. En consecuencia, si se ocupa del rendimiento en el modo de optimización, tendrá que hacer algo como lo siguiente

static const bool IsNotOptim = !MQLInfoInteger(MQL_OPTIMIZATION);

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

Un fragmento del diálogo sobre el tema mencionado

Es decir, es mucho más barato utilizar Print con comas para los modos de optimización que formar un único parámetro de entrada como una cadena para ello.


Por otro lado, si se forma todo como una sola línea justo dentro de Print, es fácil desactivar su formación en el modo Optimize a través de

pero dicha construcción no funcionará si se utilizan comas. Además, dicha construcción la desactivará también en el modo de optimización


Por lo tanto (y por otras razones) es mejor no llamar a funciones realmente importantes dentro de Print. Al final, si te preocupas por el rendimiento en el modo de optimización, tendrás que hacer algo como esto

Lo siento, tal vez no entiendo, pero ¿por qué llamar a las funciones importantes dentro de la impresión?
 
Vladislav Andruschenko:
Lo siento, tal vez no lo entiendo, ¿por qué tengo que llamar a las funciones importantes en la impresión?

No está prohibido.

 
fxsaber:

No está prohibido.

Estoy de acuerdo.

sólo quería saber cuál es el objetivo?

Ahora he encontrado un problema con más de 1000 operaciones en el historial y cuando llamo a la función de procesamiento del historial, por ejemplo, para calcular el beneficio del mismo. + No sé por qué me molesto con este problema. Es decir, los presupuestos vienen con retraso.