Boucles et fermeture ou suppression d'ordres - page 4

 
ggekko:

Salut les experts, quel est votre avis sur cette solution ?

while(OrdersTotal()>0)
Cela signifie qu'elle est incompatible avec tous les autres EA (y compris elle-même) et le trading manuel. (Trades sur d'autres graphiques)
 
WHRoeder:
ggekko:

Salut les experts, quel est votre avis sur cette solution ?

Cela signifie qu'elle est incompatible avec tous les autres EA (y compris elle-même) et le trading manuel. (Trades sur d'autres graphiques)

Bien sûr. C'est une fermeture totale.

Il y a parfois des situations (par exemple, vous voulez fermer immédiatement trop de transactions ouvertes) où la version "originale" ne fonctionne pas. Cette version est bonne pour cela.

 
ggekko:

Bien sûr. Il s'agit d'une fermeture totale.

Il existe parfois des situations (par exemple, vous souhaitez clôturer immédiatement un trop grand nombre de transactions ouvertes) dans lesquelles la version "originale" ne fonctionne pas. Cette version est idéale pour cela.

Pourquoi n'essayez-vous pas de réagir aux erreurs ? Ne devriez-vous pas analyser l'erreur et réagir en conséquence ? Pour certaines erreurs, vous pouvez réessayer, pour d'autres, vous devez arrêter d'essayer.
 

Bonjour,


J'ai une question sur les boucles while. Je veux exécuter l'EA actuel dans une boucle aussi souvent que possible. Donc, mon idée est de placer le code actuel dans une boucle while avec une fonction sleep incluse à l'intérieur qui fait que le while ne s'exécute que toutes les 1 millisecondes.


Cependant, lorsque j'ai fait cela, (j'ai quelques appels de fonction Print("...") qui gardent la trace de ce qui se passe dans chaque boucle), je vois ce gel, et plus aucune impression à l'écran.

Je me demande quel peut être le problème. Est-il possible d'exécuter l'EA sur une boucle aussi fréquente que 1ms ? Y aurait-il un problème si l'on essayait d'obtenir du serveur le dernier cours acheteur et vendeur à chaque milliseconde ? La charge serait-elle trop importante, ce qui provoquerait le blocage ?

Il est possible qu'une autre action de mon algorithme soit à l'origine de ce problème, je n'en suis pas sûr.


Je l'ai fait tourner sur des cycles de 200 ms et j'ai toujours le même problème (mais pas aussi immédiat). Pourrait-il y avoir un problème d'impression de trop de lignes dans le fichier journal ?



Merci pour tout conseil à ce sujet.

Salutations,


C.

 
Peut être un problème de code - mais sans connaître le code ?
 

14967057:

J'ai une question sur les boucles while. Je veux exécuter l'EA actuel dans une boucle aussi souvent que possible.

Je pense donc mettre le code actuel dans une boucle while avec une fonction sleep incluse qui fait que le while ne s'exécute que toutes les 1 millisecondes.

Y aurait-il un problème à essayer d'obtenir le dernier cours acheteur/ vendeur.

Y aurait-il un problème d'impression de trop de lignes dans le fichier journal ?

  1. Ce fil de discussion portait sur la fermeture et la suppression des ordres. Ne détournez pas les fils de discussion pour des questions hors sujet. Postez-en un nouveau.
  2. Pourquoi voulez-vous boucler en permanence ? Rien ne change. Tout ce que vous faites est de gaspiller du temps CPU.
  3. Retournez au départ et lorsque l'offre et la demande changeront, votre départ sera appelé aussi vite que possible.
  4. Oui, vous avez rempli toute la mémoire vive disponible avec les lignes, plus vite que Windows ne peut les mettre sur le disque. Tous les programmes sont sortis en pagination. Tout se bloque.
 

Salut,

Il s'avère que le problème que j'avais n'était pas dû à l'encapsulation de mon code EA dans une boucle while avec un sleep de 1ms. Cette partie semble bien fonctionner (indépendamment de l'endroit où j'imprime à l'écran ou non) comme je l'ai fait fonctionner depuis une demi-heure sans problème.


Le problème était dû à un autre while sournois que j'avais dans le code et qui a fini par piéger l'EA dans une boucle infinie.

Merci pour les commentaires de Gooly et Roesder.

Salutations,

 

Bonjour à tous. J'ai lu ce sujet et j'ai une question. J'essaie de faire un code, qui supprime l' ordre en attente (seulement STOP, pas LIMIT), mais seulement si un autre ordre en attente a été activé (début être OP_SELL ou OP_BUY). Le code est donc le suivant (mais il y a des erreurs, mais je ne sais pas où). Pourriez-vous regarder mon code s'il vous plaît ?

 bool   result;
   int   i, j, cmd, cmd2,total;

   total=OrdersTotal();

   for(i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         cmd=OrderType();
         
         if(cmd!=OP_BUYSTOP && cmd!=OP_SELLSTOP)  //take an orders which was activated 
           {
           for(j=0; j<total; j++)   //another variable j 
     { 
     if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)){ cmd2=OrderType();
     if(cmd2!=OP_BUY && cmd2!=OP_SELL)
           {
            
            OrderPrint();
            
            result=OrderDelete(OrderTicket());  //first pending order become to OP_SELL or OP_BUY, second pending order will be delete
            if(result!=TRUE) Print("LastError = ", GetLastError());
            break;
           }
        }
       }
     }
     }
   }
 

OrdersTotal() pas correct...

J'ai été surpris par une séquence de code en boucle qui utilise OrdersTotal() ne donnant pas de résultats corrects (observé avec deux courtiers différents).

J'utilise la version 1090 de MT4 sur un bureau Linux Ubuntu-MATE 16.04, avec WINE 3.0.

Voici ce que j'ai utilisé...

for(int cc = 0 ; cc < OrdersTotal() ; cc++)
{
if (!OrderSelect(cc, SELECT_BY_POS, MODE_TRADES) ) continue ;
si (OrderSymbol() != Symbol() ) continuez ;
if (OrderType() > 1) continue ; //--ignorer les transactions en attente

OpenTradecnt++ ; //--compte de toutes les positions en direct de ce symbole qui existent.
Print("le nombre de transactions ouvertes de ce symbole est : ", OpenTradecnt) ;
}

J'ai remarqué avec deux courtiers différents que la valeur de OrdersTotal() ne correspond pas toujours à ce qui est affiché dans l'onglet 'Trade' du courtier MT4. Au départ, j'ai pensé que c'était le courtier qui empêchait OrdersTotal() de fonctionner correctement. Lorsque j'ai remarqué que sur le second courtier, j'ai commencé à me demander si MT4 avait un 'problème' interne, ou si mon code était erroné OU si c'était un problème de synchronisation de MT4 avec le serveur.... ?

Après avoir lu ce fil de discussion du forum, je me demande si j'aurais un changement dans les résultats en changeant la boucle for..en lecture :

for(int cc = OrdersTotal() - 1 ; cc >= 0 ; cc--)
{
...........
}

OU, existe-t-il un drapeau ou une ligne de code permettant de s'assurer que la fonction OrdersTotal() est correctement synchronisée lors d'un événement OnTick() ?

Toute clarification à ce sujet serait très utile et serait grandement appréciée !

 

Veuillez utiliser le bouton </> pour insérer votre code.