Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 408

 
khorosh:
Pour évaluer l'exactitude du code, vous devez savoir exactement ce que l'auteur voulait obtenir. Vos informations sont insuffisantes. Ce que vous vouliez obtenir n'est pas très clair. Si vous voulez compenser la perte après la fermeture de la grille en ouvrant un ordre opposé et en espérant que le prix passera dans la direction du dernier ordre d'un certain nombre de points, le processus de compensation dépend à la fois du lot pour cet ordre et de la distance que le prix passera dans la direction favorable. Cela signifie que lorsque vous calculez le lot, vous devez également définir la distance que le prix devra franchir pour compenser la perte. Mais peut-être que vous voulez dire autre chose.


Oui, j'aurais dû écrire plus précisément. C'est juste que j'ai déjà expliqué deux fois en détail ce que cette fonction est censée faire, mais personne n'a répondu. Encore une fois, ce que cette fonction devrait faire. Supposons que j'ai une grille de commandes. Qu'ils soient ouverts avec la même étape ou non, cela n'a pas d'importance. Un ordre a été ouvert plus tôt et un autre plus tard, c'est-à-dire que chaque position a dépassé un nombre différent de points avec un lot différent. La grille sera fermée selon certaines conditions et je dois calculer le LOT nécessaire pour couvrir la perte subie par cette grille pour les points TP. Pour éviter d'écrire deux fonctions miroir, j'ai introduit un paramètre otype dans la fonction.

Cependant, j'ai fait une erreur quelque part. S'il vous plaît, aidez-moi à le corriger.

double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после 
                               //закрытия сетки ордеров
{
  double Lot=0; double TotalLot=0;
  for (int i = OrdersTotal()-1; i>0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
    {
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
       {
         if (otype == OP_BUY)
         {
           Lot = NormalizeDouble (((OrderOpenPrice()-Bid)*Point)*OrderLots()/TP,2); 
           if (Lot>0)
           {
              TotalLot= TotalLot+Lot;
           }
         }
           
       
         else if (otype == OP_SELL)
         {
           Lot = NormalizeDouble (((Ask-OrderOpenPrice())*Point)*OrderLots()/TP,2);
           if (Lot>0)
           {
            TotalLot= TotalLot+Lot;
           }
           
         }
       }
     }
   }
   return (TotalLot);
   
 }
 
BeerGod:

Y a-t-il un moyen de l'implémenter correctement pour qu'il se ferme à partir de zéro ? Si possible, une ligne de code, s'il vous plaît.
Parcourez toute la liste (des commandes) dans la direction souhaitée et mettez les valeurs des tickets dans un tableau, puis supprimez les commandes en forçant brutalement ce tableau.
 
BeerGod:

Existe-t-il un moyen de l'implémenter correctement pour fermer à partir de zéro ? Si possible, une ligne de code, s'il vous plaît.


Juste une réparation rapide :

//+------------------------------------------------------------------+
//|                 Закрыть все ордера                               |
//+------------------------------------------------------------------+


double ClossAllOrders ()

{
  for(int i=0; i<OrdersTotal(); )
  {
    if ( !OrderSelect(i, SELECT_BY_POS) )
      break;
    
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, Lime );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, Lime );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Print("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      i++;
      Sleep(500);
    }  
  }
}

// End
 
Trader7777:

Oui, j'aurais dû écrire plus précisément. C'est juste que j'ai déjà expliqué deux fois en détail ce que cette fonction est censée faire, mais personne n'a répondu. Encore une fois, ce que cette fonction devrait faire. Supposons que j'ai une grille de commandes. Qu'ils soient ouverts avec la même étape ou non, cela n'a pas d'importance. Un ordre a été ouvert plus tôt et un autre plus tard, c'est-à-dire que chaque position a dépassé un nombre différent de points avec un lot différent. La grille sera fermée selon certaines conditions et je dois calculer le LOT nécessaire pour couvrir la perte subie par cette grille pour les points TP. Afin de ne pas écrire deux fonctions miroir, j'ai introduit un paramètre otype dans la fonction.

Mais il y a toujours une erreur quelque part. S'il vous plaît, aidez-moi à le réparer.



Je prendrais une autre route. Tout d'abord, je calculerais la perte liée à la fermeture de la grille. Et puis c'est aussi simple que cela. Perte = Bénéfice de la prochaine commande. Exprimez le bénéfice de l'ordre par le lot et le TP et trouvez le lot à partir de l'équation.
 
Contender:


Une rapide branlette :


Merci beaucoup, tout fonctionne correctement, merci à tous ceux qui ont répondu !


 
khorosh:
Je prendrais une autre route. Tout d'abord, je calculerais la perte liée à la fermeture de la grille. Et puis c'est aussi simple que cela. Perte = Bénéfice de la prochaine commande. Exprimez le bénéfice de l'ordre par le lot et le TP et trouvez le lot à partir de l'équation.


La perte à la fin de la grille est-elle en argent ou en pips ?
 
Trader7777:

La perte résultant de la fermeture de la grille est-elle en argent ou en pips ?
Dans la monnaie du dépôt.
 
Et le fait que chaque paire a un prix de point différent ?
 
Trader7777:
Et le fait que chaque paire a un prix de point différent ?
Pourquoi voulez-vous faire ça ?
 
Trader7777:
Et le fait que chaque paire a un prix de point différent ?

Vous pouvez voir ici comment il est mis en œuvre


https://www.mql5.com/ru/code/7275

https://www.mql5.com/ru/forum/113937/page2

https://docs.mql4.com/ru/constants/marketinfo