Trouble de l'erreur il n'y a pas d'opérations commerciales - page 5

 
Alexey Viktorov:

Ce n'est pas parce que je l'ai recompilé, c'est parce que les tests ont commencé à une date différente. Et j'ai remarqué ce bug, si vous mettez quelque chose qui était déjà là, alors le test ne se fait pas, mais donne immédiatement le résultat du test précédent. Ne vous laissez donc pas berner par de telles béquilles. Essayez de rendre ça normal. S'il manque quelque chose ou si des paramètres ne sont pas valides, signalez-le via Print et tout sera corrigé.

Si c'était seulement dû à une date différente, alors mes contrôles le révèleraient (barres manquantes, etc.), mais ce n'est pas la date qui est le problème. Si je ne peux pas reconstruire l'erreur que la validation automatique trouve, alors il est plus facile pour moi de glisser la même chose et d'espérer que la vengeance avec les acheteurs trouvera la zone problématique (s'il y en a une). Cette implémentation des validations ne me permet pas de comprendre complètement où chercher les erreurs. Et Print est déjà poussé dans tous les sens pour moi.

Alexey Viktorov:

Et j'ai remarqué que si je colle ce qui a déjà été, alors le test ne se produit pas et donne immédiatement le résultat du test précédent.

Et pour ne pas obtenir un résultat de test antérieur, je dois changer quelque chose, voire ajouter une chaîne vide (je voulais dire "recompiler").

 
Roman Gergert:

J'ai finalement compris, peut-être quelqu'un peut aider, en général, le soviétique a seulement vérifié le lot minimum lorsque le MM a été activé, et donc hardcore mis lot = 0,01, eh bien, dans le dépôt validateur s'avère être 1 $ (trouvé cette information dans l'un des sujets), respectivement, il utilise le lot 0,001 (ou ainsi) pour le commerce, et puisque j'ai toujours eu dans un endroit était un lot de 0,01, il n'était donc pas assez d'argent et le robot ne traite pas)

Exactement, Roman, le validateur est testé avec un dépôt de 1 $.

Il y a beaucoup de fonctions de normalisation dans l'EA. S'il renvoie 0, la transaction n'essaie même pas de s'ouvrir :

      if((Auto() && (b==0 || (b>0 && BuyPriceMin-Ask>(b==1?iPointOrderStep_1:iPointOrderStep_2)*Point()))) || buy) {
         BuyLot=buy && LotFromPanel()>0 ? LotFromPanel() : BuyLot;
         double norm_lot=NormalizeLots(_Symbol,BuyLot);
         if(norm_lot>0.0) {  
            int ticket=OrderSend(Symbol(),OP_BUY,norm_lot,NormalizeDouble(Ask,_Digits),30,0,0,
                        "NZT-48",iMagicNumber,0,clrGreen);
            if(ticket>0) {
                ObjectSetInteger(0,"V_5_buy",OBJPROP_STATE,false);
                buy=false;
            }
            else  
               Print("Order Send error #",GetLastError());
         } else Print("Not enough money for the minimum lot");   
      }

Mais il n'est pas clair alors comment la fonction de normalisation de lot de cet EA envoie un lot de 0.2 à ouvrir :

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

Après tout, si le lot 0.2 vient en vérification et que la marge jugée par les logs est de 645, alors cette partie de l'expression devrait donner vrai

if(is_margin && _lot*margin>free)  _lot=0.0;     //0.2*645>0.95

Et la fonction enverra 0.0, mais pas 0.2. Il ne peut envoyer 0,2 que s'il

MarketInfo(symbol,MODE_MARGINREQUIRED);

a retourné 0 ou une valeur négligeable. Je ne comprends pas du tout le fonctionnement de ce validateur.

Chers développeurs MQL, veuillez nous envoyer des journaux de test au lieu de rapports d'erreurs de validation secs en trois lignes. Il sera beaucoup plus facile pour nous, humbles programmeurs, de comprendre les erreurs de code et de les corriger. Vous pouvez l'envoyer en tant qu'archive à l'adresse e-mail, vous trouverez probablement un moyen)))

P.S. Situation amusante. Pour le 5e jour, j'essaie de mettre sur le marché un conseiller expert qui fonctionne parfaitement dans le testeur et dans la vie réelle.
 
Andrey Kaunov:

Exactement, Roman, le validateur teste avec un dépôt de 1 $.

Il y a beaucoup de fonctions de normalisation dans l'EA. S'il renvoie 0, la transaction n'essaie même pas de s'ouvrir :

Mais il n'est pas clair alors comment la fonction de normalisation de lot de cet EA envoie un lot de 0.2 à ouvrir :

Après tout, si le lot 0.2 vient en vérification et que la marge jugée par les logs est de 645, alors cette partie de l'expression devrait donner vrai

Et la fonction enverra 0.0, mais pas 0.2. Il ne peut envoyer 0,2 que s'il

a retourné 0 ou une valeur négligeable. Je ne comprends pas du tout le fonctionnement de ce validateur.

Chers développeurs MQL, veuillez nous envoyer des journaux de test au lieu de rapports d'erreurs de validation secs en trois lignes. Il sera beaucoup plus facile pour nous, humbles programmeurs, de comprendre les erreurs de code et de les corriger. Vous pouvez les envoyer en tant qu'archive par e-mail, vous pouvez penser à un moyen :))))

P.S. Situation amusante. Pour le 5e jour, j'essaie de mettre sur le marché un conseiller expert qui fonctionne parfaitement dans le testeur et dans la vie réelle.

il semble que vous ayez un effet de levier différent de celui du Marché, peut-être 1:500

essayez d'amener le calcul du lot à 1k100 en changeant seulement une ligne dans le code :

marge = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0 ;

et le lot minimum pour le marché est de 0.1 je pense....
 

Vous vivez dans une sorte de monde limité qui vous est propre. Dans un monde normal, le lot minimum peut être très différent de 0.01

RECIPEPTION : lisez et relisez l'article "Quels contrôles doivent passer...".

Avant d'envoyer un ordre de transaction, vous devez vérifier s'il sera accepté, s'il y a suffisamment de marge ...


D'une manière générale, le validateur a jusqu'à présent rempli sa tâche principale : éliminer le code incomplet de la place de marché.

 
Renat Akhtyamov:

il semble que vous ayez un effet de levier différent de celui du marché, peut-être 1:500

essayez d'amener le calcul du lot à un levier de 1k100 en changeant seulement une ligne dans le code :

marge = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0 ;

Renat, merci pour le conseil, je vais essayer.

Vladimir Karputov:

Vous vivez dans un monde limité qui vous est propre. Dans un monde normal, le lot minimum peut être très différent de 0,01.

RECIPEPTION : lisez et relisez l'article "Quels contrôles doivent passer...".

Avant d'envoyer un ordre de transaction, vous devez vérifier s'il sera accepté, s'il y a suffisamment de marge ...


D'une manière générale, le validateur a jusqu'à présent rempli sa tâche principale : éliminer le code incomplet du marché.

Vladimir, pouvez-vous comprendre la question de manière constructive ? ! Ne dois-je pas vérifier le terrain pour la marge et d'autres choses ? L'article "Quels contrôles doivent être passés..." est déjà comme une bible pour moi. J'ai posté des extraits de code ci-dessus. J'ai modifié le code selon vos recommandations de l'article pour une conformité totale :

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

Mais je reçois toujours le message "pas d'échanges" :

Eh bien, si la fonction envoie toujours un lot de 0,0 et ne permet pas d'ouvrir des transactions, je la change pour envoyer un lot minimum :

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

Et j'obtiens l'historique des transactions qui se produisent (voir les captures d'écran ci-dessous). Mais le lot minimum vient bien sûr très étrangement, mais laissez-le venir. Mais les affaires sont là !

C'est la situation est très étrange validateur, faisant le lot minimum 0,2 pour un dépôt de 1 $.


Naturellement, il n'y aura pas d'accord du tout ! Et ce, avec un code parfaitement adapté. Au fait, j'ai supprimé toutes les conditions sur les indicateurs, etc. pour les tests. Les transactions commencent à être ouvertes dès que l'EA est lancé.

Vladimir Karputov:

...

Jusqu'à présent, le validateur s'est acquitté de sa tâche principale : éliminer le code incomplet du marché.

Que fait donc le validateur ? Je ne le vois pas faire autre chose que de faire sauter la cervelle des programmeurs !

Notez que je ne vous demande pas de modifier quoi que ce soit dans le validateur. Nous pouvons simplement voir les journaux de test. On saura alors avec quels paramètres les tests se déroulent, sur quels dépôts. En fin de compte, nous pouvons au moins utiliser les impressions pour vérifier où se trouve l'erreur dans le code et la corriger le plus rapidement possible. Nous n'allons pas pointer nos doigts dans le ciel pendant toute une semaine, en essayant seulement de localiser une erreur. Nous ne travaillons pas l'un contre l'autre, n'est-ce pas ? Je comprends, nous essayons de gagner quelque chose ensemble.

 
Andrey Kaunov:

...Ce n'est pas comme si on travaillait l'un contre l'autre ! Je comprends, nous essayons de gagner quelque chose ensemble.

Andrew, j'ai rencontré un gel du serveur une fois pendant le week-end.

ce qui signifie qu'il ne mangerait pas MarketInfo(...)

Je pouvais à peine le faire fonctionner.

Donc, si vous avez compris que vous ne pouvez pas avaler Market, il reste à penser comment faire pour qu'un validateur ne jure pas.

Par exemple, je demande - quel effet de levier ?

C'est écrit 0.

J'ajoute dans le code - si c'est 0, alors il dit 100

Si la logique est claire, cela fonctionnera et bonne chance !

 

Je vois, Renat, merci.

J'ai déjà fabriqué beaucoup de béquilles, mais à certains endroits, je suis dans une impasse. Et je veux que le code adéquat soit testé de manière adéquate. Par ailleurs, il n'est pas impossible de trouver un problème en l'absence de journaux de test, mais c'est très laborieux.

Peut-être que le validateur aussi serait bien d'être mis à jour. Je ne suis pas le seul à rencontrer de tels problèmes.

 
Andrey Kaunov:

Je vois, Renat, merci.

J'ai déjà fabriqué beaucoup de béquilles, mais à certains endroits, je suis dans une impasse. Et je veux que le code adéquat soit testé de manière adéquate. Par ailleurs, il n'est pas impossible de trouver un problème en l'absence de journaux de test, mais c'est très laborieux.

Peut-être que le validateur aussi serait bien d'être mis à jour. Je ne suis pas le seul à rencontrer de tels problèmes.

Oui, vous n'êtes pas le seul à avoir été confronté à ce problème, dans le fil suivant il y en a un autre qui a été confronté à ce problème - vous êtes déjà deux.

De même, regardez combien d'EA sont mis en ligne sur le marché chaque jour sans aucun problème, c'est ce qu'on appelle "le niveau de professionnalisme".

 

Vitaly, si vous et les autres "professionnels" parvenez à passer la validation du premier coup, je ne peux qu'applaudir. Mais il y a bien plus que deux fils de discussion sur un problème similaire. De plus, tout le monde n'écrit pas, certaines personnes se contentent de lire. D'ailleurs, le conseiller expert n'est pas de moi. Je le prépare sur le marché pour le client. Mais cela n'annule pas les problèmes décrits ci-dessus. Si vous lisez attentivement mon message, peut-être qu'en tant que "professionnel" vous pourrez suggérer une solution au problème. Il n'est pas nécessaire d'avoir de grandes connaissances pour rédiger un message du type "Tu es stupide et je suis intelligent".

Voici un autre problème pour vous. Pourquoi ayant ajouté au début de OnTick() l'ouverture inconditionnelle en série de 5 transactions en 5 minutes avec le lot minimal, le validateur me donne aussi un message"aucune opération de trading".

void OnTick() { 
   static int test_ticket[2]={0,0};
   if(test_ticket[1]<5 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend(_Symbol,OP_BUY,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),NormalizeDouble(Ask,_Digits),30,0.0,0.0,"NZT-48_test",33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
   }   
   if(OrderSelect(test_ticket[0],SELECT_BY_TICKET))
      if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
         if(OrderClose(test_ticket[0],NormalizeDouble(OrderLots(),2),NormalizeDouble(Bid,_Digits),30,clrNONE)) {
            printf("Test order closed, ticket #%d",test_ticket[0]);
            test_ticket[0]=0;
         }   
...
}
 
Andrey Kaunov:

Vitaly, si vous et les autres "professionnels" parvenez à passer la validation du premier coup, je ne peux qu'applaudir. Mais il y a bien plus que deux fils de discussion sur un problème similaire. De plus, tout le monde n'écrit pas, certaines personnes se contentent de lire. D'ailleurs, le conseiller expert n'est pas de moi. Je le prépare sur le marché pour le client. Mais cela n'annule pas les problèmes décrits ci-dessus. Si vous lisez attentivement mon message, peut-être qu'en tant que "professionnel" vous pourrez suggérer une solution au problème. Il n'est pas nécessaire d'avoir de grandes connaissances pour rédiger un message du type "Tu es stupide et je suis intelligent".

Voici un autre problème pour vous. Pourquoi ayant ajouté au début de OnTick() l'ouverture inconditionnelle de 5 trades en 5 minutes avec un lot minimal le validateur me donne"aucune opération de trading" ?

Et vous devriez d'abord poster la réponse complète du validateur ici.

Et qu'est-ce qui vous fait penser que le validateur fixe les billets selon le principe que vous avez inventé ?

pour ouvrir 5 transactions, vous devez compter le nombre de transactions ouvertes, pas la billetterie.
Raison: