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.
Se pueden insertar impresiones para ver completamente lo que sucede.
Sí, para confirmar que el razonamiento es correcto:
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!OrdersTotal())
{
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
Print("Открытие. PositionsTotal: ", PositionsTotal());
}
Print("Выход. PostionsTotal: ", PositionsTotal());
}
Resultado:
2021.05.0510:11:43.393 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.488 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.535 Test (EURUSD,M1) CTrade::OrderSend: market sell 0.01 position #2249868517 EURUSD [position closed]
2021.05.0510:11:43.535 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.615 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.697 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.777 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:43.859 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510:11:43.941 Test (EURUSD,M1) Открытие. PositionsTotal: 02021.05.0510:11:44.023 Test (EURUSD,M1) Открытие. PositionsTotal: 12021.05.0510:11:44.101 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510: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.
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.0510:11:44.101 Test (EURUSD,M1) Закрытие, т. к. PositionsTotal() равно 12021.05.0510: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.
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.
He añadido impresiones. Ahora quedan dos puestos, como se esperaba:
#include <Trade\Trade.mqh>
voidOnStart()
{
CTrade Trade;
while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.if (PositionsTotal() == 1)
{
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.Print("Закрытие, т. к. PositionsTotal() равно 1");
}
elseif (!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.0510:22:50.583 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.663 Test (EURUSD,M1) После открытия. PositionsTotal: 0, OrdersTotal: 12021.05.0510:22:50.679 Test (EURUSD,M1) Перед открытием. PositionsTotal: 0, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) После открытия. PositionsTotal: 2, OrdersTotal: 02021.05.0510:22:50.757 Test (EURUSD,M1) Выход. PostionsTotal: 2
#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---int total=PositionsTotal();
int Ordertotal=OrdersTotal();
while(!IsStopped() && (total <= 1)) // Закончим, когда появится более одной позиции.if(total == 1)
Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.elseif(!Ordertotal)
Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}
//+------------------------------------------------------------------+
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.
Se pueden insertar impresiones para ver completamente lo que sucede.
Sí, para confirmar que el razonamiento es correcto:
Resultado:
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.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.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?
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.
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.¿Se refiere a estas dos entradas?
No, el último registro de actividad comercial está en el segundo registro.
También es importante imprimir OrdersTotal.
He añadido impresiones. Ahora quedan dos puestos, como se esperaba:
Resultado:
¿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
Abre posiciones así, sin detenerse en absoluto
Bueno, ¿quién va a actualizar el total? ))