Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 703

 
Zvezdochet:

OUI. C'est exactement ce dont il s'agit dans le manuel de Sergei Kovalev. C'est celui qui manque le plus en ce moment.

Il n'y a pas de manuel sur mql5 en tant que tel sur ce site, je ne sais pas pour les autres. Mais il y a beaucoup d'articles, lisez-les, vous pouvez réussir.

Статьи по MQL5
Статьи по MQL5
  • www.mql5.com
Статьи по программированию на языке MQL5
 

Messieurs les programmeurs !

Aidez-moi à résoudre un problème qui me préoccupe depuis un mois.

Mon TS ne ferme parfois pas les commandes pour une raison quelconque.

Ça ressemble à ça :

Les trois premiers ordres - 44329646, 44330563 et 44337351 s'ouvrent et se ferment parfaitement.

Et au quatrième ordre, la tragédie se produit :

et ainsi de suite jusqu'à l'infini...

Autrement dit, un conseiller expert ouvre l'ordre 44339156 et tente de clôturer l'ordre 44337351 qu'il a lui-même clôturé avec succès plusieurs heures auparavant ( !!!!).

Vous devez le fermer manuellement ; si vous ne le faites pas, vous subirez parfois le plus fort drawdown. Quel désastre !

Comment est-ce possible ?

Le code du conseiller expert est aussi simple que possible :

здесь - условие открытия сделки
{
         RefreshRates();
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         if(total_orders_NZDUSD==0)
         {
         Balance=AccountBalance();
         Lots=NormalizeDouble((Balance/(Ask*10.0))*0.01,2);
         double AskNorm=NormalizeDouble(Ask,Digits);
         ticket_buy_NZDUSD=OrderSend("NZDUSD.I",OP_BUY,0.01,AskNorm,0,0,0);
         }
      }
здесь - условие закрытия сделки
      {
         RefreshRates();
         if(OrderSelect(ticket_buy_NZDUSD, SELECT_BY_TICKET)==true)
         {
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         ctm_ticket_buy_NZDUSD=OrderCloseTime();
         order_type_NZDUSD=OrderType();
            if(total_orders_NZDUSD>0)
            {
               if(ctm_ticket_buy_NZDUSD==0)
               {
                  if(order_type_NZDUSD==OP_BUY)
                  {
                  double BidNorm=NormalizeDouble(Bid,Digits);
                  OrderClose(ticket_buy_NZDUSD,0.01,BidNorm,0);
                  }
               }
            }
         }

Comment un seul et même programme peut-il fonctionner "à chaque fois" ? Je ne comprends pas...

 
Alexander_K2:

Messieurs les programmeurs !

Aidez-moi à résoudre un problème qui me préoccupe depuis un mois.

Mon TS ne ferme parfois pas les commandes pour une raison quelconque.

Ça ressemble à ça :

Les trois premiers ordres - 44329646, 44330563 et 44337351 s'ouvrent et se ferment bien.

Et au quatrième ordre, la tragédie se produit :

et ainsi de suite jusqu'à l'infini...

Autrement dit, un conseiller expert ouvre l'ordre 44339156 et tente de clôturer l'ordre 44337351 qu'il a lui-même clôturé avec succès plusieurs heures auparavant ( !!!!).

Vous devez le fermer manuellement ; si vous ne le faites pas, vous subirez parfois le plus fort drawdown. Quel désastre !

Comment est-ce possible ?

Le code du conseiller expert est aussi simple que possible :

Comment un seul et même programme peut-il fonctionner "à chaque fois" ? Je ne comprends pas...

Lisez l'aide relative à OrderSelect(). En particulier, lisez la référence sur la sélection par ticket. Même un ordre fermé est sélectionné par ticket. Elle est déjà fermée, et vous essayez de la refermer.

Si 0, cela signifie qu'il est toujours sur le marché, fermez-le, si > 0, cela signifie qu'il est déjà fermé et qu'il n'est pas nécessaire de le relancer, il ne reviendra pas à la vie et ne sera pas fermé.

 
Artyom Trishkin:

Lisez l'aide relative à OrderSelect(). En particulier sur la sélection par ticket. Même un ordre fermé est sélectionné par le ticket. Elle est déjà fermée, et vous essayez de la refermer.

S'il est sélectionné, vérifiez l'heure de fermeture - si 0, cela signifie qu'il est toujours sur le marché - fermez-le, si > 0, cela signifie qu'il est déjà fermé et que vous ne devez pas le relancer - il ne s'animera pas et ne se fermera pas.

Merci beaucoup - je vais essayer.

 
Alexander_K2:

Merci beaucoup - je vais essayer.

Vous êtes les bienvenus. Vous n'avez pas à l'essayer, vous devez le faire...

 
Artyom Trishkin:

S'il vous plaît. Vous n'avez pas à l'essayer, vous devez le faire...

Artem, j'ai lu l'aide - tout semble être correct.

ctm_ticket_buy_NZDUSD=OrderCloseTime();
         ...
               if(ctm_ticket_buy_NZDUSD==0)
            ...

Je vérifie l'heure de fermeture.

Je l'ai lu dans la référence MQL4 :

Il est recommandé d'appeler la fonction OrderSelect() immédiatement avant d'appeler les dernières données d'ordre.

C'est également vrai.

Alors quel est le problème ?

 
Alexander_K2:

Artem, j'ai lu l'aide - tout semble être correct.

Je vérifie l'heure de fermeture.

Je l'ai lu dans la référence MQL4 :

Il est recommandé d'appeler la fonction OrderSelect() immédiatement avant d'appeler les données d'un nouvel ordre.

C'est également vrai.

Alors qu'est-ce qui ne va pas ?

Quel genre de fonction est-ce ?

total_orders_NZDUSD=TotalOrders("NZDUSD.I");
Et après avoir travaillé, quel ordre est attribué ?
 
Alexander_K2:

Messieurs les programmeurs !

Aidez-moi à résoudre un problème qui me préoccupe depuis un mois.

Mon TS ne ferme parfois pas les commandes pour une raison quelconque.

Ça ressemble à ça :

Les trois premiers ordres - 44329646, 44330563 et 44337351 s'ouvrent et se ferment bien.

Et au quatrième ordre, la tragédie se produit :

et ainsi de suite jusqu'à l'infini...

Autrement dit, un conseiller expert ouvre l'ordre 44339156 et tente de clôturer l'ordre 44337351 qu'il a lui-même clôturé avec succès plusieurs heures auparavant ( !!!!).

Vous devez le fermer manuellement ; si vous ne le faites pas, vous subirez parfois le plus fort drawdown. Quel désastre !

Comment est-ce possible ?

Le code du conseiller expert est aussi simple que possible :

Comment un seul et même programme peut-il fonctionner "à chaque fois" ? Je ne comprends pas...

Dans quelle direction regardez-vous le tableau des commandes ?

S'il y a des fermetures/suppressions possibles pendant la "révision", il est préférable de regarder dans la direction opposée. De OrdersTotal()-1 à 0 inclus.

Sinon, vous risquez de marcher dessus :-)


 
Artyom Trishkin:

Quelle est cette fonctionnalité ?

Cette fonction m'a été gracieusement offerte par Goldtrader, ce dont je lui suis sincèrement reconnaissant.

//+------------------------------------------------------------------+
//| Calculate Market Orders function                                 |
//+------------------------------------------------------------------+
int TotalOrders(string sy) {    // sy - Currency Pair
int orders=0;
   for (int i=0; i<OrdersTotal(); i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol()==sy) {
           if (OrderType()==OP_SELL || OrderType()==OP_BUY) {
             orders++;
           }
         }
       }
     }
return(orders);
}

Il vous permet d'ouvrir des ordres simultanément pour différentes paires de devises.

:))) À mon avis, c'est ce qui a tout déclenché, car je l'ai activé il y a environ un mois... Sans elle, je ne peux pas voir le Graal.

Il y a un problème ?

 

Il y a quelque chose qui ne va vraiment pas, cependant...

Je veux dire, je faisOrderSelect une fois et ensuite à partir de la fonction... Ça n'a pas de sens...

Raison: