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

 

Para reducir el número de excesos de optimización, utilizo dos métodos para crear una escala no lineal.

Enumerar la duración en horas con suficiente precisión:

enum eHours { _0, _4, _6, _8, _12, _16, _24, _32, _48, _64, _96, _128 };

input eHours TrendHours = _8;

int
eHours2Hours(eHours e) {
	switch (e) {
	case _0:	return 0;
	case _4:	return 4;
	case _6:	return 6;
	case _8:	return 8;
	case _12:	return 12;
	case _16:	return 16;
	case _24:	return 24;
	case _32:	return 32;
	case _48:	return 48;
	case _64:	return 64;
	case _96:	return 96;
	case _128:	return 128;
	default:	return -1;
	}
}

Para enumerar, por ejemplo, el paso de SAR con una precisión de 2 dígitos (~1%):

// Приводит параметр оптимизации к нелинейному виду
// 001-099 >> 0.0001-0.0099
// 101-199 >> 0.001-0.099
// 201-299 >> 0.10-0.99
// Внимание: коды 000, 100, 200 возвращают 0.0
double
NonlinPar(int code) {
        int order = code / 100;
        int mod = code - order * 100;
        return mod * MathPow(10, order) / 10000;
}

Optimizar de 0,0001 a 0,99 requeriría casi 10K pasos. Utilizar los códigos 001-299 en la optimización requeriría menos de 300 pasos.

 
Una forma de encontrarse con la división por cero incluso con un cheque.
void OnStart()
{  
  const double Profit = 100;
  const double Lots = 1;

  double TickValue[];  
  ArrayResize(TickValue, 1);
  
  const double Points = TickValue[0] ? Profit / (Lots * TickValue[0] * _Point) : 0; // zero divide    
}


El error es claro de hecho. Pero al escribir un código como éste, no siempre es obvio que esa comprobación no es suficiente para evitar la división por cero.

 
Una excusa para no utilizar el operador ternario.
 
TheXpert:
Una excusa para no utilizar el operador ternario.

Por si fuera poco, por supuesto.

 

Simplemente no esperes que si no hay valor, sea necesariamente 0 y por tanto falso si no es una variable de tipo bool. Incluso una conversión explícita a tipo bool no lo salvará.

void OnStart()
{  
  const double Profit = 100;
  const double Lots = 1;

  double TickValue[];  
  ArrayResize(TickValue, 1);
  
  const double Points = TickValue[0] == 0? Profit / (Lots * TickValue[0] * _Point) : 0;   
}

Funciona así sin errores.

 

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

Peculiaridades de mql5, consejos y trucos

Alexey Viktorov, 2019.10.28 10:22

Simplemente no esperas que si no hay valor, sea necesariamente 0 y por tanto sea falso si no es una variable de tipo bool. Incluso la conversión explícita a tipo bool no se guardará.

void OnStart()
{  
  const double Profit = 100;
  const double Lots = 1;

  double TickValue[];  
  ArrayResize(TickValue, 1);
  
  const double Points = TickValue[0] == 0? Profit / (Lots * TickValue[0] * _Point) : 0;   
}

Funciona así sin errores.

Hay un error en el lugar resaltado.
 
fxsaber:
Hay un error en el lugar resaltado.

No veo el espacio resaltado. ¿Cuál es el error?

 
fxsaber:
Hay un error en el lugar resaltado.

Has escrito "==", debería ser "!=".

Está subrayado "amarillo muy pálido" :)

 
Artyom Trishkin:

Has escrito "==", debería ser "!="

Está subrayado "amarillo muy pálido" :)

Bueno, no todo el mundo sabe que soy como ese mono, "soy débil de ojos cuando estoy viejo".

Supongo que sí, pero por alguna razón funcionó sin la división por 0. Y en general, mi mensaje fue que no debemos comprobar cualquier variable por 0 como un booleano por falso.

 
Alexey Viktorov:

Supongo que sí, pero por alguna razón funcionó sin la división por 0.

Porque TickValue no es cero.