Wie lässt sich die Schließung von Positionen nach N Minuten realisieren?

 

mql4
Zum Beispiel sind 5 Minuten nach der Eröffnung des Auftrags vergangen, und dieser Auftrag sollte geschlossen werden.
Der Code ist zu umständlich, um sich das zu schließende Ticket und die Öffnungszeit zu merken, die zur Berechnung der Minuten für jeden Auftrag einzeln verwendet werden.
Es kann 1,2,3-10 Positionen geben, die gleichzeitig gekauft und verkauft werden.

Können Sie eine Funktion vorschlagen, mit der diese Daten in einem Array gespeichert werden können, um sie weiter zu vergleichen und auf das gewünschte Ticket zu schließen?


 
Schließlich sind alle Fahrkarten und Öffnungszeiten bereits in Standardarrays vorhanden.
Alle Positionen nach Zeitgeber durchgehen und TimeCurrent()-OrderOpenTime()>=300 vergleichen
 
Taras Slobodyanik:
Schließlich sind alle Fahrkarten und Öffnungszeiten bereits in Standardarrays vorhanden.
Wir gehen alle Positionen nach Zeitgeber durch und vergleichen TimeCurrent()-OrderOpenTime()>=300

Was sind diese Standardarrays?
Können Sie sie näher erläutern?

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

Wie kann ich diese Funktionen nutzen, um Positionen einzeln und nicht alle auf einmal nach 5 Minuten zu schließen?

Es gibt die erste offene Position, wir haben die Zeit und das Ticket
in der Variablen aufgezeichnet, dann wird die zweite Position geöffnet, wir sehen sie in der Schleife als die letzte und zeichnen sie in der Variablen Zeit und Ticket
auf, aber alle diese Aktionen werden überschrieben und es stellt sich heraus, dass die Daten nur von der letzten Position gespeichert werden

 
Natalya Dzerzhinskaya:

Wie kann ich diese Funktionen nutzen, um Positionen einzeln und nicht alle auf einmal nach 5 Minuten zu schließen?

Es gibt die erste offene Position, die wir in der Variable time und im Ticket
aufgezeichnet haben, dann wird die zweite Position geöffnet, wir sehen sie in der Schleife als die letzte und zeichnen sie in der Variable time und im Ticket
auf, aber alle diese Aktionen werden überschrieben und es stellt sich heraus, dass die Daten nur von der letzten Position gespeichert werden

Die Bedingung, nur einen Auftrag aus den Aufträgen auszuwählen, die wir frühestens 5 Minuten nach ihrer Eröffnung schließen müssen, ist nicht ganz klar.

Deshalb weiß ich nicht, was ich antworten soll.

Wenn es eine Bedingung gibt, sollten wir mit ihr beginnen.

Im Moment sind sie praktisch alle ausgewählt und werden nacheinander auf einem Stapel geschlossen.

Der allererste offene Auftrag lautet wie folgt: TimeCurrent()-OrderOpenTime() wird die größte sein, zum Beispiel ihr OrderTicket().

Sie können alle Ihre Marktaufträge in der folgenden Schleife durchgehen

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

mql4
Zum Beispiel sind 5 Minuten nach der Eröffnung des Auftrags vergangen, und dieser Auftrag muss geschlossen werden.

Werfen Sie einen Blick auf die Funktionen von Kim Igor.

Hier gibt die Funktion auf einen Blick die Anzahl der Sekunden nach dem Öffnen der letzten Position an.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

Überarbeiten Sie sie entsprechend Ihrer Aufgabe. Fügen Sie die Funktion hinzu, mit der eine Position geschlossen wird.

 
Renat Akhtyamov:

Es ist nicht ganz klar, ob es sich um eine Bestellung handelt, die mindestens 5 Minuten nach dem Öffnen geschlossen werden muss.

Lassen Sie mich das auf einfachere Weise erklären:

Es gibt den 1. Auftrag auf dem Markt, dann den 2., 3. und so weiter.
Die Zeit des ersten Auftrags ist abgelaufen und wir sollten ihn schließen, dann ist der zweite Auftrag der erste in der Reihe, die Zeit ist abgelaufen und wir sollten ihn schließen, usw.
In der Tat sollten wir den ältesten Auftrag zum Abschluss bringen, wenn er >=5*60 ist.
Aber um es aus einer Serie auszuwählen, die durch das Ticket geschlossen werden soll, müssen wir irgendwie den kleinsten Wert des Tickets in den offenen Aufträgen definieren und die Zeit des Bestehens bestimmen.

Aleksandr Volotko:

Werfen Sie einen Blick auf die Funktionen von Kim Igor.

Hier gibt die Funktion auf einen Blick die Anzahl der Sekunden nach dem Öffnen der letzten Position an.

Es passt nicht. Interessiert an der allerersten Position auf dem Markt.

 
Natalya Dzerzhinskaya:

Ich werde es einfach machen:

Es gibt die erste Bestellung auf dem Markt, dann die zweite Bestellung, die dritte und so weiter.
Die Zeit des ersten Auftrags ist abgelaufen, dann ist der 2. Auftrag der erste in der Reihe, die Zeit ist abgelaufen, er sollte geschlossen werden, usw.
In der Tat sollten wir den ältesten Auftrag zum Abschluss bringen, wenn er >=5*60 ist.
Aber um es aus einer Serie auszuwählen, die durch das Ticket geschlossen werden soll, müssen wir irgendwie den kleinsten Wert des Tickets in den offenen Aufträgen definieren und die Zeit des Bestehens bestimmen.

Es wird nicht passen. Interessiert an der allerersten Position auf dem Markt.


Wo liegt das Problem?

  1. Suchen Sie den ältesten vom Expert Advisor eröffneten Auftrag. Sie hat die kleinste OrderOpenTime().
  2. Vergleichen Sie, wie viel Zeit vom Zeitpunkt der Eröffnung dieser Bestellung bis zur aktuellen Uhrzeit vergangen ist. Wenn sie gleich oder größer als die angegebene Zeit ist, wird sie geschlossen.
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:

Ich werde es einfach machen:

Die erste Bestellung ist auf dem Markt, dann die zweite, dritte usw.
Die Zeit des ersten Auftrags ist abgelaufen und wir sollten ihn schließen, dann ist der zweite Auftrag der erste in der Reihe, die Zeit ist abgelaufen und wir sollten ihn schließen, usw.
In der Tat sollten wir den ältesten Auftrag zum Abschluss bringen, wenn er >=5*60 ist.
Aber um es aus einer Serie auszuwählen, die durch das Ticket geschlossen werden soll, müssen wir irgendwie den kleinsten Wert des Tickets in den offenen Aufträgen definieren und die Zeit des Bestehens bestimmen.

Es wird nicht passen. Sie sind an der allerersten Position auf dem Markt interessiert.

In Bezug auf den Zeitpunkt des Bestehens können Sie sowohl den allerersten offenen Auftrag als auch den jüngsten Auftrag auswählen. In diesem Fall merken wir uns das Ticket und die Anzahl der Sekunden des Bestehens. Zum Beispiel

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)
{
//ну и пошло-поехало...
}

 

Am einfachsten ist es, in das Kommentarfeld die Uhrzeit einzutragen, zu der der Auftrag abgeschlossen werden soll.

Dann müssen Sie sich nur noch die nächstgelegene Uhrzeit für den Abschluss merken (und selbst dann ist es eine Optimierung).

Wenn es Zeit für die "Überarbeitung" ist, durchlaufen Sie mit einem Timer oder wie auch immer Sie wollen, eine Schleife durch die offenen Aufträge und schließen diejenigen, deren Lebensdauer die im Kommentar angegebene Zeit überschreitet

Grund der Beschwerde: