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

 
7Konstantin7:

Merci, je ne peux pas le faire, j'ai juste pensé que quelqu'un pourrait griffonner quelques lignes dans cette fonction ou pourrait déposer un hibou, la version finale. Je ne pense pas que ce soit difficile, mais je pense que personne n'aidera.

Il y a 4 crédits sur le site que mql5 pourrait donner) s'il est possible de les transférer entre les participants.

1. Trouvez la position ouverte la plus proche que vous pouvez dans la boucle et renvoyez son ticket ?

 
artmedia70:

1. Pouvez-vous trouver la position ouverte la plus ancienne dans la boucle et la renvoyer au ticket ?

Je ne peux pas imaginer comment ce serait dans le code), mais d'une manière ou d'une autre j'ai pu ajouter à l'EA la suppression des ordres en attente, je ne suis pas bon en code, juste un peu.
 
7Konstantin7:
Je ne peux pas imaginer comment ce sera dans le code) mais par miracle j'ai pu ajouter la suppression des ordres en attente à l'EA, je ne suis pas doué pour les codes, seulement un peu.

Prenez-le et voyez comment il se ferme en boucle.

1 :

int i, total = OrdersTotal(); bool rez;

for(i = total-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && другие нужные условия)
{
if(OrderType() < 2)
rez = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 40);
if(OrderType() > 1)
rez = OrderDelete(OrderTicket());
}
}

2 :

//Всё тоже самое только поменяй направление цикла
for(i = 0; i < total; i++)
Vous comprendrez alors dans quel ordre les ordres sont fermés. Je ne peux pas en être sûr car je ne l'ai pas vérifié. Je n'en ai pas besoin. Mais il s'agit d'un autre problème, qui a été discuté ici plus d'une fois et je ne veux pas le répéter.
 
AlexeyVik:

Prenez-le et voyez comment il se ferme en boucle.

1 :

2 :

alors vous saurez dans quel ordre les ordres se ferment. Je ne peux pas le dire, car je ne l'ai pas vérifié. Je n'en ai pas besoin. Mais c'est un autre sujet, il a été discuté ici de nombreuses fois et je ne veux pas tout répéter.
Le problème a déjà été résolu en privé...
 
artmedia70:
On a déjà réglé ça en privé...
Eh bien, je ne lis pas votre vie privée... Je ne sais pas ce qui se passe.
 
AlexeyVik:
Eh bien, je ne lis pas vos messages privés... et je ne sais pas ce qui se passe.
Oui, il ne lit pas... Qu'est-il arrivé à mes pantoufles ? ;)
 
artmedia70:
Oui, il ne lit pas... Où sont passées mes pantoufles ? !?!! ;)

Rappelez-vous ce que Ioann Vassilievich a énuméré qu'il a pris, et Shpak n'a pas pris... Alors je suis vos pantoufles.


Au revoir. Je vais me coucher.

 
AlexeyVik:

Rappelez-vous ce que Ioann Vassilievich a énuméré qu'il a pris, et Shpak n'a pas pris... Alors je suis vos pantoufles.


Au revoir. Je vais me coucher.

Je vais aller demander aux autres pour les pantoufles... Bonne nuit...
 
AlexeyVik:

Prenez-le et voyez comment il se ferme en boucle.

1 :

2 :

Vous saurez alors dans quel ordre les ordres se terminent. Je ne peux pas le dire car je n'ai pas vérifié. Je n'en ai pas besoin. Mais il s'agit d'une autre question, elle a été discutée ici à de nombreuses reprises et je n'ai pas envie de tout répéter.

Merci, le problème est déjà résolu.

artmedia70:

Je pensais qu'ils m'enverraient aux chiottes. Merci pour votre aide.

 

Bonjour à tous, j'ai déjà posé une question similaire à la page 711, malheureusement personne n'a répondu, peut-être que maintenant quelqu'un...

Je suis confronté à un problème de fermeture de contre-ordres sur un ordre à cinq chiffres. Le problème est que je dois fermer, disons, 20 ordres d'achat et 33 ordres de vente lorsque le bénéfice total est atteint. Et je veux fermer 20 ordres d'achat et 20 ordres de vente à l'aide de la fonction OrderCloseBy(), et fermer les 13 ordres de vente restants à l'aide de la fonction OrderClose().

Si nous avons un spread fixe à 4 chiffres, nous n'aurons aucun problème pour fermer le spread et nous sauvegardons également le spread lorsque nous utilisons la fonction OrderCloseBy(). Si nous avons un spread à 5 chiffres, le spread est flottant et c'est pourquoi, je pense, les ordres ne sont pas fermés lorsque le profit total est atteint, et la fonction OrderCloseBy() se dispute dans le journal. En même temps, si nous le faisons fonctionner dans le testeur, tout est fermé normalement.

Les ordres dans un sens, lorsque le profit total est atteint, sont fermés sans problème.

Qui a rencontré un tel problème, et quelles sont les options pour le résoudre ?

Je vais vous donner la fonction pour clôturer les commandes.

De plus, la fonction OrderCloseBy() fonctionne-t-elle même sur un ordre à cinq chiffres ?

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}