O grande e terrível MT4 para sempre (ou como fazer uma transição estratégica) - página 15

 
fxsaber:

Não, o último registro de atividade comercial está no segundo registro.

E isto é correto em termos de prioridade:

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

Aqui eu voltei à opção sem impressões e novamente resta uma posição após a execução. Acontece que você precisa fazer algum tipo de pausa após a execução dos negócios. Cara, que muleta.

 
Ihor Herasko:

Bem, quem vai atualizá-lo? ))

mas quando há uma posição aberta - o roteiro a fecha e não faz mais nada

Instantâneo2

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

Além disso, se eu tentar abrir uma posição, o roteiro a fecha instantaneamente.

 
fxsaber:

conseguiu escrever IsSynchronized(). O código é um pouco pesado. Eu ainda não decidi de que forma postar.

Como funciona? É uma espécie de achado, mas uma espécie de ausência? Qual é a essência ou o princípio da solução?

 
SanAlex:

Mas quando há uma posição aberta, o roteiro a fecha e não faz mais nada.

Nem todos os servidores irão reproduzir a abertura de duas posições. No seu caso, é o terceiro lado (um lado - duas posições, o outro - uma posição).

 
Ihor Herasko:

E isso está certo em termos de seqüenciamento:

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

O Grande e Poderoso MT4 Forever (ou como escolher a estratégia de migração)

Ihor Herasko, 2021.05.05 09:35

E está tudo bem aqui em termos 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

As linhas destacadas confirmam a seqüência.

PositionsTotal = 1 - envia uma ordem de fechamento.

  • Então PositionsTotal = 2 e a ordem do passo 1 é fechada.
  • O fechamento ocorre após a conclusão da execução do roteiro. O cache de impressão está um pouco distorcido.

     
    Dmitry Fedoseev:

    Como assim? É meio que encontrado, mas meio que não está lá?

    Eu ainda não cheguei a postar. Publicá-lo-ei dentro de 24 horas.

    Qual é a essência ou o princípio da solução?

    Ele analisa a correspondência do histórico comercial com o ambiente comercial atual. Neste caso, não há lentidão.

    Ele também verifica o resultado da encomenda.

    Como resultado, o uso é o seguinte: IsSync() retorna falso - o ambiente comercial no Terminal é torto, caso contrário, podemos proceder como de costume.

     
    Os desenvolvedores da MT são tradicionalmente silenciosos. O Xerife não está interessado nos problemas dos índios.
     
    Ihor Herasko:

    Acrescentadas impressões digitais. Agora restam duas posições, como esperado:

    Resultado:

    Acrescentar Comércio. ResultadoRetcodeDescrição()

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

    Também ResultDeal / ResultOrder / ResultCommentar e Encomendar.Estado

    Certamente haverá uma resposta lá

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

    Acrescentar Comércio. ResultadoRetcodeDescrição()

    E também ResultDeal / ResultOrder / ResultCommentar e Encomendar.Estado

    Certamente haverá uma resposta lá

    Estado

    Feito:

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

    Acrescentar Comércio. ResultadoRetcodeDescrição()

    E também ResultDeal / ResultOrder / ResultCommentar e Encomendar.Estado

    Certamente, haverá uma resposta lá.

    Estado

    Este não é definitivamente o caso, pois a condição para enviar uma ordem de mercado para abrir uma posição é PositionsTotal == OrdensTotal == 0.