MT5 e la velocità in azione - pagina 9

 
fxsaber:

Risulta essere un evento frequente. Le funzioni di trading non sono state chiamate.

SymbolInfoTick non è un cattivo ritardo a volte. L'HFT può essere molto esperto con questi ritardi inaspettati.

Si prega di chiedere agli sviluppatori di trovare le ragioni. Nel frattempo, è ovvio che negli EA da battaglia il loro profiler è un must.

Cosa mostrerà il test sul terminale "vuoto"?

void OnStart()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time=0,avr_time=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      SymbolInfoTick(_Symbol, Tick);
      end=GetMicrosecondCount()-start;
      //--- >1 ms
      if(end>1000)
         Print(" > 1 ms for one SymbolInfoTick: ",DoubleToString(end/1000.0,2)," ms");
      //---
      if(end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print("SymbolInfoTick max time: ",DoubleToString(max_time/1000.0,3)," ms; avr time: ",DoubleToString(avr_time/1000.0/count,3)," ms; ",count," iterations");
//---
   start=GetMicrosecondCount();
   for(int i=0; i<count; i++)
      SymbolInfoTick(_Symbol, Tick);
   end=GetMicrosecondCount()-start;
   Print(count," SymbolInfoTick = ",DoubleToString(end/1000.0,2)," ms");
  }

Dovrebbe essere qualcosa del genere:

2020.06.04 11:02:30.123 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.138 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:30.138 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 14.85 ms
2020.06.04 11:02:31.433 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.051 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:31.448 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.17 ms
2020.06.04 11:02:33.064 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.035 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:33.079 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.12 ms

Se non ci dici in dettaglio cosa stai facendo, come esattamente stai mettendo un carico sul terminale, sarà difficile per noi trovare le ragioni.

 
Anton:

Cosa mostrerà il test su un terminale "vuoto"?

Dovrebbe andare più o meno così:

        SymbolInfoTick max time: 0.034 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 8.56 ms
        SymbolInfoTick max time: 0.047 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.04 ms
        SymbolInfoTick max time: 0.045 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.02 ms

Se non ci dici in dettaglio cosa stai facendo, esattamente come stai mettendo il carico sul terminale, sarà difficile per noi trovare le ragioni.

100K iterazioni non sono un indicatore. Poiché la funzione non sempre rallenta, ma a volte.

In effetti ho bisogno di disattivare pezzi del combattimento EA fino a quando la frenata si ferma. Allora posso fornire il codice. Dobbiamo aspettare.

 
fxsaber:

In effetti, ho bisogno di disattivare pezzi del consigliere di combattimento fino a quando i freni si fermano. Allora posso fornire il codice. Devo aspettare.

Esegui questo EA su alcuni personaggi per ottenere un risultato rapido.

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

void OnTick()
{
  MqlTick Tick[1];
  
  if (_B(CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1), 1)) // Не знаю, влияет это или нет.
    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
}


L'ho preso in cinque minuti.

        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 9 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 3 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 4 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 5 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.


Sembra che sia sufficiente lasciare solo questo (senza CopyTicks) nell'EA.

    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
 
fxsaber:

100K iterazioni non sono un indicatore. Poiché la funzione non sempre rallenta, ma a volte.

Propongo di cambiare il concetto di definizione della solidità di una funzione.

Una funzione è veloce se non ci sono picchi nel suo tempo di esecuzione.


Come è stato mostrato sopra, anche le funzioni semplici hanno tali picchi. A volte molto grandi. Non ho idea di cosa abbia a che fare con questo. Ma è ovvio che tutte le funzioni critiche per il trading dovrebbero essere controllate per la presenza di picchi utilizzando il metodo suggerito sopra. Cioè eseguiamo e monitoriamo i picchi superiori al millisecondo per un paio d'ore.


È necessario ottenere che non ci siano picchi almeno su un terminale vuoto. Le 100K iterazioni veloci si rivelano essere niente.

 
fxsaber:

Suggerisco di cambiare il concetto di definizione della solidità di una funzione.

Una funzione è veloce se non ci sono picchi nella sua durata.


Come mostrato sopra, anche le funzioni semplici hanno tali picchi. A volte molto grandi. Non ho idea di cosa c'entri questo. Ma è ovvio che tutte le funzioni critiche per il trading dovrebbero essere controllate per la presenza di picchi utilizzando il metodo suggerito sopra. Cioè eseguiamo e monitoriamo i picchi superiori al millisecondo per un paio d'ore.


È necessario ottenere che non ci siano picchi almeno su un terminale vuoto. Le 100K iterazioni veloci si rivelano essere niente.

A volte succede che il timer mostra una quantità cumulativa di tempo se un altro compito è in esecuzione. Per esempio, può succedere quando si lavora con canvas - quando la funzione di visualizzazione imposta il compito di visualizzare senza creare un'immagine e torna indietro. Dopo di che qualsiasi altra funzione viene eseguita in modo sequenziale, per esempio lo stesso commento, tuttavia il processo di mappatura del canvas viene avviato nel linguaggio della CPU e solo dopo viene visualizzato il kanvas. Misurando i tempi si può vedere che il commento impiega un tempo molto lungo per essere emesso, ma la funzione di visualizzazione kanvas funziona in 0 ms.

 
fxsaber:

eseguire e monitorare i picchi superiori al millisecondo per un paio d'ore.

Dobbiamo assicurarci che non ci siano picchi almeno su un terminale vuoto. Le 100K iterazioni veloci si sono rivelate inutili.

Ho redatto un tale Expert Advisor per il monitoraggio.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#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));

    _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);
}


Ho ottenuto il risultato in cinque minuti di monitoraggio.

        Alert: Time[Test6.mq5 18: HistorySelect(Tick.time,INT_MAX)] = 21 ms.
        Alert: Time[Test6.mq5 24: HistoryDealSelect(0)] = 4 ms.
        Alert: Time[Test6.mq5 10: SymbolInfoTick(Symb,Tick)] = 24 ms.
        Alert: Time[Test6.mq5 14: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 4 ms.
        Alert: Time[Test6.mq5 30: HistoryOrderSelect(0)] = 3 ms.
        Alert: Time[Test6.mq5 35: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 2 ms.


SZZY Con tale valore del parametro di ingresso ci sono molti meno allarmi.

input int inAlertTime = 10; // Нижний порог в миллисекундах


Ma il risultato è anche più significativo.

        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 19 ms.
        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 13: SymbolInfoTick(Symb,Tick)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 148 ms.
        Alert: Time[Test6.mq5 74: SymbolName(0,true)] = 11 ms.
 

Infine, con me che modifico un mucchio di ordini a volte ci vogliono 3-10 secondi per ordine. Dopo di che ci vuole di nuovo un tempo lungo di 0,1 secondi.

Ho preso i log del server - lì è istantaneo.


È molto sgradevole su un Expert Advisor da battaglia.

2020.06.04 15:24:48.771 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 61 ms.
2020.06.04 15:25:21.729 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 29 ms.
2020.06.04 15:27:57.842 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 142 ms.


Alcuni valori fantastici.

 
fxsaber:

Infine, con me che modifico un mucchio di ordini a volte ci vogliono 3-10 secondi per ordine. Dopo di che ci vuole di nuovo un tempo lungo di 0,1 secondi.

Registri del server sollevati - lì all'istante.

La situazione si è ripetuta su un altro server di trading.

Il terminale ha modificato la posizione aperta in 2,5 secondi. Sul server - 2 millisecondi.

Molto probabilmente, questa è anche la fonte dei problemi con FORTS-execution.

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.03.30
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 

Ritrasmette.

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

MetaTrader 5 build 1700 beta della piattaforma: progetti in MetaEditor e strumenti sintetici

Renat Fatkhullin, 2017.12.14 12:47

Questo è un indicatore della qualità della comunicazione. La percentuale di pacchetti di rete ritrasmessi nel protocollo TCP/IP.

È calcolato globalmente a livello di interfaccia di rete per tutte le applicazioni nell'intero sistema operativo. Quando sospettate lentezza e problemi, guardate questa metrica. Critico quando il server del broker è molto lontano. Per esempio per i commercianti asiatici e un broker in Europa.

Già al 3% di tasso di ritrasmissione si può dire che non si può commerciare. Il livello estremo di ritrasmissioni è dato da un cattivo wifi.

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

Nuova MetaTrader 5 build 2360: integrazione ampliata con SQLite

Renat Fatkhullin, 2020.04.06 12:33

La norma dovrebbe essere meno dell'1%. E già il 3% di perdita di rete uccide i servizi a bassa latenza.

Per esempio, i nostri ritrasmessi sono 0,68 - 0,75% con ovviamente più utenti (abbiamo 17k online su MetaQuotes-Demo). E noi serviamo il mondo intero, non Mosca/Russia.

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

Bug, bug, domande

Renat Fatkhullin, 2017.12.17 23:03

Queste sono statistiche dell'interfaccia di rete dell'intero computer, dove Metatrader è solo uno degli utenti. Non è necessariamente legato al server di trading.

Le statistiche generali possono essere facilmente corrotte da un browser web dopo aver fallito l'accesso a qualche sito glitch e lontano. È anche possibile per un wifi locale prendere un conflitto di rete e ottenere decine di ritrasmissioni percentuali in momenti casuali.

Nel caso del 20% di ritrasmissioni non ci sarà alcuna connessione al server commerciale e le riconnessioni saranno costanti e infinite. Il terminale ha una connessione costante e anche il 3-5% di ritrasmissioni sarà fatale per mantenere lunghe connessioni.

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

Bug, bug, domande

Renat Fatkhullin, 2017.12.18 11:36

Tenete a mente che questa è una caratteristica tecnica del vostro stack TCP/IP locale , riportata dal sistema operativo, non un indicatore della qualità di una particolare connessione ai server di trading. Include tutta l'attività di rete, compresa l'attività del sistema/telefono.


La connessione di un cluster di trading è nota per essere di alta qualità e noi registriamo molti parametri (questa è una funzionalità standard della piattaforma), raccogliendo istantanee di un minuto e successive analisi.

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

Bug, bug, domande

Renat Fatkhullin, 2017.12.18 00:13

Controllato.

Nessuno dei nodi del nostro cluster dimostrativo, compresa Asia, ha avuto alcun riavvio o aumento del livello di ritrasmissione per tutto il giorno (e anche in altri giorni). Tutto è tra lo 0,5% e l'1,5% normale.


Mi sembra di averne molti.

Ora è mezzanotte, i quotisti sono raramente aggiornati. Le ritrasmissioni stanno aumentando sotto i miei occhi. Voglio mettere Alert su VPS ad un valore alto > 1% per il trading a bassa latenza. Ma con valori così grandi questa idea diventa inutile.


Cosa posso consigliare? Fare tracert al server commerciale? Una specie di programma di monitoraggio? In generale, come assicurarsi che MT5 sia pronto per la bassa latenza?


ZS Non appena le quotazioni iniziano a muoversi più velocemente, l'indice scende molte volte.

 
fxsaber:

Ritrasmettitori.


Sembra che io ne abbia un sacco.

5-6 del mattino:

Casa (ottica, ETH al router, cavo al computer) - 8-19%, ping 60-70

VPS in Olanda (momentaneamente 1 MT5 con 9 grafici currencies/11) - 1,2-1,6%, ping 3,7