La gran y terrible MT4 para siempre (o cómo hacer una estrategia de transición) - página 14

 
Ihor Herasko:

Sí, ese es también mi punto de vista. Resulta que el script consigue cerrar una de las posiciones, cuando en realidad son dos, pero PositionsTotal() devuelve 1. Y luego, tras el cierre, se cumple la condición de fin de bucle, es decir, PositionsTotal() devuelve 2.

Puedes insertar impresiones para ver completamente lo que sucede.

 
fxsaber:

Se pueden insertar impresiones para ver completamente lo que sucede.

Sí, para confirmar que el razonamiento es correcto:

#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());
}

Resultado:

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

De hecho, la posición se queda sola en el aire.

P. S. Corregido el post, porque puse mal el código por culpa del copy-paste.
 
Ihor Herasko:

De hecho, el puesto se quedó solo en el aire.

En el registro, es probable que la hora de grabación de la última operación sea posterior a la hora de grabación del cierre del script.

También es importante imprimir OrdersTotal.
 
fxsaber:

En el registro, es probable que la hora del último registro de operaciones sea posterior a la hora del registro de cierre del script.

¿Se refiere a estas dos entradas?

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

Creo que todo es correcto aquí en términos de ordenamiento. De hecho, hay dos posiciones, pero PositionsTotal() aún no ha recibido una actualización. Por lo tanto, devuelve 1 y la posición se cierra. Y tras la ejecución de la operación comercial, se actualiza al estado que corresponde al que existía antes de la ejecución de la operación comercial. Entonces, tenemos 2.

 
fxsaber:

El problema se ha debatido durante mucho tiempo. Casi todo el mundo se ha encontrado con ella. Es la primera vez que se encuentra un código estable reproducible.

Se ha encontrado una solución.

¿Y cuál es la solución?

¿Cuál fue la dificultad para encontrar un código de reproducción estable? Una acción para abrir o cerrar, y la siguiente con una decisión basada en el número de posiciones en el mercado o en el historial.
 
Ihor Herasko:

¿Se refiere a estas dos entradas?

No, el último registro de actividad comercial está en el segundo registro.

 
fxsaber:

También es importante imprimir OrdersTotal.

He añadido impresiones. Ahora quedan dos puestos, como se esperaba:

#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());
}

Resultado:

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:

¿Cuál es la solución?

número de posiciones en el mercado o en el historial.

No hubo ninguna dificultad, lo escribí sobre la marcha.

 

Abre posiciones así, sin detenerse en absoluto

#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 de

 
SanAlex:

Abre posiciones así, sin detenerse en absoluto

Bueno, ¿quién va a actualizar el total? ))