Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1679

 
Maxim Kuznetsov #:

C'est une blague ?

Vous l'avez en noir et blanc pour(; ;)

Eh bien, oui, mais il y a un moyen d'en sortir : quand la magie n'est pas égale à la magie des ordres.
 
Nerd Trader #:
Eh bien oui, seulement il y a un moyen d'en sortir : quand la magie n'est pas égale à la magie des ordres.

Essayez ceci

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
 
EVGENII SHELIPOV ordre actuellement sélectionné.

Et s'il y a une grille de commandes ?

Est-ce que quelqu'un a une fonction pour calculer la somme de tous les swaps d'une grille d'ordres pour un ordre magique et un instrument financier.

Merci pour l'aide ! !!

Pourquoi en avez-vous besoin ?
 
MakarFX #:
Pourquoi en avez-vous besoin ?

Lors de la clôture d'une grande grille d'ordres avec une longue durée de vie, les échanges d'ordres mangent les bénéfices et faussent beaucoup le résultat.

Je veux compenser la perte sur les swaps avec cette fonction.

 
EVGENII SHELIPOV #:

Lors de la clôture d'une grande grille d'ordres avec une longue durée de vie, les échanges d'ordres mangent les bénéfices et faussent beaucoup le résultat.

Je veux compenser la perte sur les swaps avec cette fonction.

La grille est-elle fermée au profit ou au seuil de rentabilité ?
 
MakarFX #:

Essayez ceci

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
Cela a réglé le problème, j'avais if (order.cmd == OP_SELLSTOP || OP_BUYSTOP) seulement le problème n'était pas résolu.
Mais j'ai besoin qu'il passe par tous les ordres. Le mage lui-même est fixé lorsque seul le stoppeur est créé. Nous ne pouvons pas comprendre que le bouchon est créé par OrderType() parce qu'il n'y a pas encore été ; nous avons un enregistrement préliminaire du type d'ordre dans order.cmd pour cela. Et ici, nous avons besoin de deux boucles : l'une imbriquée dans l'autre, de sorte qu'une itération de la variable magic est vérifiée avec toutes les commandes de OrdersTotal(). J'ai tout implémenté, seulement il y a une boucle sans fin, je ne sais pas pourquoi ...
 
MakarFX #:
La grille est-elle fermée au profit ou au seuil de rentabilité ?

Oui, à un certain niveau de drawdown, il y a une perte à zéro et à aucune perte il y a une perte affreuse due aux swaps.

 
Nerd Trader #:
C'est bien, j'avais if (order.cmd == OP_SELLSTOP || OP_BUYSTOP)
Mais j'ai besoin que tous les ordres soient transmis. Le mage lui-même est fixé lorsque seul le stoppeur est créé. Nous ne pouvons pas savoir que le bouchon est créé par OrderType() puisqu'il n'y a pas encore été, nous devons écrire le type d'ordre dans order.cmd au préalable. Et ici, nous avons besoin de deux boucles : l'une imbriquée dans l'autre, de sorte qu'une itération de la variable magique est vérifiée avec toutes les commandes de OrdersTotal()
Montrez-moi où vous utilisez GetMagic(...)
 
void OpenOrder(int db = -1){

  if(db == -1){
    Print("'db' должен иметь корректное значение");
    return;
  }

  Order order;

  //Если бид в границах ДБ (его хай/лоу) то инициализируем ордер для селстопа или байстопа
  if(Bid > db_last.low && Bid < db_last.hight){
    if(db == BEAR) order.InitForSell(SELLSTOP);
    if(db == BULL) order.InitForBuy(BUYSTOP);
  }

 ...

  if(order.is_init == true)
  {
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 10, 
    order.sl_price, order.tp_price, "", GetMagic(order), 0, order.arrow_color);

    if(order_send == -1){
      Print(order.error_text," | ",GetLastError()," db_last.third ",db_last.third,
        " | db_last.size_open_to_low ",db_last.size_open_to_low," | order.sl_price: ",
        order.sl_price," | order.cmd ",order.cmd);
      ResetLastError();
      return;
    }
  }
}

...

int GetMagic(Order &order)
{
  int magic = 0;
  //Если должен быть открыт стопордер и если есть уже открытые или отложенные 
  //ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать 
  //для нашего ордера уникальный маджик и отправить его на запись в массив
  if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
    if(OrdersTotal() >= 1)
      for(;;){
        magic++;
        for(int i = OrdersTotal(); i > 0 ; i --)
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) != false)
            if(magic != OrderMagicNumber())
              return magic;
            
      }
    //Если нет открытых или отложенных ордеров то увеличиваем значение 
    //маджика, чтобы он равнялся единице и отправляем на запись в массив
    else if (OrdersTotal() == 0)
      return (magic + 1);
  return magic;
}


Il est dit dans le commentaire qu'il envoie le majic au tableau d'écriture, donc ne vous laissez pas tromper par cela, tant que le majic retourne au retorn.
 
EVGENII SHELIPOV #:

Oui, à un certain niveau de drawdown, il y a une perte à zéro et à aucune perte il y a une perte affreuse due aux swaps.

   double GetOrderSwap()
     {
      double order_swap = 0;
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if (OrderType() == OP_BUY)
                 {
                  order_swap += OrderSwap();
                 }
              }
           }
        }
      return(order_swap);
     }