MT5 e la velocità in azione - pagina 11

 
Una volta ho scritto un indicatore di ritardo primitivo. Fa un ottimo lavoro nel mostrare un'enorme pompa a torrente, per esempio.
Ping
Ping
  • www.mql5.com
Для торговли важным параметром является актуальность текущей цены. На него влияет множество факторов, самый популярный из которых - сетевой пинг между терминалом и торговым сервером. Но часто из виду упускается другой параметр: так называемый "внутренний пинг терминала" - дополнительный лаг котировок внутри самого терминала (платформы) . Даже...
 
fxsaber:

Incompreso. Dobbiamo capire se MT si blocca o no. Stavamo analizzando i log del server, quando le pause si modificavano per decine di secondi. Tutto è perfetto sul server.

Quindi il problema è altrove.

Ho visto che molto spesso ho colpito i prezzi passati. Cioè un grave ritardo nel Terminale. C'è un problema su come identificarlo.

Qui ho comprato un VPS. Come faccio a sapere che si adatta perfettamente? Voglio dire, ci deve essere un qualche tipo di indicatore numerico. A quanto pare, non ci si può fidare dei ritrasmessi. A mezzanotte - decine di percento.


Forse posso distribuire una macchina virtuale sulla stessa macchina fisica del server di trading. E sarei in grado di eseguire il terminale da lì. Immagino che questo ridurrebbe il numero di deadlock.

Mi sembra che il tracciamento, il ping dalla console o un software speciale non risolvano il problema.
È necessario registrare il coinvolgimento di MT in qualche modo. Mi sembra che dovremmo prendere posizione e chiedere agli sviluppatori di fare il proprio contatore perTERMINAL_RETRANSMISSION

 
fxsaber:

Incompreso. Dobbiamo capire se MT si blocca o no. Stavamo analizzando i log del server, quando le pause si modificavano per decine di secondi. Tutto è perfetto sul server.
Quindi il problema è altrove.
Ho visto che molto spesso ho colpito i prezzi passati. Cioè un grave ritardo nel Terminale. Si è posto il problema di come identificarlo.

In qualche modo non è molto chiaro cosa significhi esattamente "tutto è perfetto sul server":
1) Nessuna richiesta di modifica è arrivata al server, o tutte le richieste entro 10 secondi avevano un prezzo non aggiornato?
2) E quanti secondi è la differenza tra il prezzo "attuale" e quello "obsoleto"?
3) Chi determina che il prezzo non è aggiornato: il server MT o una terza parte, forse qualche borsa?


Se il problema è frequente, si potrebbe analizzare il traffico di modifica dell'ordine usando Wireshark abbinato a Process Monitor (Network Activity) di Sysinternals.

 
Sergey Dzyublik:

In qualche modo non è molto chiaro cosa significa esattamente "tutto è perfetto sul server":
1) Nessuna richiesta di modifica è arrivata al server, o tutte le richieste entro 10 secondi avevano un prezzo non aggiornato?
2) E quanti secondi è la differenza tra il prezzo "attuale" e quello "obsoleto"?
3) Chi determina che il prezzo non è aggiornato: il server MT o una terza parte, forse qualche borsa?

Sul server, tutte le richieste sono state elaborate in unità di millisecondi. Per quanto riguarda i prezzi obsoleti, è necessario verificare con l'amministratore.

Se il problema è ricorrente, si potrebbe analizzare il traffico di modifica dell'ordine usando Wireshark abbinato a Process Monitor (Network Activity) di Sysinternals.

Sono un completo novizio in questo.

 

È stato possibile riprodurre i freni di HistorySelect-functions.

  1. Vai al conto MetaQuotes-Demo con una storia di trading relativamente lunga.
    1. Se il conto demo ha poca storia di trading, abilita l'auto-trading ed esegui lo script OrderSend-Test2.ex5 in parallelo (vedi il codice sorgente in allegato).
  2. Apri due grafici EURUSD ed esegui l'Expert Advisor qui sotto su ciascuno(il giallo nel codice sorgente mostra ulteriori modifiche).

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

    MT5 e la velocità in azione

    fxsaber, 2020.06.04 14:38

    Ho disegnato il seguente Expert Advisor.

    // Мониторинг длительных пиков выполнения важных функций для торговли.
    #include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh
    
    input int inCycle = 10;    // Циклов проверки в одном OnTick
    input int inAlertTime = 1; // Нижний порог в миллисекундах
    
    #define _B2(A) _B(A, AlertTime)
    
    void Check( const string Symb, const int AlertTime = 1 )
    {
      MqlTick Tick;
      
      if (_B2(SymbolInfoTick(Symb, Tick)))
      {
        MqlTick Ticks[];
        
        _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, 0, 1));
        _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));
        _B2(CopyTicksRange(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));
    
        HistorySelect(MathRand(), INT_MAX);
        _B2(HistorySelect(Tick.time, INT_MAX));
        
        _B2(HistoryDealsTotal());
        _B2(HistoryDealGetTicket(0));
        _B2(HistoryDealGetInteger(0, DEAL_MAGIC));
        _B2(HistoryDealGetDouble(0, DEAL_PRICE));
        _B2(HistoryDealSelect(0));
    
        _B2(HistoryOrdersTotal());
        _B2(HistoryOrderGetTicket(0));
        _B2(HistoryOrderGetInteger(0, ORDER_MAGIC));
        _B2(HistoryOrderGetDouble(0, ORDER_PRICE_CURRENT));
        _B2(HistoryOrderSelect(0));
        
        _B2(GetLastError());
        _B2(IsStopped());
        
        _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
        _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
        _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
        _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));
    
        _B2(TimeCurrent());
        _B2(TimeLocal());
        _B2(TimeTradeServer());
        
        _B2(OrdersTotal());
        _B2(OrderSelect(0));
        _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
        _B2(OrderGetInteger(ORDER_MAGIC));
        _B2(OrderGetString(ORDER_SYMBOL));
        
        _B2(PositionsTotal());
        _B2(PositionSelect(Symb));
        _B2(PositionSelectByTicket(0));
        _B2(PositionGetDouble(POSITION_PRICE_CURRENT));
        _B2(PositionGetInteger(POSITION_MAGIC));
        _B2(PositionGetString(POSITION_SYMBOL));
        
        _B2(AccountInfoDouble(ACCOUNT_EQUITY));
        _B2(AccountInfoInteger(ACCOUNT_MARGIN_MODE));
        
        MqlTradeRequest Request = {0};
        MqlTradeCheckResult CheckResult;
    
        _B2(OrderCheck(Request, CheckResult));
        
        _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
        _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
        _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
        _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
        
        _B2(SymbolsTotal(true));
        _B2(SymbolName(0, true));
        _B2(Symbol());
        
        _B2(GlobalVariableCheck(NULL));
        _B2(GlobalVariableGet(NULL));
        
        _B2(ResourceFree(NULL));
      }
    }
    
    void OnTick()
    {
      for (int i = 0; i < inCycle; i++)
        Check(_Symbol, inAlertTime);      
    }

MT5 b2572 è inondato di messaggi come questo.

2020.08.13 05:28:00.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.13 05:28:00.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.13 05:28:00.153 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.13 05:28:00.162 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.13 05:28:00.167 Alert: Time[Test6.mq5 34: HistoryOrderSelect(0)] = 2 ms.
2020.08.13 05:28:00.174 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.13 05:28:00.180 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.13 05:28:00.186 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.13 05:28:00.194 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.


Per favore, scrivete dei vostri risultati, chi lo proverà. Hai avuto fortuna con i rallentamenti?


ZZY Long ha cercato di capire perché ci sono dei freni sui conti live. Penso di aver trovato l'area problematica.

File:
 
fxsaber:

ZS Long ha cercato di capire perché i conti di battaglia erano lenti. Sembra aver trovato l'area problematica.

Ecco come appare deprimente la situazione di combattimento.

2020.08.13 10:20:09.074 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
2020.08.13 10:20:09.074 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
2020.08.13 10:20:09.074 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
2020.08.13 10:20:09.074 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
...
2020.08.13 11:31:58.559 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 34 ms.
2020.08.13 11:31:58.559 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 35 ms.
2020.08.13 11:31:58.624 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 99 ms.
2020.08.13 11:32:12.483 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 7 ms.
2020.08.13 11:33:44.877 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 27 ms.
2020.08.13 11:33:44.877 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 21 ms.
2020.08.13 11:33:44.879 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 27 ms.
2020.08.13 11:33:47.911 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 18 ms.
2020.08.13 11:33:47.911 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 18 ms.
2020.08.13 11:33:47.912 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 29 ms.

2020.08.13 11:33:49.312 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 22 ms.
2020.08.13 11:33:49.312 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 22 ms.

2020.08.13 11:34:02.612 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 63 ms.
2020.08.13 11:34:02.613 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 63 ms.

2020.08.13 11:34:02.616 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 56 ms.
2020.08.13 11:34:12.057 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 12 ms.

2020.08.13 11:34:30.643 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 32 ms.
2020.08.13 11:34:30.643 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 32 ms.

2020.08.13 11:34:30.643 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 8 ms.
2020.08.13 11:37:17.059 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 24 ms.
2020.08.13 11:38:30.360 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 13 ms.

Se guardi da vicino, puoi vedere che gli EA indipendenti l'uno dall'altro stanno rallentando allo stesso modo (tempo di ritardo e durata). Cioè, quando diversi Expert Advisors fanno la chiamata HistorySelect, allora MT5 ferma l'esecuzione di tutti gli Expert Advisors per un certo tempo, e poi restituisce i suoi risultati agli Expert Advisors.


Qual è la ragione di una API così strana (rispetto all'imminente) per lavorare con la storia? Dove sono le insidie di questo approccio?

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

MT5 e la velocità in azione

fxsaber, 2020.05.28 15:27

HistorySelect.

Questa è una caratteristica follemente costosa. E purtroppo nessuna quantità di cache può rendere la sua velocità accettabile ora.


Si prega di considerare l'introduzione di tali caratteristiche della storia.

HistoryDealsSelect( const int Index, const int Count = WHOLE_ARRAY );  // Из внутренней таблицы сделок взять сделки, начиная с заданного индекса в таблице.
HistoryOrdersSelect( const int Index, const int Count = WHOLE_ARRAY ); // Из внутренней таблицы ордеров взять ордера, начиная с заданного индекса в таблице.

Chiuderebbero completamente i freni di HistorySelect. Perché risolverebbe il problema di ottenere gli ultimi scambi a basso costo. In questo momento, è un tormento in esecuzione di combattimento.


Non è sempre possibile controllare le ultime transazioni tramite OnTradeTransaction. Ecco perché una rapida HistorySelect è rilevante.


Probabilmente non è normale che le prestazioni di MT4 superino quelle di MT5 quando si tratta di storia del trading.

Si prega di rimuovere i freni dal terminale di trading!

 
1.000 transazioni nella storia sono sufficienti?
 
Rorschach:
Bastano 1000 scambi nella storia?

Testato con queste letture.

        : HistoryDealsTotal() = 11045
        : HistoryOrdersTotal() = 11518
 

Ordini 20990

Offerte 10277

Entrare in 20 minuti

File:
20200813.log  4817 kb
 
Rorschach:

Ordini 20990

Offerte 10277

Entrare in 20 minuti.

Super, grazie! Infine, una conferma completa dei tristi ritardi di MT5. E questo senza alcuna funzione di trading. Problemi quasi ovunque.

KD      0       16:00:33.382    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 34: HistoryOrderSelect(0)] = 25 ms.
PE      0       16:00:44.913    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 24 ms.
DP      0       16:00:44.888    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 46 ms.
FI      0       16:00:49.579    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 28: HistoryDealSelect(0)] = 22 ms.
EE      0       16:01:03.287    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 33: HistoryOrderGetDouble(0,ORDER_PRICE_CURRENT)] = 1 ms.
KE      0       16:01:07.013    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 50: OrderGetDouble(ORDER_PRICE_CURRENT)] = 1 ms.
JM      0       16:01:12.189    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 44: TimeCurrent()] = 39 ms.
MD      0       16:01:13.067    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 81: ResourceFree(NULL)] = 1 ms.
RS      0       16:01:13.572    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 41: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 7 ms.
GL      0       16:01:27.816    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 79: GlobalVariableGet(NULL)] = 22 ms.
PD      0       16:01:33.892    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 58: PositionGetInteger(POSITION_MAGIC)] = 1 ms.
KP      0       16:01:39.864    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 67: OrderCheck(Request,CheckResult)] = 3 ms.
ML      0       16:01:39.970    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 62: AccountInfoInteger(ACCOUNT_MARGIN_MODE)] = 1 ms.
KM      0       16:01:41.045    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 55: PositionSelect(Symb)] = 2 ms.
NS      0       16:01:46.832    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 78: GlobalVariableCheck(NULL)] = 1 ms.
JP      0       16:01:49.211    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 75: SymbolName(0,true)] = 1 ms.
EL      0       16:01:59.101    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 32 ms.
IM      0       16:02:07.462    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 70: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
PJ      0       16:02:11.735    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 37: IsStopped()] = 4 ms.
OG      0       16:03:08.178    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 14 ms.
JH      0       16:03:16.385    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 5 ms.
FM      0       16:03:16.601    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 59: PositionGetString(POSITION_SYMBOL)] = 1 ms.
GH      0       16:03:21.841    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 72: TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)] = 1 ms.
FJ      0       16:03:25.782    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 46: TimeTradeServer()] = 1 ms.
EO      0       16:03:26.772    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 45: TimeLocal()] = 10 ms.
HD      0       16:03:36.595    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 13: SymbolInfoTick(Symb,Tick)] = 13 ms.
...

Questo è deprimente. Sarebbe interessante vedere il risultato sotto Linux. Sotto Win non c'è un tempo reale di cui parlare.