Der große und schreckliche MT4 für immer (oder wie man einen Übergang strategisch plant) - Seite 14

 
Ihor Herasko:

Ja, das ist auch mein Standpunkt. Es stellt sich heraus, dass es dem Skript gelingt, eine der Positionen zu schließen, obwohl es in Wirklichkeit zwei sind, aber PositionsTotal() gibt 1 zurück. Und dann, nach dem Schließen, ist die Bedingung für das Schleifenende erfüllt, d. h. PositionsTotal() gibt 2 zurück.

Sie können Ausdrucke einfügen, um sich einen Überblick über die Vorgänge zu verschaffen.

 
fxsaber:

Ausdrucke können eingefügt werden, um die Vorgänge genau zu verfolgen.

Ja, um zu bestätigen, dass die Argumentation korrekt ist:

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      
Print("Открытие. PositionsTotal: ", PositionsTotal()); 
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Ergebnis:

2021.05.05 10:11:43.393 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.488 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.535 Test (EURUSD,M1)        CTrade::OrderSend: market sell 0.01 position #2249868517  EURUSD [position closed]
2021.05.05 10:11:43.535 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.615 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.697 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.777 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:43.859 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:43.941 Test (EURUSD,M1)        Открытие. PositionsTotal: 0
2021.05.05 10:11:44.023 Test (EURUSD,M1)        Открытие. PositionsTotal: 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

In der Tat wird die Position allein in der Schwebe gelassen.

P. S. Ich habe den Beitrag korrigiert, weil ich durch das Kopieren und Einfügen das Falsche in den Code geschrieben habe.
 
Ihor Herasko:

In der Tat wurde die Position allein in der Schwebe gelassen.

Im Protokoll ist es wahrscheinlich, dass die Aufzeichnungszeit des letzten Handels der Aufzeichnungszeit des Skriptabschlusses folgt.

Es ist auch wichtig, OrdersTotal zu drucken.
 
fxsaber:

Im Protokoll ist es wahrscheinlich, dass der Zeitpunkt des letzten Handelsdatensatzes dem Zeitpunkt des Abschlussdatensatzes des Skripts folgt.

Beziehen Sie sich auf diese beiden Einträge?

2021.05.05 10:11:44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 10:11:44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

Ich denke, hier ist alles korrekt, was die Reihenfolge betrifft. Es gibt tatsächlich zwei Positionen, aber PositionsTotal() hat noch keine Aktualisierung erhalten. Daher wird 1 zurückgegeben, und die Position ist geschlossen. Und nach der Ausführung der Handelsoperation wird sie auf den Zustand aktualisiert, der demjenigen vor der Ausführung der Handelsoperation entspricht. Wir erhalten also 2.

 
fxsaber:

Das Problem wird schon seit langem diskutiert. Fast jeder hat sie schon einmal erlebt. Es ist das erste Mal, dass ein stabiler, reproduzierbarer Code gefunden wurde.

Es wurde eine Lösung gefunden.

Und was ist die Lösung?

Worin bestand die Schwierigkeit, einen stabilen Reproduktionscode zu finden? Eine Aktion, um zu öffnen oder zu schließen, und die nächste mit einer Entscheidung auf der Grundlage der Anzahl der Positionen auf dem Markt oder in der Geschichte.
 
Ihor Herasko:

Beziehen Sie sich auf diese beiden Datensätze?

Nein, die letzte Aufzeichnung der Handelsaktivität befindet sich im zweiten Protokoll.

 
fxsaber:

Es ist auch wichtig, OrdersTotal zu drucken.

Ich habe Drucke hinzugefügt. Nun bleiben erwartungsgemäß zwei Positionen übrig:

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Ergebnis:

2021.05.05 10:22:50.583 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.663 Test (EURUSD,M1)        После открытия. PositionsTotal: 0, OrdersTotal: 1
2021.05.05 10:22:50.679 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        После открытия. PositionsTotal: 2, OrdersTotal: 0
2021.05.05 10:22:50.757 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Dmitry Fedoseev:

Was ist die Lösung?

Anzahl der Positionen auf dem Markt oder in der Geschichte.

Es gab keine Schwierigkeiten, ich habe es spontan geschrieben.

 

Es öffnet Positionen wie diese, ohne überhaupt anzuhalten

#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int total=PositionsTotal();
   int Ordertotal=OrdersTotal();
   while(!IsStopped() && (total <= 1))  // Закончим, когда появится более одной позиции.
      if(total == 1)
         Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      else
         if(!Ordertotal)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+

Foto von

 
SanAlex:

Es öffnet Positionen wie diese, ohne überhaupt anzuhalten

Und wer wird die Gesamtzahl aktualisieren? ))