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

 
Maxim Kuznetsov:

penser à ce qui va se passer à Stop Out. (vous avez déjà Margin Call, Steppe est plus proche que jamais)

votre transaction sera fermée de force, mais vous ignorez une telle option, et vous allez la rechercher à chaque tick (dans l'historique, elle est longue) et envoyer des ordres incorrects.

Juste pour ajouter à ceux qui ont "plus de 10 ans de programmation MQL".

Si quelque chose peut arriver, cela arrivera certainement.

Le Stop Out et l'Appel de Marge ne sont pas si normaux, mais c'est naturel, et un EA doit être prêt pour eux.

Les conditions commerciales peuvent changer, elles ne sont pas constantes. StopLevel saute et même le levier change parfois.

L'utilisateur peut facilement fixer/modifier le Stop/Take ou fermer une position, même involontairement - le conseiller expert doit réagir à cela.

Un utilisateur peut ouvrir/fermer un ordre avec Magic (ou mettre accidentellement Magic=0 et négocier à la main) - que fera le robot ?

Le solde est déposé/retiré sans redémarrer l'EA - il est extrêmement important que le robot soit capable de le faire (il y a eu un sujet récemment - un homme vient de perdre de l'argent).

Le terminal peut redémarrer et prendre beaucoup de temps pour se mettre à jour, ou la connexion peut être perdue pendant un temps significatif - tout cela et tout ce qui s'est passé hors ligne doivent être pris en compte.

Le validateur ne vérifie que 1-2% du "minimum candidat" et les gens se plaignent encore...

 
Renat Akhtyamov:

semble avoir été écrit de manière séquentielle, question - réponse

toutes les pages du fil sont accessibles.

Renat, je comprends que vous comptez les mandats. Je ne comprends pas pourquoi ?


Maxim Kuznetsov:

Juste pour ajouter pour tous ceux qui ont "plus de 10 ans de programmation MQL".

Si quelque chose peut arriver, cela arrivera certainement.

Le Stop Out et l'Appel de Marge ne sont pas si normaux, mais ils sont naturels, et un EA doit être prêt pour eux.

Les conditions commerciales peuvent changer, elles ne sont pas constantes. StopLevel saute et même le levier change parfois.

L'utilisateur peut facilement fixer/modifier le Stop/Take ou fermer une position, même involontairement - le Conseiller Expert doit réagir à cela

Un utilisateur peut ouvrir/fermer un ordre avec Magic (ou mettre accidentellement Magic=0 et négocier à la main) - que fera le robot ?

Le solde est déposé/retiré sans redémarrer l'EA - il est extrêmement important que le robot soit capable de le faire (il y a eu un sujet récemment - un homme vient de perdre de l'argent).

Le terminal peut redémarrer et prendre beaucoup de temps pour se mettre à jour, ou la connexion peut être perdue pendant un temps significatif - tout cela et tout ce qui s'est passé hors ligne doivent être pris en compte.

Le validateur n'est vérifié que par 1-2% des "candidats minimum" et les gens se plaignent encore...

Maxim, de quoi tu parles ? ! J'ai demandé des conseils sur ce qu'il faut faire en cas d'arrêt. Lisez le forum à partir de la page 6, à mon avis j'ai exposé ma question de manière très détaillée.

 
Andrey Kaunov:

Renat, je comprends que vous comptez les mandats. Je ne comprends pas pourquoi ?


Maxim, de quoi tu parles ? ! Ai-je demandé des conseils sur ce qu'il faut faire en cas d'arrêt de travail ? Lisez le forum à la page 6, je pense avoir exposé ma question de manière très détaillée.

Parce que les billets sur le réel ne sont pas 0,,,,N

 
Oh, vous voulez dire mon petit code. Donc, le type de billets n'a pas d'importance. Renat il y a un tableau à deux dimensions. Dans la cellule [0], il écrit un ticket, et dans la cellule [1], il compte les commandes. On pourrait le faire avec différentes variables, mais j'ai décidé de le faire de cette façon.
 
Andrey Kaunov:

Renat, je comprends que vous comptez les mandats. Je ne comprends pas pourquoi ?


Maxim, de quoi tu parles ? ! Ai-je demandé des conseils sur ce qu'il faut faire en cas d'arrêt de travail ? Lisez le forum à partir de la page 6, à mon avis j'ai exposé ma question de manière très détaillée.

avec vos 10 ans d'expérience, qu'est-ce que je peux vous conseiller...rien en principe :-)

Vous ignorez mes conseils et insistez pour réparer le validateur pour votre EA.

---

vous avez un stop out sur NZDUSD, un ordre a été fermé, la logique de votre EA n'a pas d'importance, vous le sélectionnez quand même et envoyez OrderClose, vous obtenez false. Cette étonnante opération se répète à chaque tic, l'ensemble ralentit et le chèque est annulé. Et ceci dans le cas le plus simple.

A propos des contrôles de l'état des échanges - voir les 14 pages précédentes

 
Andrey Kaunov:

Faites attention à ce que vous dites :

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

Fatigué de l'erreur qu'il n'y a pas d'opérations commerciales

Andrey Kaunov, 2020.07.25 11:42

Je vais l'essayer, Renat, merci pour le conseil.

Vladimir, pouvez-vous comprendre la question de manière constructive ? Ne dois-je pas vérifier le lot pour la marge et ainsi de suite ?L'article "Quels contrôles doivent passer..." 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 le lot 0.0 et ne permet pas d'ouvrir des transactions, je la change pour envoyer le 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 dans cette situation, chose très étrange est validateur, faire un 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 le conseiller expert est lancé.

Alors, que fait le validateur ? Je pense que jusqu'à présent, la seule chose qu'il fait est d'époustoufler les programmeurs !

Notez que je ne demande pas de modifier quoi que ce soit dans le validateur. Nous pouvons simplement voir les journaux de test. Nous comprendrons alors avec quels paramètres les tests se déroulent et sur quels dépôts. En fin de compte, vous pouvez 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 une semaine entière, 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.

Votre toute première capture d'écran. Vous vous êtes attaché au message qu'il n'y a pas de transactions sur le NZDUSD. Et vous vous battez contre ce moulin depuis 14 pages.

Mais la principale erreur de la première capture d'écran n'est pas celle-là. C'est celui qui vous informe d'un test trop long sur le GBPUSD. Le test ayant duré trop longtemps, le validateur l'a interrompu.

Exécutez le profileur de code sur GBPUSD, M30 et laissez-le négocier pendant trois heures. Examinez ensuite les goulets d'étranglement et réparez-les.

 
Maxim Kuznetsov:


---

Vous avez un stop out sur NZDUSD, vous avez fermé un ordre, la logique de votre EA s'en moque, vous le sélectionnez quand même et envoyez OrderClose, vous obtenez false. Cette étonnante opération se répète à chaque tic, l'ensemble ralentit et le chèque est annulé. Et ceci dans le cas le plus simple.

Sur la vérification des conditions commerciales - voir les 14 pages précédentes.

Maxim, tu lis le code de manière très inattentive.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   gl_lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   gl_ask=NormalizeDouble(Ask,_Digits);
   gl_bid=NormalizeDouble(Bid,_Digits);
   gl_comm="test";
//---
   if(AccountFreeMarginCheck(_Symbol,OP_BUY,gl_lots)<=0 || GetLastError()==134) {
      printf("Not enough money for the minimum lot: %.4f",gl_lots); 
      return;
   }
   if(test_ticket[1]<8 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend((StringCompare(_Symbol,"NZDUSD")==0?"NZDUSD":_Symbol),OP_BUY,gl_lots,gl_ask,30,0.0,0.0,gl_comm,33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
      else if(Fun_Error(GetLastError())==1) return; 
   }   
   if(test_ticket[0]>0)
      if(OrderSelect(test_ticket[0],SELECT_BY_TICKET)) {
         if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
            if(OrderClose(test_ticket[0],OrderLots(),gl_bid,30,clrNONE)) {
               printf("Test order closed, ticket #%d",test_ticket[0]);
               test_ticket[0]=0;
            } else if(Fun_Error(GetLastError())==1) return;
      } else if(Fun_Error(GetLastError())==1) return;
}

La condition mentionnée dans le marqueur ne laissera pas la fonction OrderClose() s'exécuter si l'ordre est fermé, c'est la première chose. Ensuite, si au moins un ordre est ouvert sur NZDUSD, le validateur ne retournera pas "no trade".

Artyom Trishkin:

...

Exécutez le profileur de code sur GBPUSD, M30 et laissez-le négocier pendant trois heures. Examinez ensuite les goulets d'étranglement et réparez-les.

Ok, Artyom. Je vais essayer.

 
Andrey Kaunov:

Maxim, tu as lu le code de manière très inattentive.

La condition spécifiée par le marqueur ne laissera pas la fonction OrderClose() s'échapper, c'est la première chose. Et deuxièmement, si au moins un ordre a été ouvert sur NZDUSD, le validateur ne renverrait pas "no trade".


Franchement, je suis fatigué de jouer le rôle de débogueur d'un code tordu et d'essayer de combattre la confiance en soi de l'auteur. Les erreurs spécifiées sont là, regardez par vous-même

Si vous ne savez pas quoi en faire, vous devrez faire quelque chose pour votre propre profit. Le validateur n'a rien à voir avec cela

 
Je ne vous demande pas personnellement, Maxim, de déboguer quoi que ce soit. Le code est tordu, bien, mais il passe la validation. La question est tout à fait différente.
 
Artyom Trishkin:

...

Exécutez le profileur de code sur GBPUSD, M30 et laissez-le négocier pendant trois heures. Ensuite, voyez les goulots d'étranglement et réparez-les.

Artyom, le profileur de code n'a pas montré de goulots d'étranglement. L'ensemble du code fonctionne de manière fluide, sans aucun processus pathologiquement long.

La conclusion de toute cette histoire est la suivante. Par tous les moyens, j'ai finalement réussi la validation. Cela ne dépend pas du tout du code (s'il est correct, sans erreurs évidentes, comme mentionné dans cet article). Le fonctionnement du validateur n'est évidemment connu que de son créateur. Le code est vérifié au bout de 2 fois, puis à la troisième fois. Parfois, il passe plusieurs fois d'affilée et parfois, il ne passe pas du tout. De plus, je me contente de modifier les paramètres d'entrée (ils ne sont pas significatifs) ou de décaler les lignes qui ne changent rien en les réorganisant, ou encore de supprimer ou d'ajouter des commentaires (qui ne devraient en aucun cas affecter le fichier de travail).

En général, la validation de la réussite ou de l'échec dépend uniquement de l'"humeur" du validateur (tension dans le réseau, flux d'énergie ou autre). Ainsi, le code dans le testeur habituel avec des paramètres normaux n'a jamais bloqué et n'a donné aucun échec, sur aucune paire et TF.