Quel modèle est correct ? - page 3

 
Techno:
PapaYozh, ces deux options ne concernent que la fermeture, mais qu'en est-il de la modification ? Mieux vaut avoir2 ticks pour le traitement complet que 2 boucles différentes pour la fermeture et la modification?


S'il faut fermer quelque chose et modifier quelque chose, la construction for (i=0 ; i<OrderTotals() ; i++) est d'autant plus incorrecte.

Nous devons passer de OrdersTotal()-1 à 0.

for ( i=OrderTotals()-1; i>=0; i-- )
{ 




 

Est-ce que c'est le bon modèle ?

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total; i >=1; i--)                                                        
  {                                                                                          
    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
    {
      switch(OrderType())
      {
        case OP_BUY : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
        case OP_SELL: OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
        default     : break;
      }        
    }
  }  
}
 

Cependant, je ne comprends toujours pas la normalisation.

C'est une chose si je calcule le prix, alors il est clair qu'il doit être porté aux chiffres du terminal.

Mais dans ce cas, nous clôturons au prix actuel obtenu à partir du flux et, bien sûr, il ne peut être supérieur à Digits.

 
valenok2003:

Mais ici, la clôture se fait également au prix actuel dérivé du flux, qui ne peut bien sûr pas être plus long que les chiffres.

Ceci est pour un testeur avec des devis non normalisés.
 
valenok2003:

Cependant, je ne comprends toujours pas la normalisation.

C'est une chose si je calcule le prix, alors il est clair qu'il doit être porté aux chiffres du terminal.

Mais dans ce cas, nous clôturons au prix actuel obtenu à partir du flux et, bien sûr, il ne peut être supérieur à Digits.

Parfois, avec des chiffres = 4, l'offre peut être égale à 1.32343545654. Pas souvent, mais ça arrive.
 
Techno:
Parfois, lorsque les chiffres = 4, l'offre peut être de 1.32343545654, cela se produit. Pas souvent, mais ça arrive.


Vivre et apprendre. Merci.
 
valenok2003:

Cette conception serait-elle correcte ?


Pas vraiment : il n'y a pas de contrôle du "symbole" de l'instrument. Si les ordres sont ouverts pour plus d'un instrument, vous risquez de fermer les ordres d'un instrument par les prix de l'autre. Si vous devez clôturer l'ordre du symbole sur lequel l'Expert Advisor a été déplacé, vous devez utiliser le "symbole" du graphique. Si vous devez clôturer tous les ordres, quel que soit le graphique sur lequel l'EA a été déplacé, vous devez lire le "symbole" de l'ordre et demander à utiliser l'offre et la demande du "symbole" approprié. Et il y a des actions inutiles dans le code.

Bonne chance.

 
valenok2003:

Est-ce que c'est le bon modèle ?

void CloseThisSymbolAll() {
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         while (!IsTradeAllowed()) Sleep(1000);
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slip, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slip, Red);
            Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);            
         }
      }
   }
}
Faites comme ça.
 
VladislavVG:


Oui et il y a des actions supplémentaires dans le code.

Si vous voulez dire ceci
int Total = OrdersTotal();

alors il y a une variable supplémentaire ici pour la transparence du code.

Ou peut-être parlez-vous d'autre chose ?

 
Techno:
Parfois, à Digits=4, l'offre peut être égale à 1.32343545654. Pas souvent, mais ça arrive.

Cependant, dans l'exemple du script close .mq4(dans la livraison MT4 standard), il n'y a pas de normalisation.

   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {
      cmd=OrderType();
      //---- first order is buy or sell
      if(cmd==OP_BUY || cmd==OP_SELL)
        {
         while(true)
           {
            if(cmd==OP_BUY) price=Bid;
            else            price=Ask;
            result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
            if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
            else error=0;
            if(error==135) RefreshRates();
            else break;
           }
        }
     }