Erreur de validation lors de la mise sur le marché du robot de trading. - page 6

 
Andrey Kaunov:

Vous pensez que je ne vérifie pas. La taille du lot est vérifiée dans une fonction distincte

Les limites ne sont pas nécessaires ici, car le Stop Loss et le Take Profit sont égaux à zéro à l'ouverture de la transaction.RefreshRates() met à jour les données lors du calcul du lot. Bien sûr, il n'y a pas de vérification de la connexion, etc. avant chaque entrée, mais là n'est pas la question. Si OrderSend envoyait une requête, il y aurait une erreur spécifique : 130, 131, etc. Mais ce que j'ai, c'est.

Je n'essaie pas du tout d'envoyer un ordre d'ouverture. Même dans le dernier test, lorsque j'ai défini une position de contrôle dans la fonction OnInit().


C'est possible. Mais j'ai déjà tout revérifié. Je ne sais pas où aller ensuite.

Dans la fonction de normalisation du lot, vous arrondissez le lot après l'avoir contrôlé à la valeur max/min.
 
Artyom Trishkin:
Dans la fonction de normalisation du lot, vous arrondissez le lot après l'avoir contrôlé à la valeur max/min.

Eh bien, oui, je le fais.

MathRound();
P.S. Je pense que vous devez creuser à partir des paramètres d'entrée, car il arrive que ça passe. Effectuez une vérification "infaillible" de chaque paramètre.
 
Je ne parle pas des journaux de test du validateur. Mais au moins les paramètres qui ne sont PAS validés pourraient être possibles à envoyer. Rien à attraper du tout pour réparer le code. Je comprends que la variabilité de la sélection des paramètres de test peut être infinie. Vous pouvez définir une variable de type int soit à +50000, soit à -45000. Mais je ne peux pas simplement limiter certains paramètres d'entrée à une certaine plage de valeurs. Elle sera différente selon les outils.
 
Andrey Kaunov:
Je ne parle même pas des journaux de test du validateur. Mais au moins les paramètres qui ne sont PAS validés pourraient être possibles à envoyer. Il n'y a rien à attraper du tout pour réparer le code. Je comprends que la variabilité du choix des paramètres de test peut être infinie. Vous pouvez définir une variable de type int soit à +50000, soit à -45000. Mais je ne peux pas simplement limiter certains paramètres d'entrée à une certaine plage de valeurs, car elle sera différente pour les différents instruments.

Vous devez vous assurer que le lot de négociation est valable dans tous les cas. Ce n'est pas pour rien que j'ai fait remarquer que vous changez le lot dans votre code après avoir vérifié la validité de la plage de tailles.

Et c'est la vérification des paramètres d'entrée complètement stupides qui doit être faite.

 

Il n'y a pas de problème avec le terrain. Il est vérifié pour le max/min. Avant d'être arrondi, il est divisé par le pas, puis le nombre entier arrondi est à nouveau multiplié par le pas. Nous obtenons un lot parfaitement correct.

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   double free = AccountFreeMargin()*0.95;
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   if(is_margin && _lot*margin>free)  _lot=0.0; //MathFloor(free/margin/step)*step;
   return(_lot);
}

_lot(0.568)/step(0.01)=56.8

MathRound(56.8)=57

57*step(0.01)=0.57

Ensuite, il vérifie s'il y a suffisamment de marge libre pour ouvrir. Le validateur ne jure pas du tout. Il ne voit pas les fonctions de négociation, apparemment à cause de paramètres d'entrée incorrects. Le conseiller expert ne fait tout simplement pas de transactions avec une certaine combinaison d'entre eux ! Ce n'est pas comme si j'avais une martin non conditionnée, ou un gridlocker qui s'ouvre à chaque chandelier. Comment expliquer au validateur que l'EA ne fait logiquement pas de transactions avec certains paramètres ?

 
Andrey Kaunov:

Il n'y a pas de problème avec le terrain. Il est vérifié pour le max/min. Avant d'être arrondi, il est divisé par le pas, puis le nombre entier arrondi est à nouveau multiplié par le pas. Nous obtenons un lot parfaitement correct.

_lot(0.568)/step(0.01)=56.8

MathRound(56.8)=57

57*step(0.01)=0.57

Ensuite, on vérifie s'il y a suffisamment de marge libre pour ouvrir. Le validateur ne jure pas du tout. Il ne voit pas les fonctions de négociation, apparemment à cause de paramètres d'entrée incorrects. Le conseiller expert ne fait tout simplement pas de transactions avec une certaine combinaison d'entre eux ! Ce n'est pas comme si j'avais un martin non conditionné, et je n'ai pas un net maker qui s'ouvre sur chaque chandelier. Comment puis-je expliquer au validateur que l'EA ne fait logiquement pas de transactions en utilisant certains paramètres ?

N'expliquez pas, mais faites en sorte que l'EA corrige les mauvais paramètres d'entrée. De préférence avec un message au journal concernant leur valeur invalide et la correction de la valeur valide.

Et si, pour une raison quelconque, vous voulez rendre l'utilisateur responsable de la saisie de paramètres incorrects dans le monde réel, l'utilisateur doit être informé des paramètres incorrects.
Mais pour le testeur, ils doivent également être corrigés - pour que l'EA fonctionne.

 

Alors comment les ajuster s'il y a des paramètres pour l'EURUSD et d'autres pour l'or, par exemple. Actuellement, les paramètres par défaut sont plus ou moins tolérables pour les principales paires, mais pour l'or, ils ne fonctionneront pas du tout. Il n'y aura pas de commerce là-bas. C'est pour cela que les paramètres existent (si je comprends bien), pour les adapter à chaque instrument. Si tout était aussi simple, j'aurais intégré tous les paramètres dans le conseiller expert et n'aurais rien envoyé aux externes.

Un autre bogue du validateur est qu'il ne voit pas du tout les autres horizons temporels. Je l'ai contourné, mais au détriment de l'algorithme dans une certaine mesure. Le conseiller expert prend les données d'autres horizons temporels, de l'hebdomadaire, D1, H4, etc. à M1. Mais les données sont nulles, comme je l'ai découvert au cours de nombreuses expériences. Il n'y a rien que nous puissions faire à ce sujet, nous pouvons seulement travailler autour. Pourquoi devons-nous modifier le conseiller expert au détriment de l'algorithme ? N'est-ce pas l'inverse ? Le validateur doit être adapté aux tests. Sinon, le contrôle d'une EA fonctionnant parfaitement se transforme en une sorte de travail pénible !

 
Andrey Kaunov:
Alors comment les ajuster s'il y a des paramètres pour l'EURUSD et d'autres pour l'or, par exemple. Actuellement, les paramètres par défaut sont plus ou moins tolérables pour les principales paires, mais pour l'or, ils ne fonctionneront pas du tout. Il n'y aura pas de commerce là-bas. C'est pour cela que les paramètres existent (si je comprends bien), pour les adapter à chaque instrument. Si tout était aussi simple, j'aurais intégré tous les paramètres dans le conseiller expert et n'aurais rien envoyé aux externes.
Vous avez mis une division par 0 juste avant OrderSend - et il y a eu une telle erreur. Ainsi, il atteint OrderSend, mais ne s'ouvre pas. C'est-à-dire, lots/marges/limites/prix, quelque chose d'entre eux n'est pas pris en compte.
 
Maxim Kuznetsov:
Vous avez déjà mis la division par 0 juste avant OrderSend - et il y avait une telle erreur. Il arrive donc à OrderSend, mais ne s'ouvre pas. Donc, lots/marges/limites/prix, certains d'entre eux ne sont pas pris en compte.

Maxime, si l'un de ces éléments n'est pas pris en compte, le validateur donnera une erreur très précise : 130, 131, 134, 145 etc. Ce n'est pas le cas ici !

P.S. Croyez-moi, j'ai envoyé plus d'une centaine de validations en 4 jours, et j'ai essayé beaucoup d'options.

 

Oui, il atteint immédiatement la division par 0 (d'où OrderSend). Et cela génère une erreur.

Mais si j'envoie pour vérification le conseiller expert sans division par 0 dans le code, il définit comme par magie des paramètres qui n'ouvrent aucune transaction pendant la période spécifiée et renvoie une erreur. C'est ma version de ce qui se passe, mais apparemment ce n'est pas loin de la vérité.

Raison: