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

 
Merci pour le conseil, mais ce n'est probablement pas mon cas. Mon validateur ne voit pas du tout les fonctions de négociation, aucun moyen d'atteindre le nombre maximum d'ordres;)))
 

Oh, shaitan... a passé la validation et maintenant

aucune opération commerciale

n'est plus une erreur.

P.S. C'était une photo prise au hasard. Le test suivant est encore la même chose


 
Andrey Kaunov:

Il n'y a pas d'erreur ici, je ne comprends pas du tout ce qui se passe. J'ai mis une béquille (division par zéro) avant la fonction commerciale:

Ça marche :

Je l'enlève, ça me donne la même chose.

Pas d'opérations commerciales.

Je ne comprends pas ce qui empêche le validateur d'OrderSend(). Après tout, si elle lui parvient, il doit y avoir des erreurs de facturation (bien que je les aie toutes corrigées) 130, 131, 134, ..., mais pas"aucune opération commerciale". Il me suffit de placer un ordre en attente quelque part loin dans OnInit() pour l'empêcher de se déclencher.

Et quel est le sens d'une telle béquille si la condition dans laquelle un commerce doit être effectué n'entre pas dans le code ?

 
Pourquoi ça ne rentre pas ? ! Regarde bien, Alexey. Juste avant OrderSend, il y a une béquille.
 
Andrey Kaunov:
Pourquoi n'y a-t-il pas d'entrée ? Regarde attentivement Alexey. Il y a une béquille juste avant OrderSend.

Bien. Si OrderSend n'est pas exécuté, cela signifie que l'exécution du code ne l'atteint pas pour une raison quelconque. Et peu importe ce que vous mettez avant dans le bloc condition, il n'y a pas d'entrée et pas d'exécution, pas même de division par zéro.

 

Attends, je ne comprends pas. Si l'opérateur 1 (division par zéro) est exécuté, le suivant est l'opérateur if. Et cela signifie vérifier son état. Pour vérifier la condition, la fonction OrderSend doit être exécutée, ce qui signifie qu'elle est la prochaine en ligne après la division par zéro.

Mais peu importe. J'ai changé le code pour le bien de la pureté de l'expérience :


Le résultat est le même. Le résultat avec la béquille est une erreur de division par zéro. Sans la béquille, le résultat est indiqué ci-dessus : aucune opération de négociation.

 
Andrey Kaunov:

Attends, je ne comprends pas. Si l'opérateur 1 (division par zéro) est exécuté, le suivant est l'opérateur if. Et cela signifie vérifier son état. Pour vérifier la condition, la fonction OrderSend doit être exécutée, ce qui signifie qu'elle est la prochaine en ligne après la division par zéro.

Mais peu importe. J'ai changé le code pour le bien de la pureté de l'expérience :


Le résultat est le même. Le résultat avec la béquille est une erreur de division par zéro. Le résultat est montré ci-dessus sans elle : aucune opération de négociation.

Tu n'aurais pas dû utiliser une image pour coller le code. Il est impossible de le lire du tout. Et le problème n'est pas dans ce fragment de code. Le problème est que certaines conditions ne sont pas remplies pour certains paramètres d'entrée et qu'il n'y a pas de notification.

 
Andrey Kaunov:
Pourquoi ça ne vient pas ? !

Pourquoi essayez-vous d'écrire pire pour le marché que pour vous-même ?

C'est simple - avant d'envoyer une commande, regardez "est-il au moins exécutable ?".

vérifiez les limites (vous l'avez dit), vérifiez les fonds et la marge (vous ne les avez pas), voyez s'il y a un lien et si la transaction est autorisée.

(option) s'il y avait des calculs lourds, ce n'est pas un péché de rafraîchir les taux avant de lire les offres et les demandes.

Pour votre propre bien, vous ferez tous ces contrôles. Pourquoi pas maintenant ?

 

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

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
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();
   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);
}

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().

int OnInit() {
  
   int stops_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   iTrailStart=inpTrailStart;
   iTrailStart2=inpTrailStart2;
   iTrailStartL=inpTrailStartL;
   //---
   if(stops_level>0) {
      if(inpTrailStart<stops_level+3) iTrailStart=stops_level+3;
      if(inpTrailStart2<stops_level+3) iTrailStart2=stops_level+3;
      if(inpTrailStartL<stops_level+3) iTrailStartL=stops_level+3;
   }
   
   Comment("");
   EventSetMillisecondTimer(300);
   ButtonCreate("V_5",5,25,50,20,"FLAT",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_7",60,25,50,20,"TREND",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("Auto",115,25,50,20,"Auto",9,clrBlack,C'236,233,235',clrNONE,false);
   ObjectCreate(0,"Lot",OBJ_EDIT,0,0,0);
   ObjectSetInteger(0,"Lot",OBJPROP_CORNER,CORNER_LEFT_LOWER);
   ObjectSetInteger(0,"Lot",OBJPROP_XDISTANCE,115);
   ObjectSetInteger(0,"Lot",OBJPROP_YDISTANCE,50);
   ObjectSetString(0,"Lot",OBJPROP_TEXT,"");
   ObjectSetInteger(0,"Lot",OBJPROP_ALIGN,ALIGN_RIGHT);
   ObjectSetInteger(0,"Lot",OBJPROP_FONTSIZE,9);
   ObjectSetInteger(0,"Lot",OBJPROP_COLOR,clrBlack);
   ObjectSetInteger(0,"Lot",OBJPROP_YSIZE,20);
   ButtonCreate("V_5_buy",5,50,50,20,"BUY",9,clrBlack,C'236,233,235', clrNONE,false);
   ButtonCreate("V_5_sell",60,50,50,20,"SELL",9,clrBlack,C'236,233,235', clrNONE,false); 
     
   test_ticket=OrderSend(_Symbol,OP_BUYLIMIT,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),_Point,30,0.0,0.0,"NZT-48_test",iMagicNumber,0,clrNONE);
   
   return(INIT_SUCCEEDED);
}//-------------------------------------- End OnInit ---------------------------------------- 

Alexey Viktorov:

Vous n'auriez pas dû coller le code dans une image. Il est impossible de le lire. Le problème n'est pas dans ce fragment de code. Le problème est que certaines conditions ne sont pas remplies dans certains paramètres d'entrée et qu'il n'y a pas de notification de ce fait.

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

 
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.

Regardez comment d'autres ordres ont été mis en œuvre dans l'EA. Je ne pense pas que le conseiller expert ouvre seulement

à l'ouverture le ticket<0 a été fixé - regardez l'autre logique, comment elle réagit à cela en réalité