Caractéristiques du langage mql5, subtilités et techniques - page 142

 

Afin de réduire le nombre de dépassements d'optimisation, j'utilise deux méthodes pour créer une échelle non linéaire.

Énumérer la durée en heures avec une précision suffisante :

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;
	}
}

Pour énumérer, par exemple, le pas SAR avec une précision de 2 chiffres (~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;
}

L'optimisation de 0,0001 à 0,99 nécessiterait presque 10K étapes. L'utilisation des codes 001-299 dans l'optimisation nécessiterait moins de 300 étapes.

 
Un moyen de se heurter à la division par zéro, même avec une vérification.
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    
}


L'erreur est claire dans les faits. Mais en écrivant du code comme celui-ci, il n'est pas toujours évident qu'une telle vérification n'est pas suffisante pour éviter la division par zéro.

 
Une excuse pour ne pas utiliser l'opérateur ternaire.
 
TheXpert:
Une excuse pour ne pas utiliser l'opérateur ternaire.

Pour si similaire, bien sûr.

 

Ne vous attendez pas à ce que s'il n'y a pas de valeur, elle soit nécessairement 0 et donc fausse s'il ne s'agit pas d'une variable de type bool. Même une conversion explicite en type bool ne le sauvera pas.

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;   
}

Il fonctionne de cette manière sans erreur.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Particularités de mql5, trucs et astuces

Alexey Viktorov, 2019.10.28 10:22

On ne s'attend tout simplement pas à ce que, s'il n'y a pas de valeur, ce soit nécessairement 0 et donc que ce soit faux s'il ne s'agit pas d'une variable de type bool. Même la conversion explicite en type bool ne permet pas de sauvegarder.

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;   
}

Il fonctionne de cette manière sans erreur.

Il y a une erreur dans l'endroit mis en évidence.
 
fxsaber:
Il y a une erreur dans l'endroit mis en évidence.

Je ne peux pas voir le surlignage. Quelle est l'erreur ?

 
fxsaber:
Il y a une erreur dans l'endroit mis en évidence.

Tu as écrit "==", ça devrait être "!=".

C'est souligné "jaune très pâle" :)

 
Artyom Trishkin:

Tu as écrit "==", ça devrait être "!=".

C'est souligné "jaune très pâle" :)

Eh bien, tout le monde ne sait pas que je suis comme ce singe, "Je suis faible dans les yeux quand je suis vieux."

Je suppose que oui, mais pour une raison quelconque, cela a fonctionné sans division par 0. Et en général, mon message était que nous ne devrions pas vérifier n'importe quelle variable pour 0 comme un booléen pour faux.

 
Alexey Viktorov:

Je suppose que oui, mais pour une raison quelconque, ça a fonctionné sans division par 0.

Parce que TickValue est différent de zéro.

Raison: