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

 
fxsaber:

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

Y esto es correcto en términos de prioridad:

2021.05.05 10:32:35.896 Trades  '160122203': market buy 0.01 EURUSD placed for execution
2021.05.05 10:32:35.931 Trades  '160122203': order #2249869869 buy 0.01 / 0.01 EURUSD at market done in 81.962 ms
2021.05.05 10:32:35.931 Trades  '160122203': deal #2240398230 buy 0.01 EURUSD at 1.19876 done (based on order #2249869869)
2021.05.05 10:32:35.931 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': accepted market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876 placed for execution
2021.05.05 10:32:36.009 Trades  '160122203': order #2249869870 sell 0.01 / 0.01 EURUSD at market done in 77.026 ms
2021.05.05 10:32:36.009 Trades  '160122203': deal #2240398231 sell 0.01 EURUSD at 1.19876 done (based on order #2249869870)
2021.05.05 10:32:36.009 Scripts script Test (EURUSD,M1) removed

Aquí he vuelto a la opción sin impresiones y de nuevo queda una posición después de la ejecución. Resulta que hay que mantener algún tipo de pausa después de que se ejecuten las operaciones. Hombre, qué muleta.

 
Ihor Herasko:

Bueno, ¿quién va a actualizarlo? ))

pero cuando hay una posición abierta - el script la cierra y no hace nada más

Instantánea2

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

también si intento abrir una posición el script la cierra instantáneamente

 
fxsaber:

logró escribir IsSynchronized(). El código es un poco pesado. Todavía no he decidido en qué forma publicarlo.

¿Cómo funciona? ¿Se encuentra en cierto modo, pero en cierto modo, ausente? ¿Cuál es la esencia o el principio de la solución?

 
SanAlex:

Pero cuando hay una posición abierta, el script la cierra y no hace nada más.

No todos los servidores reproducirán la apertura de dos puestos. En su caso, es el tercer lado (un lado - dos posiciones, el otro - una posición).

 
Ihor Herasko:

Y eso es más o menos correcto en cuanto a la secuencia:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

La gran y poderosa MT4 para siempre (o cómo elegir la estrategia de migración)

Ihor Herasko, 2021.05.05 09:35

Y todo está aquí en términos de pedidos:

2021.05.05 10:32:35.896 Trades  '160122203': market buy 0.01 EURUSD placed for execution
2021.05.05 10:32:35.931 Trades  '160122203': order #2249869869 buy 0.01 / 0.01 EURUSD at market done in 81.962 ms
2021.05.05 10:32:35.931 Trades  '160122203': deal #2240398230 buy 0.01 EURUSD at 1.19876 done (based on order #2249869869)
2021.05.05 10:32:35.931 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': accepted market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876
2021.05.05 10:32:35.978 Trades  '160122203': market sell 0.01 EURUSD, close #2249869868 buy 0.01 EURUSD 1.19876 placed for execution
2021.05.05 10:32:36.009 Trades  '160122203': order #2249869870 sell 0.01 / 0.01 EURUSD at market done in 77.026 ms
2021.05.05 10:32:36.009 Trades  '160122203': deal #2240398231 sell 0.01 EURUSD at 1.19876 done (based on order #2249869870)
2021.05.05 10:32:36.009 Scripts script Test (EURUSD,M1) removed

Las líneas resaltadas confirman la secuencia.

PositionsTotal = 1 - envía una orden de cierre.

  • Entonces PositionsTotal = 2 y la orden del paso 1 se cierra.
  • El cierre tiene lugar una vez finalizada la ejecución del script. El caché de impresión está un poco distorsionado.

     
    Dmitry Fedoseev:

    ¿Cómo es eso? ¿Se encuentra pero no está?

    Todavía no he podido publicarlo. Lo publicaré en 24 horas.

    ¿Cuál es la esencia o el principio de la solución?

    Analiza la correspondencia del historial de operaciones con el entorno comercial actual. En este caso, no hay ralentizaciones.

    También comprueba Result.order.

    Como resultado, el uso es el siguiente: IsSync() devuelve falso - el entorno comercial en la Terminal está torcido, de lo contrario podemos proceder como de costumbre.

     
    Los desarrolladores de la MT son tradicionalmente silenciosos. Al sheriff no le interesan los problemas de los indios.
     
    Ihor Herasko:

    Añadidas las huellas. Ahora quedan dos puestos, como era de esperar:

    Resultado:

    Añadir Trade.ResultRetcodeDescription()

    
    #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); // Если нет позиции и ордера - открываем позицию.
          Print(Trade.ResultRetcodeDescription());
          printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
        }
        
      Print("Выход. PostionsTotal: ", PositionsTotal());
    }

    También ResultDeal / ResultOrder / ResultComment y Order.Estado

    Seguramente habrá una respuesta allí

    Estado
    Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / ResultOrder
    Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / ResultOrder
    • www.mql5.com
    ResultOrder - CTrade - Торговые классы - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
     
    Rashid Umarov:

    Añadir Trade.ResultRetcodeDescription()

    Y también ResultDeal / ResultOrder / ResultComment y Order.Estado

    Seguramente habrá una respuesta allí

    Estado

    Hecho:

    #define  PRINT(A) Print(#A + " = " + (string)(A))
    
    #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); // Если нет позиции и ордера - открываем позицию.
          PRINT(Trade.ResultRetcodeDescription());
          PRINT(Trade.ResultDeal());
          PRINT(Trade.ResultOrder());
          PRINT(Trade.ResultComment());
          printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
        }
        
      Print("Выход. PostionsTotal: ", PositionsTotal());
    }

    Resultado:

    2021.05.05 11:36:14.566 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultRetcodeDescription() = done at 0.00000
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultDeal() = 0
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultOrder() = 2249874645
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Trade.ResultComment() = Request executed
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        После открытия. PositionsTotal: 2, OrdersTotal: 1
    2021.05.05 11:36:14.646 Test (EURUSD,M1)        Выход. PostionsTotal: 2
    
     
    Rashid Umarov:

    Añadir Trade.ResultRetcodeDescription()

    Y también ResultDeal / ResultOrder / ResultComment y Order.Estado

    Seguramente habrá una respuesta allí.

    Estado

    Este no es el caso, ya que la condición para enviar una orden de mercado para abrir una posición es PositionsTotal == OrdersTotal == 0.