L'EA ne fonctionne pas sur plusieurs paires, besoin d'aide

 
Je suis très novice dans le codage de mql4, et j'ai terminé mon premier EA. Mon seul problème maintenant est que je n'arrive pas à ouvrir des transactions sur plus d'une paire. Dans la section EA sur le terminal à côté de journal, il envoie un flux de l'erreur, invalid ticket for orderclose function, même si l'EA ouvre et ferme des trades très bien sur une paire. Quelqu'un pourrait-il m'aider ?
 
Matt_Townsend:
Je suis très novice dans le codage de mql4, et j'ai terminé mon premier EA. Mon seul problème est que je n'arrive pas à ouvrir des positions sur plus d'une paire. Dans la section EA sur le terminal à côté de journal, il envoie un flux de l'erreur, invalid ticket for orderclose function, même si l'EA ouvre et ferme des trades très bien sur une paire. Quelqu'un pourrait-il me donner un coup de main ?

Comment voulez-vous que nous le sachions si vous ne montrez pas votre code ni votre journal des erreurs ?

Si vous voulez que nous vous aidions, vous devez nous montrer votre code ainsi que les erreurs qu'il provoque (les résultats dans le journal). Il serait également utile de savoir sur quelles paires de devises et sur quelles périodes vous effectuez vos tests, lorsque nous examinerons votre code.

Veuillez également noter que sur MetaTrader 4, vous ne pouvez tester qu'une seule devise à la fois dans le testeur de stratégie. Si votre EA négocie plusieurs devises simultanément à partir d'un seul graphique, vous ne pourrez pas le tester dans le testeur de stratégie - uniquement sur un compte réel ou de démonstration !

 
Matt_Townsend: même si l'EA ouvre et ferme des transactions sans problème sur une paire.
C'est pourquoi je recommande
Ne pas trader plusieurs devises dans un EA
 
Matt_Townsend: Voici mon code, et j'ai le problème sur une démo live, j'ai même essayé de voir si je pouvais utiliser plusieurs terminaux, pour résoudre le problème. Merci pour vos commentaires jusqu'à présent.

Veuillez modifier votre message et utiliser le bouton SRC pour ajouter votre code ! Ne vous contentez pas de copier/coller le texte standard, car il est difficile à lire. Je suis sûr que vous pouvez voir dans d'autres fils de discussion comment cela doit être fait. Veuillez utiliser le bouton SRC pour poster votre code.

EDIT : Comme demandé auparavant - . .. Il serait également utile de savoir sur quelles paires de devises et sur quelles échelles de temps vous effectuez vos tests ...

EDIT2 : Comme demandé précédemment- ... ainsi que les erreurs qu'il donne (les résultats dans le journal) ...

 
Fernando Carreiro:
Veuillez modifier votre message et utiliser le bouton SRC pour ajouter votre code ! Ne vous contentez pas de copier/coller le texte standard, car il est difficile à lire. Je suis sûr que vous pouvez voir dans d'autres fils de discussion comment cela doit être fait. Veuillez utiliser le bouton SRC pour poster votre code.
//+------------------------------------------------------------------+
//|                     Simple Moving Average Crossover Strategy.mq4 |
//|                                                 Matthew Townsend |
//+------------------------------------------------------------------+
#property version   "1.05"
#property strict
//---

//---Inputs
extern  double Lots         =0.01;
extern  int    FastMA       =5;
input   int    FastMAMode   =MODE_EMA;
extern  int    SlowMA       =8;
input   int    SlowMAMode   =MODE_SMA;

//+----------------------------------------+
//|undesirables                            |
//+----------------------------------------+
int init()
{
   //----
   //----
   return(0);
}

int deinit()
{
   //----
   //----
   return(0);
}
//+---------------------------------------------+
//|System start                                 |
//+---------------------------------------------+
int start()
{


    double fastma, slowma;
    int    ticket, total;
    //---define Ma's
    
    fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
    slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
    
    total = OrdersTotal();
    //---Start operations
    
    if(total < 1)
    {
       if(fastma > slowma)
       {
         ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Buy order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       if(fastma < slowma)
       {
         ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Sell order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       return(0);
    }
    bool ans;
    
        
         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)
             {      
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());    
             }    
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
      if(OrderType()==OP_SELL)
        {
          while(fastma > slowma)
          {
             ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
             if(ticket < 1)
             {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("Sell order closed : ", OrderClosePrice());
              
             }
             else
               Print("Error closing order : ", GetLastError());
               return(0);
          }
          
        }
    
    return(0);
}

//+-----------------------------------------------------------------------------------+
 
Fernando Carreiro:
Je vous ai demandé de MODIFIER votre message précédent, et non d'en ajouter un nouveau, afin de ne pas allonger le fil de discussion !
Désolé, je suis également très nouveau sur ce forum, puis-je supprimer les 2 messages ?
 
Matt_Townsend:
J'ai testé sur une période d'une heure, EURUSD et GBPUSD d'une heure.
Il y a déjà deux avertissements du compilateur pour le code suivant :
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

Vous ne vérifiez pas correctement le résultat de l'opération de fermeture.

En termes de logique, il y a plusieurs problèmes avec votre EA, mais en l'état actuel des choses, il fonctionne sans aucune erreur de mon côté dans le Strategy Tester, donc veuillez fournir la liste des erreurs que vous obtenez !

 
Fernando Carreiro:
Il y a déjà deux avertissements du compilateur pour le code suivant :
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

Vous ne vérifiez pas correctement le résultat de l'opération de fermeture.

En termes de logique, il y a plusieurs problèmes avec votre EA, mais en l'état actuel des choses, il fonctionne sans aucune erreur de mon côté, donc veuillez fournir la liste des erreurs que vous obtenez !

La seule erreur que j'ai obtenue de l'EA est unticket invalide pour la fonction orderclose, avec un numéro à côté. J'aimerais montrer le journal actuel, mais sur le deuxième graphique avec l'EA en cours d'exécution, il ne fait rien, car normalement il devrait essayer d'ouvrir une transaction immédiatement. Si, et quand le journal commence à se remplir avec l'erreur, comment puis-je vous montrer le journal réel ?
 
Matt_Townsend:
La seule erreur que j'ai reçue de l'EA est unticket invalide pour la fonction orderclose, avec un numéro à côté. J'aimerais montrer le journal actuel, mais sur le deuxième graphique avec l'EA en cours d'exécution, il ne fait rien, car normalement il devrait essayer d'ouvrir une transaction immédiatement. Si, et quand le journal commence à se remplir avec l'erreur, comment dois-je faire pour vous montrer le journal réel ?

Sélectionnez les lignes en question avec Click, Ctrl-Click ou Shift-Click (opération standard de Windows), puis faites un clic droit sur la sélection et choisissez "Copy" !

EDIT : En ce qui concerne le code, vous utilisez l'OrderSelect, mais vous supposez toujours qu'il fonctionne à chaque fois. Et quand cela ne fonctionne pas, vous continuez à utiliser les fonctions détaillées de l'ordre comme OrderTicket() dans votre clôture, qui pourrait échouer si l'OrderSelect() initial échoue aussi. Comme je l'ai dit, vous avez de nombreux problèmes de logique dans votre code !

 

    bool ans;

   

         //You do not select an order

         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)                                 //Use if not while
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)                                        //ticket is a local variable and has not been assigned a value
             {     
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());   
             }   
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
Réécrivez la section de code de l'ordre de fermeture pour qu'elle soit logique, vous ne devriez pas du tout utiliser la variable ticket ici.
 
Matt_Townsend:
La seule erreur que j'ai reçue de l'EA est unticket invalide pour la fonction orderclose, avec un numéro à côté. J'aimerais montrer le journal actuel, mais sur le deuxième graphique avec l'EA en cours d'exécution, il ne fait rien, car normalement il devrait essayer d'ouvrir une transaction immédiatement. Si, et quand le journal commence à se remplir avec l'erreur, comment pourrais-je vous montrer le journal réel ?

Une autre note très importante concernant l'utilisation de votre EA sur de multiples paires de devises ou cadres temporels.

Votre code n'utilise pas la sélection du "Magic Number" et ne vérifie pas le symbole (ni le "Magic number") utilisé lors de la vérification des ordres ouverts dans l'historique. Donc, en substance, votre EA ne fonctionnera pas correctement, ni avec lui-même ni avec d'autres EA.

En l'état actuel des choses, vous ne pouvez utiliser cet EA que seul, sans aucun autre EA en cours d'exécution, même pas lui-même sur un autre graphique !

Raison: