EA pour chaque paire de devises - quel code pour ouvrir une seule fois par paire de devises ? - page 3

 

J'ai changé le mécanisme de fermeture de :

for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose()

à

for (int k = 0; k < OrdersTotal(); k ++) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

et maintenant tout fonctionne comme prévu. Même si je ne comprends pas pourquoi. Parce que je ne comprends vraiment pas les lignes supplémentaires dans le deuxième code. Mais merci les gars !

 
grey.unit:

Je change le mécanisme de fermeture de :

à

et maintenant tout fonctionne comme prévu. Merci à vous tous !

Cela ne fonctionnera probablement pas toujours... Lorsque vous fermez des ordres ouverts ou supprimez des ordres en attente dans une boucle, vous DEVEZ compter vers le bas et non vers le haut... Vous devez modifier votre boucle. Et vous devez remettre la chaîne dans Symbol()... sinon l'EA pour EURUSD finira potentiellement par fermer des ordres pour GBPUSD... ce que vous deviez faire était de vous débarrasser de la chaîne continue. .. ou de transformer le == en !=...
 
grey.unit:

J'ai changé le mécanisme de fermeture de :

à

et maintenant tout fonctionne comme prévu. Même si je ne comprends pas pourquoi. Parce que je ne comprends vraiment pas les lignes supplémentaires dans le deuxième code. Mais merci les gars !

Votre deuxième code est correct mais un peu bizarre. Ouvrez MetaEditor, fenêtre de navigation (Ctrl + D), onglet dictionnaire, et sélectionnez MQL4 Reference > Standard constants > Trade operations.

 
RaptorUK:
Cela ne fonctionnera probablement pas toujours... Lorsque vous fermez des ordres ouverts ou supprimez des ordres en attente dans une boucle, vous DEVEZ compter vers le bas et non vers le haut... vous devez modifier votre boucle. Et vous devez remettre la chaîne dans Symbol() ... sinon l'EA pour EURUSD finira potentiellement par fermer des ordres pour GBPUSD ... ce que vous deviez faire était de vous débarrasser de la chaîne continue . .. ou de transformer le == en !=.

Juste pour que tu comprennes bien. Ce que vous dites, c'est que si je modifie le premier code en :

for (int j = 0; j < OrdersTotal(); j --) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())       // Another security    
                 {

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

alors cela devrait aussi fonctionner ?? Parce que j'ai essayé cela et cela ouvre juste un ordre par paire de devises à nouveau.

Ou si je modifie le deuxième code en (k++ à k--), cela ouvre également une seule transaction par paire de devises.

for (int k = 0; k < OrdersTotal(); k --) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   
 
grey.unit:

Juste pour que tu comprennes bien. Ce que vous dites, c'est que si je modifie le premier code en :

alors cela devrait aussi fonctionner ?? Parce que j'ai essayé cela et cela ouvre juste un ordre par paire de devises à nouveau.

Ou si je modifie le second code en (k++ à k--), il n'ouvre également qu'une seule transaction par paire de devises.

Je parle du premier code, la boucle que vous utilisez pour fermer les ordres... elle doit se décrémenter... sinon vous manquerez des ordres. . sinon vous manquerez des ordres. Je vois que vous avez supprimé le continue et ajouté des accolades { }, très bien :-)

Ouvrir un ordre par paire de devises ou un ordre au total ?

 
RaptorUK:

Ouvrir un ordre par paire de devises ou un ordre au total ?

Oui, au total bien sûr. Ok 2ème code :


for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

Quand on parle de la boucle, je pense que tu veux dire ceci :

for (int j = 0; j < OrdersTotal(); j ++)

En fait, je la changerais en quelque chose comme ça :

for (int j = OrdersTotal()+1 ; j > OrdersTotal(); j --) 
   {

Cette ligne n'ouvre qu'un seul ordre par paire de devises (comme souhaité !).

Est-ce que la boucle est correcte en ce qui concerne ce problème maintenant ?

RaptorUK:

Cela ne fonctionnera probablement pas toujours... Lorsque vous fermez des ordres ouverts ou supprimez des ordres en attente dans une boucle, vous DEVEZ compter vers le bas et non vers le haut... vous devez modifier votre boucle. Et vous devez remettre la chaîne dans Symbol() . . . sinon l'EA pour EURUSD finira potentiellement par fermer des ordres pour GBPUSD . . . ce que vous deviez faire, c'était vous débarrasser du continue . . . ou transformer le == en !*.. . ou transformer le == en !=
 
grey.unit:

Oui, au total bien sûr. Ok, deuxième code :


Quand on parle de la boucle, je pense que tu veux dire ça :

En fait, je la changerais en quelque chose comme ça :

Cette ligne n'ouvre qu'un seul ordre par paire de devises (comme souhaité !).

Est-ce que la boucle est correcte en ce qui concerne ce problème maintenant ? :

Non, faites ceci . . .

for (int j = OrdersTotal()-1 ; j >= 0 ; j --)   // start at OrdersTotal() -1 ,  finish when j = 0

La première position de l'ordre est 0, donc si vous avez 5 ordres, les positions sont 0, 1, 2, 3, 4 ... donc la dernière est OrdersTotal() - 1 ... donc pour décompter, vous commencez à OrdersTotal()-1 et finissez à 0.

 
Ok, merci beaucoup pour votre aide !
 
RaptorUK:

Non, faites ceci...

La première position de l'ordre est 0, donc si vous avez 5 ordres, les positions sont 0, 1, 2, 3, 4... donc la dernière est OrdersTotal() - 1... donc pour décompter, vous commencez à OrdersTotal()-1 et finissez à 0.

Donc ça devrait ressembler à ça :

for (int j = OrdersTotal()-1 ; j = 0 ; j --) 

parce que vous avez écrit ceci :

for (int j = OrdersTotal()-1 ; j >= 0 ; j --) 

ou est-ce que je me trompe ?

 
grey.unit:

Donc ça devrait ressembler à ça :

parce que vous avez écrit ceci :

ou je me trompe ?

Vous avez tout faux. Votre code ne sera jamais exécuté ! !!. Utilise celui de RaptorUK.
Raison: