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

 
kwng111:


Désolé kwng, votre message ne me semble pas être la solution pour madmax3.

Vous n'avez pas à modifier les transactions dans une fonction( ) appelée void CloseAll().
Vous devez également sélectionner l'OrderSymbol ( ) et l'OrderMagicNumber( ).

et dans cette partie du programme

        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

les pendingtrades seront toujours modifiés

 

Voici le code révisé pour l'ensemble de l'EA :

//+------------------------------------------------------------------+
//|                                                  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; 
        
    
}

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


   return(0);
  }
  
  
  
  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.

La fonction CloseAll() est là pour fermer les transactions à un moment précis si elles durent trop longtemps.

Cette partie du code est la partie révisée de ce que j'essaie de comprendre :
(comme vous pouvez le voir, le MagicNumber et le Symbol sont présents, mais seuls les ordres en cours sont encore modifiés).

     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}
 
deVries:
        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
int total=OrdersTotal();
 if(total>1)

On vous a dit que la sélection ne fonctionnera pas hier. Et que vous devez tester les codes de retour et le total.

Si vous ne prenez pas la peine de lire les messages et de corriger votre code, nous ne prendrons pas la peine d'essayer de vous aider.

 
WHRoeder:

On vous a dit hier que le select ne fonctionnerait pas. Et que vous devez tester les codes de retour et le total environ.

Si vous ne prenez pas la peine de lire les messages et de corriger votre code, nous ne prendrons pas la peine d'essayer de vous aider.


J'ai fait les deux choses ci-dessus, vous vous référez à la mauvaise personne, je pense. Je suis le posteur original, pas deVries, et j'ai changé le code en ceci (comme posté auparavant) :

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

Le problème maintenant est qu'il modifie les ordres en attente alors que je veux qu'il ne modifie que les ordres ouverts et seulement lorsque deux ordres ouverts du même symbole sont ouverts et en cours d'exécution en même temps. J'ai essayé différentes combinaisons de numéros et de numéros d'OrderSelect, mais je suis toujours dans l'impasse.

 
madmax3:


J'ai fait les deux choses ci-dessus, vous vous adressez à la mauvaise personne, je pense. Je suis le posteur original et non deVries et j'ai changé le code en ceci (comme posté avant) :

Le problème maintenant est qu'il modifie les ordres en attente alors que je veux qu'il ne modifie que les ordres ouverts et seulement lorsque deux ordres ouverts du même symbole sont ouverts et en cours d'exécution en même temps. J'ai essayé différentes combinaisons de numéros et de numéros d'OrderSelect mais je n'ai toujours pas trouvé de solution.

Vous devez donc passer en boucle vos ordres ouverts, vérifier le symbole et le MagicNumber comme vous l'avez fait ci-dessus... mais vous devez également vérifier si OrderType() <=OP_SELL... compter les ordres qui correspondent, si c'est 2... alors bouclez à nouveau et OrderModify().

La seule façon d'apprendre est de lire la documentation de chaque fonction et de comprendre comment elle fonctionne... par exemple OrderType().

 

J'ai essayé plusieurs codes différents mais je n'arrive toujours pas à le faire fonctionner exactement. Il modifie l'un des trades ouverts lorsque deux sont ouverts et il continue à le modifier, j'ai besoin qu'il soit modifié une seule fois et j'ai besoin que les deux trades soient modifiés.

     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_SELL)
    
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    
   if (OrderSelect(iPos, SELECT_BY_POS))
    if (OrderType() <= OP_BUY)
      if (!OrderSelect(iPos, SELECT_BY_POS))
      {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
     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_SELL)
    && (OrderType() <=OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    
   if  (OrderSelect(iPos-1, SELECT_BY_POS))
    {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);



   return(0);
  }}

Avez-vous des suggestions sur ce que je dois faire ? J'ai lu la documentation en détail.

 
Quelle est la différence avant et après la modification de l'ordre ? Qu'est-ce qui change ?
 

D'abord deux ordres sont placés, puis l'un d'entre eux (une vente dans ce cas lorsque j'ai testé la date spécifique) est exécuté. Plus tard dans la journée, le deuxième ordre (qui est toujours là) est exécuté, et cette transaction est un achat.
La vente est l'ordre 1 et l'achat est l'ordre 2. L'achat (ordre 2) voit son TakeProfit modifié de 16,3 pips (je ne sais pas pourquoi il n'ajoute pas 20 pips), puis le TakeProfit est augmenté de 0,2 pips dans la même minute, et cela continue, le TakeProfit est continuellement modifié tout au long de la journée, parfois augmenté, parfois diminué, je ne sais pas pourquoi cela se produit.

Edit : Je pense que les 16.3 pips et les autres changements sont aussi influencés par le spread ?

 
OK, pouvons-nous revenir au début ? Je sais que vous essayez de modifier deux ordres... mais qu'essayez-vous de faire exactement ? Du tailing SL ? autre chose ? qu'essayez-vous d'obtenir ?
 
madmax3 2012.03.09 15:06
WHRoeder:

On vous a dit que le select ne fonctionnera pas hier. Et que vous devez tester les codes de retour et le total environ.

Si vous ne prenez pas la peine de lire les posts et de corriger votre code, nous ne prendrons pas la peine d'essayer de vous aider.


J'ai fait les deux choses ci-dessus, vous vous adressez à la mauvaise personne, je pense.

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 :
   total=OrdersTotal();
   if(total<1) 
qui présente toujours les problèmes que j'ai mentionnés.