Problème de commandes multiples - page 4

 
luisneves:

Salut Kronin,

Votre modification fonctionne. Vous avez limité le nombre d'ordres maximum, mais est-il possible de les fermer tous à la place ?

J'ai essayé de le faire avec le code suivant, mais cela ne semble pas fonctionner.

Meilleures salutations

Luis

Hmmm, je ne suis pas sûr de comprendre ce que vous voulez dire...
Vous voulez dire qu'au lieu d'ouvrir le dernier ordre (ordre 7 si MaxOrders est fixé à 7), vous fermez tous les ordres ?

Je suis sûr que vous ne voulez pas attendre que MaxOrders soit atteint et ensuite fermer immédiatement tous les ordres. Le dernier ordre se terminerait la plupart du temps (ou tout le temps) avec une perte.
Par ailleurs, avez-vous vu le PM sur le contrôleur de spread ?

 
kronin:

Hmmm, je ne suis pas sûr de comprendre ce que vous voulez dire...
Voulez-vous dire qu'au lieu d'ouvrir le dernier ordre (ordre 7 si MaxOrders est fixé à 7), vous fermez tous les ordres ?

Je suis sûr que vous ne voulez pas attendre que MaxOrders soit atteint et ensuite fermer immédiatement tous les ordres. Le dernier ordre se terminerait la plupart du temps (ou tout le temps) avec une perte.
Par ailleurs, avez-vous vu le PM sur le contrôleur de spread ?


Salut Kronin,

Merci pour votre réponse rapide.

Disons qu'après un cycle de ping-pong de n ordres (MaxOrders) tous les ordres ouverts devraient être fermés, je sais que cela pourrait ne pas avoir de sens, mais quand même.

J'essaie d'inclure un code pour réintroduire l'ordre au cas où il échouerait et je doute que cela ait un sens car il y a déjà le code de IsContextBusy () Sleep (10). D'après ce que j'ai compris, la signification est la suivante : " si le serveur est occupé ou si un autre EA de la plateforme tente de communiquer, alors attendez 10 millisecondes et réessayez ". Je suppose donc que l'EA maintiendra ce comportement jusqu'à ce qu'un ticket ait été reçu, n'est-ce pas ?

En ce qui concerne le problème des PM, dans ce cas, il vaut mieux ne pas utiliser le test le week-end ou le faire avec la plateforme hors ligne.....

J'ai inséré la ligne 5, mais je pense que ce n'est pas nécessaire parce que la ligne 1 l'a déjà fait, n'est-ce pas ?

int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber); //1 
   if(LastClosedTicket>0)
    {                                                                 
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))
      {
      if(OrderSymbol()== Symbol() && OrderMagicNumber()== MagicNumber) //5           
       {            
         if(OrderType()==OP_BUY)
         {
         BuyAllowed=false;SellAllowed=true;
         } 
         else                   
         {
         BuyAllowed=true;SellAllowed=false;
         } 
        }   
      }
    }             
  return(0);   
  }
 
  //+---------------------------------------------------------------------------+

Un autre problème,

Dans le morceau de code suivant, les lignes en gras où se trouvent sym et mn ne doivent pas être remplacées par Symbol() et MagicNumber ?

GetTicketFromHistory

int GetTicketFromHistory(string sym,int mn,int orderposinhistory=0)// <------------------------Should replace sym and mn with Symbol () and MagicNumber ?
 {
   bool debug=false;
   if(debug)Print("Orders in history: ", OrdersHistoryTotal());
   int ticket,count=1,i;
   datetime orderclosedates[];
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(debug)Print("OrderSymbol: ",OrderSymbol(),"; OrderMagicNumber: ",OrderMagicNumber(),
                     " ;OrderType: ",OrderType(),"; OrderTicket: ",OrderTicket(),
                     "; OrderCloseTime: ",TimeToStr(OrderCloseTime()),";"); 
      if((OrderMagicNumber()  ==mn) // <---------------------------------------------------------Should replace  mn with  MagicNumber ?
         &&(OrderSymbol()     ==sym)// <---------------------------------------------------------Should replace sym with Symbol () ?
         &&(OrderType()==OP_BUY||OrderType()==OP_SELL))
         {                       
         ArrayResize(orderclosedates,count);
         orderclosedates[count-1]=OrderCloseTime();
         count++;

Ici, dans le code suivant, j'ai inséré des filtres selon vos conseils ;

(//Phil :

//Check the total amount of orders. J'ajouterais un filtre pour le marché, la magie et le symbole...//<----------- Pas sûr de ce que vous voulez dire par filtre de marché..... (Phil : ordres du marché, pas d'ordres en attente)

//.... mais je suis paresseux maintenant..... c'est quelque chose que vous devez faire.

Est-ce que c'est correct ?

int start()
 {//0 
                                         
  OTLastTick = OTCurrentTick;                      
  OTCurrentTick = OrdersTotal();
     if(OrderSymbol() == Symbol()           //<--------filter for symbol and magic number, but for market (suppose market orders can't understand how....)
      && OrderMagicNumber() == MagicNumber) //<-|
     if(OTCurrentTick == 0 && OTLastTick > 0)
      {
      BuyTrigger = Ask + OpenDistance * pt;
      SellTrigger = Bid - OpenDistance * pt;
      }             
     if(OTCurrentTick >0 )Trail();                   
     if(OTLastTick >= 2                     //<------could you comment the meaning of this line ?                            
     &&OTCurrentTick < OTLastTick
     && OTCurrentTick > 0)
     {
      CloseAllOnSL();return;
     }      
     if(OTCurrentTick >= MaxOrders)return;                                                            
     if(OTCurrentTick > 0)OpenOppositeOrder();                        
     if(OTCurrentTick == 0)
     {
      BuyAllowed = true;
      SellAllowed = true;


Meilleures salutations

Luis

 

Je ne commente pas l'utilisation des fonctions. RaptorUK l'a déjà fait quelques posts auparavant. Relisez et comprenez pourquoi vous n'avez pas besoin de changer quoi que ce soit dans le code donné. Encore mieux, comprenez pourquoi vous pouvez l'utiliser tel quel dans d'autres EAs.

OrdersTotal() donne une quantité d'ordres. Vous voulez probablement savoir si les ordres appartiennent à votre EA ou au trading manuel ou si les ordres sont en attente ou déjà sur le marché. Je créerais une fonction (int) qui renvoie le nombre d'ordres que l'EA a créé.

if(OTLastTick >= 2 //<------pourriez-vous commenter la signification de cette ligne ?
Si vous n'avez qu'un seul ordre ouvert (moins de 2), cela n'a aucun sens d'appeler la fonction CloseAllOnSL..... le seul ordre ouvert n'est évidemment pas arrêté.

 
kronin:

Je ne commente pas l'utilisation des fonctions. RaptorUK l'a déjà fait quelques posts auparavant. Relisez et comprenez pourquoi vous n'avez pas besoin de changer quoi que ce soit dans le code donné. Encore mieux, comprenez pourquoi vous pouvez l'utiliser tel quel dans d'autres EAs.

OrdersTotal() donne une quantité d'ordres. Vous voulez probablement savoir si les ordres appartiennent à votre EA ou au trading manuel ou si les ordres sont en attente ou déjà sur le marché. Je créerais une fonction (int) qui renvoie le nombre d'ordres que l'EA a créés.

if(OTLastTick >= 2 //<------pourriez-vous commenter la signification de cette ligne ?
Si vous n'avez qu'un seul ordre ouvert (moins de 2), cela n'a aucun sens d'appeler la fonction CloseAllOnSL..... le seul ordre ouvert n'est évidemment pas arrêté.


Bonjour Kronin,

Merci pour votre réponse à mes questions.

J'accorderai toute mon attention à votre code ainsi qu'aux conseils de RaptorUK donnés précédemment.

Meilleures salutations

Luis

 

Salut Kronin,

Un problème est apparu et a à voir avec l'utilisation de deux EA. Si je place deux EA dans des graphiques différents et avec un numéro magique différent, ils ne fonctionnent pas en même temps. Je reçois une erreur comme uninit reason 5 mais après avoir jeté un coup d'oeil dans le forum je ne trouve pas d'information qui me mette dans la bonne direction pour traiter ce problème.

Avez-vous des informations complémentaires ?

Meilleures salutations

Luis

 
luisneves:

Salut Kronin,

Un problème est apparu et a à voir avec l'utilisation de deux EA. Si je place deux EA dans des graphiques différents et avec un numéro magique différent, ils ne fonctionnent pas en même temps. Je reçois une erreur comme uninit reason 5.

https://docs.mql4.com/constants/uninit
 

Bonjour RaptorUK,

Merci pour votre réponse rapide.

Dans le lien fourni, j'ai trouvé,

REASON_PARAMETERS5Les paramètres d'entrée ont été modifiés par l'utilisateur.

Mais avec cette information, je ne peux rien faire (pour autant que je sache). Je ne comprends pas quels paramètres d'entrée ont été modifiés. L'ea est la même, il faut seulement changer le nombre magique pour éviter les conflits entre les autres ea.

A propos, une fois que vous serez ici, pourriez-vous me dire si dans le code suivant il faut introduire un code pour que les ordres soient envoyés à nouveau alors que le ticket n'a pas été reçu, de même pour les ordres de fermeture ?

while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)

Meilleures salutations

Luis

 
luisneves:

Bonjour RaptorUK,

Merci pour votre réponse rapide.

Dans le lien fourni, j'ai trouvé,

REASON_PARAMETERS5Les paramètres d'entrée ont été modifiés par l'utilisateur.

Mais avec cette information, je ne peux rien faire (pour autant que je sache). Je ne comprends pas quels paramètres d'entrée ont été modifiés. L'ea est la même, il suffit de changer le nombre magique pour éviter les conflits entre les autres ea.

Si vous avez changé le nombre magique...

extern int    MagicNumber    = 08012013;

... et que c'est un externe, alors vous avez changé un paramètre, l'EA redémarre et donne la raison 5.

Si vous voulez exécuter votre EA sur plusieurs paires, je vous suggère de faire deux choses : d'abord, faites fonctionner votre EA correctement sur une paire, testez-le complètement pour savoir s'il fonctionne. Ensuite, introduisez un Mutex pour que vos transactions soient gérées lorsque l'autre EA n'essaie pas de faire la même chose.

 
RaptorUK:

Si vous avez modifié le nombre magique . . .

... et qu'il s'agit d'un externe, alors vous avez modifié un paramètre, l'EA redémarre et donne la raison 5.

Si vous voulez exécuter votre EA sur plusieurs paires, je vous suggère de faire deux choses : d'abord, faites fonctionner votre EA correctement sur une paire, testez-le complètement pour être sûr qu'il fonctionne. Ensuite, introduisez un Mutex pour que vos transactions soient gérées lorsque l'autre EA n'essaie pas de faire la même chose.


Salut RaptorUk,

Merci pour votre réponse au sujet de l'erreur, je suppose qu'il faut changer le nom et le numéro magique et mettre le deuxième EA dans le graphique sans fermer la plateforme.

En ce qui concerne l'autre question sur les ordres de réentrée, cela a à voir avec un échec dans la fermeture de l'ordre qui a retourné une erreur comme timeout. C'est pourquoi je ne sais pas si le code tel qu'il est va réentrer l'ordre de fermeture ou l'ordre d'envoi.

Meilleures salutations

Luis

 
luisneves:


Salut RaptorUk,

Merci pour votre réponse au sujet de l'erreur, je suppose que j'ai changé le nom et le numéro magique et mis la deuxième ea dans le graphique sans fermer la plate-forme.

En ce qui concerne l'autre question sur les ordres de réentrée, cela a à voir avec un échec dans la fermeture de l'ordre qui a retourné une erreur comme timeout. C'est pourquoi je ne sais pas si le code tel qu'il est va réentrer la fermeture de l'ordre ou l'envoi de l'ordre.

Meilleures salutations

Luis

Lisez les codes d'erreur d'exécution et mettez votre code en conformité avec les informations qui y sont données, par exemple . . .

ERR_TRADE_TIMEOUT128Le délai d'attente pour la transaction a été atteint. Avant de réessayer(au moins, en 1 minute), il est nécessaire de s'assurer que l'opération de trading n'a pas vraiment réussi (une nouvelle position n'a pas été ouverte, ou l'ordre existant n'a pas été modifié ou supprimé, ou la position existante n'a pas été fermée)