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

 
Fernando Carreiro:

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 les 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 !

Merci beaucoup de m'avoir aidé avec mon code jusqu'à présent et de votre temps, je vais essayer de faire les ajustements nécessaires.
 
Keith Watford:

    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 du code relative à l'ordre de fermeture pour qu'elle soit logique, vous ne devriez pas du tout utiliser la variable ticket ici.
Lors de l'écriture de ce code, la variable ticket n'était pas présente, je voulais juste voir si le fait de la mettre là aurait un impact sur la façon dont le code fonctionne.
 
Matt_Townsend:
Je vous remercie beaucoup de m'avoir aidé avec mon code jusqu'à présent et de votre temps, je vais essayer de faire les ajustements nécessaires.

Parce que vous avez trop de problèmes de logique dans votre EA, je vous suggère de jeter un coup d'œil sur l'exemple de code de MetaQuotes, à savoir"Moving Average.mq4" et/ou "MACD Sample.mq4" et de construire sur cette base, jusqu'à ce que vous compreniez les principes de base du fonctionnement d'un EA.

J'ai joint les fichiers, mais vous les trouverez dans votre dossier "MQL4\Experts".

Dossiers :
 
Fernando Carreiro:

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 de détails de l'ordre comme OrderTicket() dans votre clôture, qui pourrait échouer si l'OrderSelect() initial échoue aussi.

Après avoir remarqué votre édition.....

J'avais toujours supposé qu'un OrderSelect() serait perdu lorsqu'il y a un nouveau tick.

J'ai donc vérifié et j'ai constaté qu'une fois qu'un ordre est sélectionné, il reste sélectionné même lors des nouveaux ticks suivants.

J'apprends quelque chose de nouveau chaque jour :)

 
Keith Watford: Après avoir remarqué votre édition.....

J'avais toujours supposé qu'un OrderSelect() serait perdu lorsqu'il y a un nouveau tick.

J'ai donc vérifié et j'ai découvert qu'une fois qu'un ordre est sélectionné, il le reste même lors des nouveaux ticks suivants.

J'apprends quelque chose de nouveau chaque jour :)

En pratique cependant, cela n'est pas très utile car ces détails sont gelés dans le temps, donc des choses comme OrderClosePrice() ne seront pas mises à jour jusqu'à ce que vous le sélectionniez à nouveau !
 
L'utilisation directe de OrdersTotal et/ou l'absence de filtrage du nombre magique dans votre boucleOrderSelect signifie que votre code est incompatible avec tous les EA (y compris lui-même sur d'autres graphiques et le trading manuel). Symbol Doesn't equal Ordersymbol when another currency is added to another separate chart . - Forum MQL4
 
Fernando Carreiro:

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, 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 !


    for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
         //---Check Order Type
         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }
      if(OrderType()==OP_SELL)
        {
          if(fastma > slowma)
          {
             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
            
          }
          else
               Print("Error : ", GetLastError());
               return(0);
          break;
        }

      } 

Voici la section OrderClose, je n'obtiens plus l'erreur de ticket invalide, mais j'obtiens maintenant un prix invalide.

Voici ce qui se passe directement dans le journal

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1 : prix invalide 1.05454000 pour la fonction OrderClose


 
Matt_Townsend:

           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }

...

         {

             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);

 

Voici la section OrderClose, je n'obtiens plus l'erreur de ticket invalide, mais j'obtiens maintenant un prix invalide.

Voici ce qui se passe directement dans le journal

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1 : prix invalide 1.05454000 pour la fonction OrderClose


N'utilisez pas Bid/Ask lors de la fermeture, utilisez OrderClosePrice(). Ce sera automatiquement le bon prix.
 
Alain Verleyen:
N'utilisez pas Bid/Ask lors de la fermeture, utilisez OrderClosePrice(). Ce sera automatiquement le bon prix.

Dois-je simplement le remplacer dans la fonction OrderClose ? Et si oui, dois-je supprimer le OrderClosePrice dans la fonction d'impression qui se trouve en dessous ?

Modifier :

C'est ce que je viens de faire, mais maintenant il ne maintient aucune position ouverte. Il se contente d'ouvrir et de fermer des positions, bien qu'il n'y ait maintenant aucun problème à travailler sur plusieurs paires.

 

         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }

Il n'y a pas de besoin pour les retours ou la pause car vous devez compléter la boucle.

De plus, votre impression d'erreur dépend de


           if(fastma < slowma)


est fausse, et n'est pas liée à l'échec de la fonction OrderClose().



   if(OrderType()==OP_BUY)
     {
      if(fastma<slowma)
        {
         if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
            Print("Order Closed : ",OrderClosePrice());
         else
            Print("Error : ",GetLastError())
        }
     }


Raison: