Comment mettre en place la fermeture des positions une par une après N minutes ?

 

mql4
Par exemple, 5 minutes se sont écoulées après l'ouverture de l'ordre, et cet ordre doit être clôturé.
Le code est trop lourd pour mémoriser le ticket à fermer et l'heure d'ouverture à utiliser pour calculer les minutes de chaque commande séparément.
Il peut y avoir 1,2,3-10 positions, acheter et vendre en même temps.

Pouvez-vous suggérer une fonction pour stocker ces données dans un tableau afin de les comparer et de les fermer sur le ticket requis ?


 
Après tout, tous les billets et les horaires d'ouverture sont déjà présents dans les tableaux standard.
Passez en revue toutes les positions par timer et comparez TimeCurrent()-OrderOpenTime()>=300
 
Taras Slobodyanik:
Après tout, tous les billets et les horaires d'ouverture sont déjà présents dans les tableaux standard.
Nous énumérons toutes les positions par timer et comparons TimeCurrent()-OrderOpenTime()>=300

Que sont ces tableaux standards ?
Pouvez-vous les détailler ?

 
des fonctions MQL standard, pas des tableaux
Торговые функции - Справочник MQL4
Торговые функции - Справочник MQL4
  • docs.mql4.com
Торговые функции могут использоваться в экспертах и скриптах. Торговые функции OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete(), изменяющие состояние...
 

Comment puis-je utiliser ces fonctions pour fermer les positions individuellement et non pas toutes en même temps après 5 minutes ?

Il y a la première position ouverte, nous avons enregistré l'heure et le ticket
dans la variable, puis la deuxième position ouverte, nous la voyons dans la boucle comme la dernière et l'enregistrons dans la variable heure et ticket
, mais toutes ces actions sont écrasées et il s'avère que les données sont stockées uniquement à partir de la dernière position

 
Natalya Dzerzhinskaya:

Comment puis-je utiliser ces fonctions pour fermer les positions individuellement et non pas toutes en même temps après 5 minutes ?

Il y a la première position ouverte, nous l'avons enregistrée dans la variable time et le ticket
puis la deuxième position ouverte, nous la voyons dans la boucle comme la dernière et l'enregistrons dans la variable time et le ticket
mais toutes ces actions sont écrasées et il s'avère que les données sont stockées uniquement à partir de la dernière position

La condition consistant à sélectionner un seul ordre parmi ceux que nous devons clôturer au plus tôt 5 minutes après son ouverture n'est pas tout à fait claire.

Par conséquent, je ne sais pas quoi répondre.

S'il y a une condition, nous devrions commencer par elle.

Pour l'instant, ils ont tous été virtuellement sélectionnés et seront fermés en pile, l'un après l'autre.

La toute première commande ouverte a ceci : TimeCurrent()-OrderOpenTime() sera le plus important ; par exemple, son OrderTicket().

Vous pouvez passer en revue tous vos ordres de marché dans la boucle suivante

int i;      
     for (i=OrdersTotal()-1; i>=0; i--)
         {
            if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               {
                  ............
               }
         }
 
Natalya Dzerzhinskaya:

mql4
Par exemple, 5 minutes se sont écoulées après l'ouverture de l'ordre et cet ordre doit être clôturé.

Jetez un coup d'œil aux fonctions de Kim Igor.

Ici, en un coup d'œil, la fonction renvoie le nombre de secondes après la dernière ouverture de la position.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t=0;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

Révisez-le pour l'adapter à votre tâche. Ajoutez-y la fonction qui ferme une position.

 
Renat Akhtyamov:

Il n'est pas tout à fait clair s'il s'agit d'un ordre qui doit être fermé au moins 5 minutes après son ouverture.

Laissez-moi vous expliquer de manière plus simple :

Il y a le 1er ordre sur le marché, puis le 2ème, le 3ème et ainsi de suite.
Le temps du premier ordre a expiré et nous devrions le fermer, puis le 2e ordre est le premier de la série, le temps a expiré et nous devrions le fermer, etc.
En fait, nous devrions choisir l'ordre le plus ancien à fermer s'il est >=5*60
Mais pour le sélectionner dans une série à fermer par le ticket, nous devons d'une manière ou d'une autre définir la plus petite valeur du ticket dans les ordres ouverts et déterminer le temps d'existence.

Aleksandr Volotko:

Jetez un coup d'œil aux fonctions de Kim Igor.

Ici, en un coup d'œil, la fonction renvoie le nombre de secondes après la dernière ouverture de la position.

Il ne convient pas. Intéressé par la toute première position sur le marché.

 
Natalya Dzerzhinskaya:

Je vais faire simple :

Il y a la 1ère commande sur le marché, puis la 2ème commande, la 3ème et ainsi de suite.
Le temps de la première commande a expiré, puis la 2e commande est la première de la série, le temps a expiré, elle doit être fermée, etc.
En fait, nous devrions choisir l'ordre le plus ancien à fermer s'il est >=5*60
Mais pour le sélectionner dans une série à fermer par le ticket, nous devons d'une manière ou d'une autre définir la plus petite valeur du ticket dans les ordres ouverts et déterminer le temps d'existence.

Ça ne rentre pas. Intéressé par la toute première position sur le marché.


Quel est le problème ?

  1. Trouvez l'ordre le plus ancien ouvert par le conseiller expert. Il a le plus petit OrderOpenTime().
  2. Comparez le temps écoulé entre le moment de l'ouverture de cette commande et l'heure actuelle. S'il est égal ou supérieur à l'heure spécifiée, fermez-le.
int nOlderTicket = -1;
datetime dtOlderOrderTime = D'3000.12.30';
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())
      continue;

   if (OrderMagicNumber() != i_nMagicNumber)
      continue;

   if (nOlderTicket < 0 || OrderOpenTime() < dtOlderOrderTime)
   {
      nOlderTicket = OrderTicket();
      dtOlderOrderTime = OrderOpenTime();
   }
}

if (TimeCurrent() - dtOlderOrderTime >= время в секундах)
{
   // Закрыть ордер nOlderTicket
}


 
Natalya Dzerzhinskaya:

Je vais faire simple :

La 1ère commande est sur le marché, puis la 2ème, la 3ème et ainsi de suite.
Le temps du premier ordre a expiré et nous devons le fermer, puis le 2e ordre est le premier de la série, le temps a expiré et nous devons le fermer, etc.
En fait, nous devrions choisir l'ordre le plus ancien à fermer s'il est >=5*60
Mais pour le sélectionner dans une série à fermer par le ticket, nous devons d'une manière ou d'une autre définir la plus petite valeur du ticket dans les ordres ouverts et déterminer le temps d'existence.

Ça ne rentre pas. Vous êtes intéressé par la toute première position sur le marché.

En termes de durée d'existence, vous pouvez sélectionner aussi bien le tout premier ordre ouvert que le plus récent. Dans ce cas, nous nous souvenons du ticket et du nombre de secondes d'existence. Par exemple

int i, DeltaTimeOpen, prevDeltaMax, prevDeltaMin, TicketFirst, TicketLast, DeltaTimeClose;  
//---------------
prevDeltaMax=0; prevDeltaMin=9999999999999; TicketFirst=0; TicketLast=0; DeltaTimeClose = 5*60;     
     for (i=OrdersTotal()-1; i>=0; i--)
         {            
            if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               { 
                  DeltaTimeOpen = TimeCurrent()-OrderOpenTime();//возраст ордера в секундах
                  if(DeltaTimeOpen>=DeltaTimeClose)
                  {
                     if(DeltaTimeOpen>prevDeltaMax)
                     {                         
                         TicketLast=OrderTicket();//последний  
                         prevDeltaMax=DeltaTimeOpen;//возраст                    
                     }
                     if(DeltaTimeOpen<prevDeltaMin)
                     {
                         TicketFirst=OrderTicket(); //первый
                         prevDeltaMin=DeltaTimeOpen;//возраст                                              
                     }
                  }
               }
         }
if(TicketFirst>0)
{
//ну и пошло-поехало...
}

 

Le plus simple est de saisir dans le champ de commentaire l'heure à laquelle l'ordre doit être clôturé.

Il ne vous reste plus qu'à vous souvenir de l'heure la plus proche de la fermeture (et encore, c'est de l'optimisation).

Au moment de la "révision", sur une minuterie ou ce que vous voulez, parcourez les ordres ouverts et fermez ceux dont la durée de vie dépasse le temps spécifié dans le commentaire.