Il grande e terribile MT4 per sempre (o come strategizzare una transizione) - pagina 15

 
fxsaber:

No, l'ultima registrazione dell'attività di trading è nel secondo registro.

E questo è corretto in termini di priorità:

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

Qui sono tornato all'opzione senza stampe e di nuovo c'è una posizione rimasta dopo l'esecuzione. Si scopre che è necessario tenere una sorta di pausa dopo l'esecuzione degli scambi. Amico, che stampella.

 
Ihor Herasko:

Beh, chi lo aggiornerà? ))

ma quando c'è una posizione aperta - lo script la chiude e non fa altro

Istantanea2

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

Inoltre, se provo ad aprire una posizione lo script la chiude istantaneamente

 
fxsaber:

è riuscito a scrivere IsSynchronized(). Il codice è un po' pesante. Non ho ancora deciso in quale forma pubblicarla.

Come funziona? È un po' trovato ma un po' assente? Qual è il succo o il principio della soluzione?

 
SanAlex:

Ma quando c'è una posizione aperta, lo script la chiude e non fa altro.

Non tutti i server riprodurranno l'apertura di due posizioni. Nel vostro caso, è il terzo lato (un lato - due posizioni, l'altro - una posizione).

 
Ihor Herasko:

E questo è giusto in termini di sequenze:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Il grande e potente MT4 per sempre (o come scegliere la strategia di migrazione)

Ihor Herasko, 2021.05.05 09:35

Ed è tutto qui in termini di ordinazione:

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

Le linee evidenziate confermano la sequenza.

PositionsTotal = 1 - invia un ordine di chiusura.

  • Allora PositionsTotal = 2 e l'ordine dal passo 1 è chiuso.
  • La chiusura avviene dopo il completamento dell'esecuzione dello script. La cache di stampa è un po' distorta.

     
    Dmitry Fedoseev:

    Come mai? E' come se si trovasse, ma come se non ci fosse?

    Non ho ancora trovato il tempo di pubblicarlo. Lo pubblicherò entro 24 ore.

    Qual è l'essenza o il principio della soluzione?

    Analizza la corrispondenza tra la storia del trading e l'ambiente di trading attuale. In questo caso, non ci sono rallentamenti.

    Controlla anche Result.order.

    Di conseguenza, l'uso è il seguente: IsSync() restituisce false - l'ambiente di trading nel terminale è storto, altrimenti possiamo procedere come al solito.

     
    Gli sviluppatori di MT sono tradizionalmente silenziosi. Lo sceriffo non è interessato ai problemi degli indiani.
     
    Ihor Herasko:

    Stampe aggiunte. Ora rimangono due posizioni, come previsto:

    Risultato:

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

    Anche ResultDeal / ResultOrder / ResultComment e Order.Stato

    Sicuramente ci sarà una risposta lì

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

    Aggiungere Trade.ResultRetcodeDescription()

    E anche ResultDeal / ResultOrder / ResultComment e Order.Stato

    Sicuramente ci sarà una risposta lì

    Stato

    Fatto:

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

    Risultato:

    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:

    Aggiungere Trade.ResultRetcodeDescription()

    E anche ResultDeal / ResultOrder / ResultComment e Order.Stato

    Sicuramente ci sarà una risposta.

    Stato

    Questo non è assolutamente il caso, poiché la condizione per inviare un ordine a mercato per aprire una posizione è PositionsTotal == OrdersTotal == 0.

    Motivazione: