L'EA s'entrechoque lorsqu'on utilise plusieurs paires...

 
Tout d'abord, je sais que Raptor a déjà soulevé cette question avec moi, mais je ne peux pas me rappeler où vous l'avez écrit, et, plus important encore, comprendre où je me trompe ?

Pour autant que je sache, je l'ai écrit correctement pour que l'EA attaché à une paire correspondante puisse toujours travailler sur cette paire uniquement. En ce moment, j'ai remarqué que GBPCAD et GBPUSD ne semblent pas s'entendre, ce qui signifie que le stoploss GBPCAD pense que son calcul est effectué par la paire GBPUSD... ainsi, lorsqu'un ordre en attente est déclenché, le stoploss passe des valeurs GBPCAD au câble.....

J'utilise magicnumber==1234 ;

Si vous avez des suggestions ou si vous pensez que je suis un idiot, n'hésitez pas à me le signaler :(

//+-------------------------------------------------------------------------------------+
//| Order Buy Function                                                                  |
//+-------------------------------------------------------------------------------------+   

//Place a pending buystop if no orders exists.. pending or otherwise.
if(direction==0)
{ 
      double btp=buy_takeprofit_price;
      
      double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);

      double Lot_Step = MarketInfo(Symbol(),MODE_LOTSTEP);

      double BuyLotSize =(RiskedAmount/(pips_to_bsl/pips))/10;
      double Lots = NormalizeDouble(BuyLotSize,2);
      LotSize = MathFloor(Lots/Lot_Step)*Lot_Step;

  
      static double Stored_BuyPrice;

      if(OpenOrdersThisPair(Symbol())==0)
         {
         int BuyTicketOrder= OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);  >>>>// I am not sure if its this part? There is no way for this first OrderSend to tell what pair it is?
         if(BuyTicketOrder == -1)Print("First Buy Order Last Error = ",GetLastError());
         } 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol()) 
                   if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR)
                        {
                        Stored_BuyPrice = OrderOpenPrice();
                        DeleteOrder = OrderDelete(OrderTicket());
                        }

         if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order.
            {
            int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,Stored_BuyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);
            if(NewBuyOrder == -1)Print("New Buy Order Last Error = ",GetLastError());
            }
      }
} 
 
DomGilberto:
Tout d'abord, je sais, Raptor, que tu as déjà soulevé ce problème avec moi, mais je ne me souviens pas où tu l'as écrit et, plus important encore, je ne comprends pas où je me trompe ?

Pour autant que je sache, je l'ai écrit correctement pour que l'EA attaché à une paire correspondante puisse toujours travailler sur cette paire uniquement. En ce moment, j'ai remarqué que GBPCAD et GBPUSD ne semblent pas s'entendre, ce qui signifie que le stoploss GBPCAD pense que son calcul est effectué par la paire GBPUSD... ainsi, lorsqu'un ordre en attente est déclenché, le stoploss passe des valeurs GBPCAD au câble.....

J'utilise magicnumber==1234 ;

Si vous avez des suggestions ou si vous pensez que je suis un idiot, n'hésitez pas à me le signaler :(

Votre problème est clair, mais il peut être un peu difficile à voir en raison de la façon dont vous utilisez les accolades, l'indentation et les conditions . ... vous faites ça :

      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())                                  // if the symbol matches do . . . 
                   if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR)   //  . . . .  this
                        {
                        Stored_BuyPrice = OrderOpenPrice();                 // and this
                        DeleteOrder = OrderDelete(OrderTicket());           // and this
                        }

         if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order.   //  this happens even if the symbol didn't match . . .
            {
            int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,Stored_BuyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);
            if(NewBuyOrder == -1)Print("New Buy Order Last Error = ",GetLastError());
            }
      }

Je pense que ce que tu voulais dire était ceci...

     for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue;
           
         if( OrderType() == OP_BUYSTOP &&
            OrderMagicNumber() == MagicNumber &&
            OrderSymbol() == Symbol() )        
            {
            if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR)  
               {
               Stored_BuyPrice = OrderOpenPrice();   
               DeleteOrder = OrderDelete(OrderTicket()); 
               }

            if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder)  // If there are no open orders = place a new order. 
               {
               int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green);
               if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError());
               }
            }
         }
 
Ah ok - une si petite chose que j'ai manqué là. De plus, lorsque la première fonction OrderSend() est appelée, est-ce que je fais quelque chose de mal ? Je demande cela parce que j'essaie de réfléchir logiquement à la question de savoir si oui ou non, à ce moment-là, la paire à laquelle les commandes doivent être envoyées est connue ? C'est peut-être une question stupide, mais je ne fais rien de mal dans cette partie, n'est-ce pas ? La partie de la fonction d'envoi "BuyTicketOrder" ?

Merci d'avoir repéré cette partie pour moi :)
 
DomGilberto:
Ah ok - une si petite chose que j'ai manqué là. De plus, lorsque la première fonction OrderSend() est appelée, est-ce que je fais quelque chose de mal ? Je demande cela parce que j'essaie de réfléchir logiquement à la question de savoir si oui ou non, à ce moment-là, la paire à laquelle les commandes doivent être envoyées est connue ? C'est peut-être une question stupide, mais je ne fais rien de mal dans cette partie, n'est-ce pas ? La partie de la fonction d'envoi "BuyTicketOrder" ?

Merci d'avoir repéré cette partie pour moi :)
Symbol() est le symbole du graphique sur lequel l'EA fonctionne ... il ne peut pas se tromper, il ne peut y avoir qu'un seul symbole.
 
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

  {

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

//buy order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price.
   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_BUY)
               {
                 if(OrderStopLoss() > BuyStopPrice)break; 
                  if(OrderStopLoss() < BuyStopPrice)
                    bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(BuyModify < 0)Print(" Buy Trailing Stop Failed: ", GetLastError());
               }     

     }
//sell order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price.     
   for(int s=OrdersTotal()-1; s>=0; s--)
     {
      if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_SELL)
               {
                 if(OrderStopLoss() < SellStopPrice)break; 
                   if(OrderStopLoss() > SellStopPrice)
                    bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(SellModify < 0)Print(" Sell Trailing Stop Failed: ", GetLastError());
               }   
     }

  }
Ok - Je pense que c'est ce qui causait le problème. Je viens de mettre à jour le code sur cette partie et il semble qu'il a maintenant arrêté de clignoter sur chaque tick du câble aux prix GBPCAD... Il est maintenant bloqué sur un prix d'arrêt jusqu'à ce qu'il se mette à jour sur cette fermeture horaire ... donc je vais confirmer.

Cela vous semble-t-il correct ? Aussi, parce que j'ai ces clôtures partielles d'ordre, je suppose que je dois probablement vérifier deux fois que les accolades sont dans la bonne position par rapport à "OrderSymbol()==Symbol())" ?
 
if(OpenOrdersThisPair(Symbol()) == 0
Combien de fois voulez-vous l'appeler ? Pour chaque ordre (votre code) ? Pour chaque ordre en attente sur le graphique actuel (code de RaptorUK) ? Ou UNE SEULE fois, APRÈS avoir enregistré et supprimé l'ordre en attente ?
 
DomGilberto:
Ok - Je pense que c'est ce qui a causé le problème. J'ai juste mis à jour le code sur cette partie et il semble qu'il a maintenant arrêté de clignoter sur chaque tick du câble aux prix GBPCAD... Il est maintenant bloqué sur un prix d'arrêt jusqu'à ce qu'il se mette à jour sur cette fermeture horaire ... donc je vais confirmer.

Cela vous semble-t-il correct ? Aussi, parce que j'ai ces clôtures partielles d'ordre, je suppose que je dois probablement vérifier deux fois que les accolades sont dans la bonne position par rapport à "OrderSymbol()==Symbol())" ?

Cela semble correct, oui, vérifiez toujours vos accolades, et facilitez-vous la vie autant que possible, si cela signifie ajouter des accolades, faites-le, mais essayez d'être cohérent avec les accolades et l'indentation.

Vous n'avez pas besoin de deux boucles, une seule suffit . . .

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

  {

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               //buy order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.
               if(OrderType()==OP_BUY)
                  {
                  if(OrderStopLoss() > BuyStopPrice) break; 
                  if(OrderStopLoss() < BuyStopPrice)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                   if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
                   }     

               // sell order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.     
               if(OrderType()==OP_SELL)
                  {
                  if(OrderStopLoss() < SellStopPrice) break; 
                  if(OrderStopLoss() > SellStopPrice)
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                  if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
                  }
               }   
     }

OrderModify() retourne un bool, vrai ou faux, pas un int... donc SellModify ne sera jamais inférieur à 0... J'ai écrit la même chose hier sur ForexFactory .

 

Chaque fois que l'ordre a été supprimé - ce que je veux, c'est que l'ordre en attente soit supprimé à CHAQUE clôture de barre d'une heure, puis qu'un nouvel ordre soit ouvert avec les mêmes paramètres, OU, le cas échéant, de nouveaux arrêts, de nouvelles cibles et une taille de lot basée sur "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

La seule chose que j'ai besoin de stocker pour le NOUVEL ordre en attente (après la suppression), est le prix d'entrée initial sur cette configuration particulière.(Stored_BuyPrice = OrderOpenPrice() ;)


C'est drôle parce que le premier bout de code ci-dessus est également en rapport avec un autre fil que j'étais sur le point de poster. Plutôt que de poster un nouveau sujet avec une question similaire, je vais la poser ici, si cela vous convient ? Regardez le lien ci-dessous - juste une vidéo de quelques minutes expliquant le problème que j'ai et que je trouve difficile à résoudre...

J'ai écrit tellement de code, mais je commence maintenant à me rendre compte que c'est un cas d'inefficacité que je dois réparer...

Vidéo : http://screencast.com/t/4nl8AaH8Sag

Si j'ai rendu les choses vraiment ambiguës en ne fournissant qu'une quantité limitée de code, alors je vais en ajouter d'autres ?

 
Merci Raptor - Oui, je viens de le remarquer. J'ai passé un peu de temps à nettoyer mon code, car c'était un désordre. Des erreurs d'amateur comme essayer d'utiliser des empreintes comme l'exemple que tu as donné ci-dessus lol.
 
DomGilberto:

Chaque fois que l'ordre a été supprimé - ce que je veux, c'est que l'ordre en attente soit supprimé à CHAQUE clôture de barre d'une heure, puis qu'un nouvel ordre soit ouvert avec les mêmes paramètres, OU, le cas échéant, de nouveaux arrêts, de nouvelles cibles et une taille de lot basée sur "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

La seule chose que j'ai besoin de stocker pour le NOUVEL ordre en attente (après la suppression), est le prix d'entrée initial sur cette configuration particulière.(Stored_BuyPrice = OrderOpenPrice() ;)


C'est drôle parce que le premier bout de code ci-dessus est également en rapport avec un autre fil que j'étais sur le point de poster. Plutôt que de poster un nouveau sujet avec une question similaire, je vais la poser ici, si cela vous convient ? Regardez le lien ci-dessous - juste une vidéo de quelques minutes expliquant le problème que j'ai et que je trouve difficile à résoudre...

J'ai écrit tellement de code, mais je commence maintenant à me rendre compte que c'est un cas d'inefficacité que je dois réparer...

Vidéo : http://screencast.com/t/4nl8AaH8Sag

Si j'ai rendu les choses vraiment ambiguës en ne fournissant qu'une quantité limitée de code, alors je vais en ajouter d'autres ?

Corrigez moi si j'ai mal compris ... mais pour la plupart des barres de la vidéo, vous n'avez pas eu de repli vers la 21 EMA.
 
Désolé - C'est ma faute pour ne pas l'avoir expliqué correctement. Je regarde sur D1, 4Hr et finalement 1Hr pour les MA's à écarter (parmi un tas d'autres filtres) - Une fois qu'ils sont tous alignés, sur le H1 il va attendre jusqu'à ce qu'une barre tire en arrière vers la 21 EMA UNE FOIS, et ensuite à partir de là il va placer un ordre au-dessus des sommets et un arrêt sous la 60 EMA - ATR.

Le repli sur la EMA 21 ne se produit qu'une seule fois. À partir de là, il cessera de chercher des replis vers la MME 21. Ce qu'il devrait faire cependant, c'est s'assurer que l'ordre PENDING ouvert est précisément à jour avec les lots, les stops et les prises de bénéfices APRÈS la clôture de chaque heure. Cependant, je n'arrive pas à comprendre pourquoi parfois il fonctionne parfaitement, et met à jour l'ordre en attente après chaque clôture H1, et d'autres fois il ne le fait pas ? La raison pour laquelle l'ordre en attente se met à jour est que ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) ".

Si cela n'est pas vrai, alors il ne le fera pas - CEPENDANT, il y a d'innombrables fois où cela est vrai, pourtant il ne supprimera pas l'ordre et en placera un nouveau avec les nouvelles valeurs ?

Je ne suis pas sûr que vous puissiez voir quelque chose dans ce code ci-dessus par rapport à la vidéo ? (Premier code que vous avez corrigé). J'espère que c'est plus clair ?