Problème de commandes multiples

 

Bonjour à tous,

J'ai un problème avec mon code. Quand un ordre (d'achat ou de vente) s'ouvre, d'autres viennent à la suite.

Ce que j'essaie de faire est

si le dernier ordre est un ordre de vente, ouvrir un ordre d'achat lorsque le prix est supérieur au prix d'ouverture de l'ordre plus quelques pips (ReturnDist).

Si le dernier ordre est un ordre d'achat, alors j'ouvre un ordre de vente lorsque le prix est inférieur au prix ouvert moins quelques pips.

Quelqu'un peut-il m'aider ?

Merci d'avance

Luis

Dossiers :
 
luisneves:

Bonjour à tous,

J'ai un problème avec mon code. Quand un ordre (d'achat ou de vente) s'ouvre, d'autres viennent à la suite.

Ce que j'essaie de faire est

si le dernier ordre est un ordre de vente, ouvrir un ordre d'achat lorsque le prix est supérieur au prix d'ouverture de l'ordre plus quelques pips (ReturnDist).

Si le dernier ordre est un ordre d'achat, alors j'ouvre un ordre de vente lorsque le prix est inférieur au prix ouvert moins quelques pips.

Quelqu'un peut-il m'aider ?

Merci d'avance

Luis

Quel est votre plan pour le restreindre ?

Vous initialisez OpenOpposite avec 1.

int    Ticket,total,OpenOpposite=1,UseSlippage,i;

A chaque tick, vous appelez OpenOppositeOrder()

   int start()
     {
      if (OrdersTotal()==0)GoToOpen();
       else GoToClose();      
      if(OpenOpposite>0)OpenOppositeOrder(); //<-- here 
      if(OrdersTotal()>0)OpPendingDel();
      
     }

Je ne vois aucune autre référence à OpenOpposite.

La boucle for dans OpenOppositeOrder ne présente aucune restriction d'après ce que j'ai vu jusqu'à présent... devrait-elle l'être ?

À votre avis, où se trouve l'erreur dans votre code ?

 

Salut Kronin,

Avant tout, merci pour votre réponse rapide.

Désolé pour le désordre mais ce que j'ai essayé de faire était d'avoir des blocs de code indépendants.

Donc, j'ai nettoyé la ligne que vous avez marquée et la partie supérieure qui dit void OpenOpposite () et maintenant vient quelques erreurs comme ;

expression on global scope not allowed,etc.

Si je ne prends pas trop de votre temps, pouvez-vous m'aider ?

Merci

Luis



 
luisneves:

Salut Kronin,

Avant tout, merci pour votre réponse rapide.

Désolé pour le désordre mais ce que j'ai essayé de faire était d'avoir des blocs de code indépendants.

Donc, j'ai nettoyé la ligne que vous avez marquée et la partie supérieure qui dit void OpenOpposite () et maintenant vient quelques erreurs comme ;

expression on global scope not allowed,etc.

Si je ne prends pas trop de votre temps, pouvez-vous m'aider ?

Merci

Luis

Je n'ai pas dit que vous deviez nettoyer quoi que ce soit. Je voulais juste savoir où vous essayez d'empêcher l'EA d'ouvrir plus d'un ordre.

Essayez ceci (je ne l'ai pas testé) :

Changez la fonction de départ en (Peut-être que vous devez filtrer pour les ordres ouverts sur le marché seulement -> selon votre stratégie) :

   int start()
     {
      if(OrdersTotal()==0){GoToOpen();OpenOpposite=0;} //<-- set OpenOpposite to 0 if no order is open (pending and market)
      else GoToClose();      
      if(OpenOpposite==0)OpenOppositeOrder();          //<-- only run OpenOpositeOrder, if OpenOpposite is 0.
      if(OrdersTotal()>0)OpPendingDel();      
     }

Ajoutez un compteur OpenOpposite à la fonction OpenOppositeOrder() :

         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY  && Ask < (OrderOpenPrice()- ReturnDist*pt))
               {                
               Ticket = OrderSend(Symbol(), OP_SELL, mlots, SellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  OpenOpposite++;
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError());
                  }
               }
               
            if(Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt))
               {               
               Ticket = OrderSend(Symbol(), OP_BUY, mlots, BuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  OpenOpposite++;
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }

Cela devrait résoudre le problème des ordres multiples ouverts à la suite. Cela limite l'EA à ouvrir plus d'un ordre (opposé).

 
luisneves:

Bonjour à tous,

J'ai un problème avec mon code. Quand un ordre (d'achat ou de vente) s'ouvre, d'autres viennent à la suite.

Pourquoi avez-vous besoin d'un deuxième fil de discussion sur le même morceau de code ?

RaptorUK:

En regardant votre code, je trouve qu'il est très difficile de suivre ce que vous essayez de faire, je vois très peu de commentaires pour m'aider, votre fonction start() ne me montre pas ce que vous essayez de faire à chaque tick, vous n'avez pas de disposition cohérente de l'indentation.


Extrait de ce fil de discussion: https://www.mql5.com/en/forum/142629 page 3

 
RaptorUK:

En regardant votre code, je trouve qu'il est très difficile de suivre ce que vous essayez de faire, je vois très peu de commentaires pour m'aider, votre fonction start() ne me montre pas ce que vous essayez de faire à chaque tick, vous n'avez pas de disposition cohérente de l'indentation.

Je suis d'accord avec cela. Je n'ai pas vérifié autre chose que le problème des ordres multiples, car le code n'est pas facile à lire. On dirait que certaines parties du code sont copiées et collées à partir d'un autre code, écrit par quelqu'un d'autre. Il vaut mieux écrire vos propres fonctions avec votre propre style (cohérent).

 
kronin:

Je n'ai pas dit que vous deviez nettoyer quoi que ce soit. Je voulais juste savoir, où vous essayez d'empêcher l'EA d'ouvrir plus d'un ordre.

Essayez ceci (je ne l'ai pas testé) :

Changez la fonction de départ en (Peut-être que vous devez filtrer pour les ordres ouverts sur le marché seulement -> selon votre stratégie) :

Ajoutez un compteur OpenOpposite à la fonction OpenOppositeOrder() :

Cela devrait résoudre le problème des ordres multiples ouverts à la suite. Il limite l'EA à ouvrir plus d'un ordre (opposé).


Bonjour Kronin,

Merci pour votre réponse rapide à mon problème. Ce que j'essaie d'obtenir est une condition pour ouvrir des ordres comme celui-ci ;

La première ouverture au moyen d'un indicateur est un achat (qui peut être une vente bien sûr) et ensuite un ordre d'achat est ouvert, si le prix rebondit à un niveau inférieur au prix d'ouverture de l'ordre d'achat, un ordre de vente sera ouvert, mais si le prix remonte, aucun nouvel ordre d'achat ne doit être ouvert. Ici, un nouvel ordre d'achat ne devrait avoir lieu que lorsque le prix rebondit après l'ordre de vente. Cela ne change rien si un ordre de vente est le premier à se produire.
J'ai essayé d'obtenir cela avec le code suivant, mais cela ne fonctionne pas. Ici, ce qui fonctionne, c'est quele premier ordre qui s'ouvre est un ordre d'achat, puis, comme prévu, un ordre de vente s'ouvre, mais à partir de là, aucun autre ordre ne s'ouvre...

J'ai ces deux blocs de code et il semble que le premier fasse ce qui est attendu : ouvrir un ordre d'achat ou de vente si les conditions définies par l'indicateur sont réunies. Une fois qu'un ticket d'ordre
est reçu alors une modification d'ordre est en place pour envoyer des limites d'ordre.

J'utilise BuyTicket et SellTicket dans le code pour éviter l'ouverture d'ordres multiples mais il semble que ce ne soit pas la bonne méthode à suivre...

// Buy Order Condition to Open

  if(Volume[0] > volume_previous + OpenDistance*pt && BuyTicket == 0)                       
          {//5  
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)
        {//6
         Print("Opposite Buy order placed # ",BuyTicket);
         AddLimitsBuy();        
         }//6
      else
         {//7 
         Print("Order Send failed, error # ", GetLastError());
         }//7 
         
      return(0);
      }//5
  //-----------------------------------------------------------------------------+      
  
  // Sell Order Condition to Open

  if(Volume[0] < volume_previous - OpenDistance*pt && SellTicket == 0)                   
     {//8                                 
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                                                
          SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,RealSlippage,0,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket > -1)
                  {//9
        Print("Opposite Sell order placed # ", SellTicket);
        AddLimitsSell();       
        }//9
     else
        {//10
        Print("Order Send failed, error # ", GetLastError());
        }//10      
     return(0);
     }//8                       


Le code suivant identifie les ordres ouverts et les filtre pour acheter le symbole, le numéro magique et le type d'ordre. Une fois qu'il détecte le dernier ordre ouvert dans le pool et si la condition d'ouverture (en considérant que le dernier ordre est un achat) et confirme qu'un ticket de vente n'est pas présent, alors un ordre de vente est ouvert. De même si le dernier ordre est un ordre de vente. Et ici le code fonctionne.

Un problème survient lorsqu'une condition d'ouverture d'un troisième ordre survient et ainsi de suite. Ici pourtant les conditions d'ouverture sont présentes et le code a bien fonctionné avec la deuxième ouverture pourquoi le code ne fonctionne-t-il pas ici ?

int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {//14
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {//15
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//16
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0)
               {//17               
               SellTicket = OrderSend(Symbol(), OP_SELL, MLots, Bid, RealSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(SellTicket > -1) 
                  {//18
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }//18
               else
                  {//19
                  Print("Order Send failed, error # ", GetLastError() );
                  }//19
                }//17
                           
            if(Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0)
               {//20             
               BuyTicket = OrderSend(Symbol(), OP_BUY, MLots, Ask, RealSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(BuyTicket > -1)
                  {//21
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }//21
               else
                  {//22  
                  Print("Order Send failed, error # ", GetLastError());
                  }//22   
               }//20
            }//16
         }//15    
      }//14

Le code complet est joint au cas où vous auriez besoin de voir ce que j'essaie d'expliquer.

Veuillez prendre en compte le fait que d'autres problèmes sont encore en cours de résolution et que certains codes peuvent sembler bizarres, c'est le cas pour la façon dont j'ouvre les ordres car je n'ai pas encore appris comment ouvrir des ordres basés sur l'offre plus et moins la distance.

J'apprécie vraiment si vous pouvez m'aider.


Meilleures salutations
Luis

Dossiers :
 
Savez-vous ce que Volume[0] vous donne ? Comment ajouter une valeur de point à cela peut-il avoir un sens ?
 

Salut Raptor,

Tu as raison !

Je suis toujours en train d'apprendre et j'essaie plusieurs façons d'obtenir ce dont j'ai besoin et parfois des choses stupides se produisent.

J'ai essayé d'utiliser un objet pour le placer au niveau de l'offre et ensuite utiliser cette position pour ouvrir des ordres, cela semble mieux que cette méthode. L'un des principaux problèmes est la façon de limiter les nouvelles ouvertures tant que l'ordre ouvert n'est pas fermé.

Je sais que j'ai beaucoup à apprendre et que l'essai par erreur est un moyen que j'ai trouvé pour mieux comprendre comment cela fonctionne en pratique. Bien que je fasse de mon mieux pour comprendre les informations contenues dans les livres et la documentation, je me sens parfois perdu et j'essaie d'obtenir l'aide des autres. Ici, au Portugal, il est très difficile d'obtenir des cours sur ce sujet et je suis donc entièrement tributaire de la bonne volonté, de la patience et de l'assertivité des autres pour obtenir de l'aide et des conseils. Quand cette aide arrive, je fais de mon mieux pour comprendre, mais parfois je ne peux pas m'en accommoder.

En tout cas, je vous remercie de m'avoir montré que le volume n'est pas le moyen d'obtenir ce type d'indicateur.

Meilleures salutations

Luis

 
luisneves:

Salut Raptor,

Tu as raison !

Je suis toujours en train d'apprendre et d'essayer plusieurs façons d'obtenir ce dont j'ai besoin et parfois des choses stupides se produisent.

J'apprécie que vous essayiez et que vous essayiez d'apprendre aussi, peut-être devriez-vous d'abord essayer de créer une EA plus simple et travailler avec jusqu'à ce que vous compreniez comment lui faire faire ce dont vous avez besoin, essayez quelques choses, ajoutez quelques instructions Print, voyez ce qui se passe, de cette façon vous apprendrez et comprendrez, puis quand vous en saurez plus vous pourrez ajouter plus à votre EA. Vous devez avoir une idée claire de ce que vous voulez que votre EA fasse avant de le coder, trop de fonctionnalités à la fois ne facilitera pas ce processus de réflexion.

Une autre chose qui peut vous aider, c'est d'essayer de décomposer les tâches en modules que vous pouvez réutiliser avec d'autres EA, puis de coder ce module, en tant que fonction définie par l'utilisateur, dans le cadre d'un script ou d'une EA simple pour le tester et s'assurer qu'il fonctionne et qu'il est robuste... Vous pouvez ensuite utiliser cette fonction en toute confiance dans une EA en sachant qu'elle fonctionne.
 

Bonjour RaptorUK,

Merci pour votre réponse honnête. J'ai déjà essayé de briser les tâches et d'autres types de problèmes commencent à apparaître, c'est pourquoi je commence à tout mettre ensemble (et d'autres problèmes commencent....).

J'ai déjà essayé de faire d'autres EAs et cela a bien fonctionné, mais maintenant en utilisant cette approche sans l'utilisation d'indicateurs (standards) les choses se compliquent.

Le truc c'est que maintenant je suis complètement perdu. Je pensais que la façon dont je vois le code de travail tick par tick en théorie qui devrait fonctionner et puis essayer d'obtenir des limites pour éviter les ouvertures multiples apporte les choses pire.

Donc maintenant j'ai quelques blocs de code qui fonctionnent bien, d'autres qui ont besoin d'une certaine attention pour affiner les performances et d'autres (deux) qui ne fonctionnent pas, et ici je ne sais pas comment aller d'ici...c'est aussi simple que cela et je suis totalement défendant de l'aide que les gens qui savent comment traiter avec cela. Vous êtes l'une des personnes qui a consacré plus de temps à m questions, mais même ainsi je n'ai toujours pas à cop avec certains problèmes. Si j'avais le temps d'apprendre tout le code mql et ensuite commencer à écrire basé dans beaucoup de théorie et l'expérience acquise dans le passé peut-être je n'étais pas ici.

J'ai vu un EA (pièce jointe) puis j'ai essayé de comprendre comment il fonctionne dans les parties du code qui devraient m'apporter ce que je cherche mais je n'ai pas réussi. Ce que j'ai vu, c'est qu'il utilise un code pour obtenir des ouvertures basées sur le prix plus et moins une certaine distance. Ici, lorsque j'essaie d'obtenir cela, un problème de limites se pose, puis plus rien... je n'arrive pas à faire fonctionner cela... et je n'arrive pas à comprendre pourquoi les ordres alternatifs ne fonctionnent pas comme en théorie (du moins de la manière dont je l'ai vu). Une pure disgrâce.......

Quoi qu'il en soit, ce ne sont que les mots d'un homme limité...

Meilleures salutations

Luis

Dossiers :