Code simple nécessaire pour l'EA (modifier deux ordres ouverts) - page 3

 

En gros, j'ai placé deux ordres en attente à un moment précis, à savoir 23:00 GMT+2 je pense. Un des ordres en attente est un stop de vente et l'autre un stop d'achat, les deux ordres sont à une distance égale de l'ouverture de la bougie de 23:00, dans ce cas 14 pips. Les deux ordres ont un TakeProfit de 28 pips (dans ce cas) et un StopLoss de 55 pips.

Maintenant, lorsque les deux ordres sont exécutés (essentiellement en montant et en descendant de 14 pips par rapport au prix d'ouverture à la bougie de 23h00 avant que les ordres n'expirent), je veux que les deux ordres aient leurs take profits augmentés, par exemple, de 20 pips. Leur nouveau take profit est donc de 58 pips dans ce cas. Le stop loss, quant à lui, doit rester inchangé. En fait, ce que j'essaie de faire, c'est une sorte de couverture.

Si deux positions sont ouvertes, il est probable que le prix évolue dans une direction, suffisamment pour annuler les pertes si les prises de bénéfices des deux positions sont augmentées. Pour obtenir un bénéfice, il suffit qu'une seule transaction s'ouvre et atteigne le take profit ou que les deux transactions s'ouvrent et atteignent les take profits sans aller loin dans une direction.

J'espère que c'est clair, si ce n'est pas le cas, je vais fournir une image qui devrait être plus claire.

 
WHRoeder:

Je faisais référence à votre post directement précédent

madmax3 2012.03.09 14:52
Voici le code révisé pour l'ensemble de l'EA :
Qui montre toujours les problèmes que j'ai énoncés.
Cette partie du code est pour une autre partie de l'EA je crois, la partie qui ouvre les ordres en attente, cela aurait-il un effet sur la partie que j'essaie de corriger ? Désolé, je pense que j'ai confondu certaines parties du code, notamment dans le message original. J'ai cependant fait ce que vous avez indiqué pour la partie du code dont j'ai spécifiquement besoin.
 
madmax3:

J'espère que c'est clair, si ce n'est pas le cas, je vais fournir une image qui devrait être plus claire.

C'est clair, merci.

Donc vous voulez juste modifier ces ordres une fois... alors la réponse est simple. Vous devez vérifier la barre de 23:00 et déterminer les TP auxquels les ordres auraient dû être ouverts ... si les ordres sont au même TP alors ils doivent être modifiés, s'ils ne sont pas au même TP alors ils ont déjà été modifiés et n'ont pas besoin d'être modifiés à nouveau ... simple.

 
RaptorUK:

C'est clair, merci.

Vous voulez donc modifier ces ordres une seule fois... alors la réponse est simple. Vous devez vérifier la barre de 23:00 et déterminer les TPs auxquels les ordres auraient dû être ouverts ... si les ordres sont au même TP, ils doivent être modifiés, s'ils ne sont pas au même TP, ils ont déjà été modifiés et n'ont pas besoin de l'être à nouveau ... simple.

La modification et la vérification ne doivent avoir lieu que lorsque deux transactions sont ouvertes. Comment dois-je m'y prendre ? Dois-je ajouter au code que j'ai déjà ou recommencer ?

Donc, essentiellement, s'il y a deux transactions (même symbole et même numéro magique), l'EA devrait vérifier les prises de bénéfices des transactions ouvertes par rapport aux ordres en attente précédemment existants (qui sont maintenant exécutés) et s'ils sont identiques, ils devraient être modifiés, et une fois qu'il aura bouclé, il vérifiera à nouveau et constatera qu'ils ne sont pas identiques et ne modifiera donc plus les transactions ?
 
madmax3:
1. La modification et la vérification ne devraient avoir lieu que lorsque deux transactions sont ouvertes. Comment dois-je m'y prendre ? Dois-je ajouter au code que j'ai déjà ou recommencer ?

2. Donc, essentiellement, s'il y a deux transactions (même symbole et même numéro magique), l'EA devrait vérifier les prises de bénéfices des transactions ouvertes par rapport aux ordres en attente précédemment existants (qui sont maintenant exécutés) et s'ils sont identiques, ils devraient être modifiés, et une fois qu'il aura bouclé, il vérifiera à nouveau et constatera qu'ils ne sont pas identiques et ne modifiera donc plus les transactions ?

1. Bouclez à travers les ordres ouverts, vérifiez le symbole, le numéro magique, quand vous avez une correspondance qui n'est pas un type d'ordre en attente, incrémentez un compteur... quand vous avez fini de vérifier les ordres, si vous avez compté 2, alors vous avez 2 ordres ouverts pour le bon symbole et le bon numéro magique... donc maintenant vous pouvez les modifier... voir 2.

2. Non, vous ne pouvez pas voir le TP des ordres en attente s'ils ont été activés et ne sont plus en attente. L'EA doit vérifier la barre de 23:00 et déterminer quels auraient été les TP originaux... puis les comparer aux TP des 2 ordres ouverts... à partir de cette information, la décision peut être prise de modifier ou non.

 
RaptorUK:

1. Bouclez à travers les ordres ouverts, vérifiez le symbole, le numéro magique, quand vous avez une correspondance qui n'est pas un type d'ordre en attente, incrémentez un compteur... quand vous avez fini de vérifier les ordres, si vous avez compté 2, alors vous avez 2 ordres ouverts pour le bon symbole et le bon numéro magique... donc maintenant vous pouvez les modifier... voir 2.

2. Non, vous ne pouvez pas voir le TP des ordres en attente s'ils ont été activés et ne sont plus en attente. L'EA doit vérifier la barre de 23:00 et calculer ce qu'auraient été les TPs originaux ... puis les comparer aux TPs des 2 ordres ouverts ... à partir de cette information, la décision peut être prise de modifier ou non.

Ah je vois, je crois que c'est ce que j'ai essayé de faire depuis le début. Pour l'instant, un des ordres est modifié (en particulier l'ordre d'achat qui est l'ordre 2 dans mon test) mais il continue à être modifié, dois-je utiliser 'break' pour l'empêcher de se répéter ? De plus, comment puis-je compter et modifier les ordres ouverts uniquement lorsqu'il y en a deux d'ouverts ? J'ai essayé d'utiliser OrdersTotal() pour cela mais cela ne fonctionne pas, je ne pense pas avoir besoin de faire deux morceaux de code séparés pour chaque ordre, n'est-ce pas ?
Seuls les ordres ouverts pairs sont modifiés et comme je l'ai dit, ils sont modifiés à plusieurs reprises, j'ai essayé plusieurs combinaisons pour OrderSelect() mais je n'arrive toujours pas à comprendre, comme je l'ai dit, je suis un noob total à MQL et cette EA est presque terminée donc je voudrais juste la terminer. J'ai lu cecihttps://book.mql4.com/trading/ordermodify. Est-ce que cela a quelque chose à voir avec ma situation ? C'est pour un stop loss mais j'en ai besoin pour un take profit essentiellement.

Qu'est-ce que je fais de mal ici ?

     for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    && (OrderType() == OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    return(0);
    
  if (
        OrderSelect(iPos-1, SELECT_BY_POS-1)                    
    &&  OrderMagicNumber()  == MagicNumber                
    &&  OrderSymbol()       == "EURUSD"                
    && (OrderType() == OP_SELL)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
return(0);
  }

Comment puis-je vérifier si le TP est le même que celui de la bougie de 23h00 ? Serait-ce nécessaire en tant que tel, puisque tant que les ordres ouverts sont modifiés lorsque 2 d'entre eux sont là, cela aurait le même effet ? Ou est-ce juste pour éviter que l'ordre ne soit continuellement modifié et oui, j'ai vérifié la documentation.

Merci,

madmax3

 

Votre return(0) vous fait sortir de start() avant que le second ordre ne soit modifié.

Tout ce que vous faites est de sélectionner l'ordre par position, de vérifier qu'il a le bon numéro magique, qu'il s'agit du bon symbole et qu'il est OP_BUY... puis vous le modifiez, où déterminez-vous s'il a déjà été modifié ou non ?

Votre EA doit être capable de se remettre d'une interruption... si vos ordres sont placés et que MT4 se plante, il doit être capable de reprendre là où il s'est arrêté lorsqu'il est relancé.

C'est pourquoi vous devez déterminer si l'ordre a déjà été modifié ou doit être modifié... comment ?

"J'ai défini deux ordres en attente à une heure précise, à savoir 23:00 GMT+2 je pense. L'un des ordres en attente est un stop de vente et l'autre un stop d'achat, les deux ordres sont à une distance égale de l'ouverture de la bougie de 23:00, dans ce cas 14 pips. Les deux ont un TakeProfit de 28 pips (dans ce cas) et un StopLoss de 55 pips. "

Vous pouvez calculer où était le TP d'origine en vous référant à la bougie de 23:00, vérifier l'ordre et voir s'il est toujours défini sur le TP d'origine, s'il l'est alors il peut être modifié ... sinon il a déjà été modifié donc ne le modifiez pas à nouveau.

Il y a d'autres façons d'enregistrer que l'ordre a été modifié, gardez la trace du numéro de ticket, écrivez l'information dans un fichier quand il a été modifié, quand vous êtes sur le point de le modifier à nouveau, ouvrez le fichier et vérifiez le numéro de ticket, etc.... Je pense que la vérification par rapport au TP original est beaucoup plus simple.

 

Pour l'instant, j'ai ceci,

//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int     MagicNumber = 20080122;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double  TakeProfit  = 28;
extern double  StopLoss    = 55;
extern double  Lots        = 0.1;
extern int     StartHour   = 2300;      // Open Trade time
extern bool    OpenBuy     = true;
extern bool    OpenSell    = true;
extern int     NumBuys     = 1;
extern int     NumSells    = 1;
extern int     Slippage    = 2;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
      if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); }
   int ct;
//-------------------------------------+
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
//-------------------------------------+

//-------------------------------------+
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
//-------------------------------------+

   ct = Hour() * 100 + Minute();
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(ct == StartHour && Close[1]>Open[1] && OpenBuy)
      //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0; cnt < NumBuys; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); 
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }

          
           else Print("Error opening BUY order : ",GetLastError()); 
           

         }
         return; 
        }
      // check for short position (SELL) possibility
      if(ct == StartHour && Close[1]<Open[1] && OpenSell)
      //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0; cnt < NumSells; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
           else Print("Error opening SELL order : ",GetLastError());
         } 
         return; 
        
    
}
//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
           }   }
           
}
//---------------------------------------------------------------   
 
     
     
  void CloseAll()
{
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber) continue;
         
      //
      //
      //
      //
      //
         
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
      {
         for(int c=0; c<3; c++)
         {
            RefreshRates();
            if (OrderType()==OP_BUY)
                  { double cp = Bid;}  
            else  {        cp = Ask;}
               
            OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow);
               int err=GetLastError();
               if(err==4 || err==136 || err==137 || err==138 || err==146)
               {
                  Sleep(5000); continue;
               }  
               break;                     
         }
         break;
      }
      }
      }
   
// the end.

Le code d'écriture du fichier tel qu'il est inclus dans l'exemple ci-dessus,

//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
          	 FileClose(Handle); }   }
           
}
//---------------------------------------------------------------   

Mais j'ai ces erreurs,

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Version 2 : FileOpen - trop de fichiers ouverts

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Version 2 : poignée invalide -1 dans FileWrite

Qu'est-ce qui se passe ?

 

Pourquoi diable avez-vous choisi la plus difficile des deux options ?

Lorsque vous avez fini d'écrire dans le fichier, vous devez le fermer... s'il est déjà ouvert, vous n'avez pas besoin de le rouvrir.

//---------------------------------------------------------------

int Handle,                         // File descriptor
    Qnt_Symb;                           // Number of recorded symbols
string File_Name="check.csv";        // File name
   
Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening    File opened here, outside the loop
   

FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
   {       
   OrderSelect(iPos,SELECT_BY_POS);
   FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime   //  this is a string - Time  to  String
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime() )  //int     //  this is a string - Time  to  String
       
        ) ; //end file write

   FileClose(Handle);      //  why close the file inside the loop when it was opened outside the loop ?
   }   
}    //  what is this code inside of ?
           
}  // end of start
//--------------------------------------------------------------- 

Votre boucle for est erronée... la position du dernier ordre est 0 et non 1.

 
RaptorUK:

Pourquoi diable avez-vous choisi la plus difficile des deux options ?

N'est-ce pas la façon de faire la modification et la vérification en utilisant le fichier ? Ou dois-je combiner les deux codes, celui de la modification (mon post avant le dernier) et celui du fichier (qui sert juste à s'assurer qu'aucune autre modification n'a lieu) ?
Raison: