MT5 e la velocità in azione - pagina 61

 
fxsaber:

Sento che questo muro di MQ non passerà senza il sostegno dei membri del forum. Il codice è breve, i professionisti dovrebbero essere in grado di capirlo rapidamente. Non ci sono difetti. Si dimostra chiaramente che i prezzi attraverso le posizioni sono ottenuti molto più velocemente che da Market Watch. Come MQ non riesca a vedere l'ovvio - non lo capisco.

1. Il tuo test conta davvero una micro percentuale di iterazioni a causa della condizione

if (Interval##A > 100)

In sostanza si contano solo le anomalie in cui il processore è sovraccarico di compiti e rimanda l'esecuzione del dato compito sul ripiano più lontano, poiché oltre il 99% delle iterazioni viene eseguito in meno di 1 microsecondo.

E anche se si imposta la condizione >0, non c'è ancora obiettività.

2. La misurazione del tempo di tali operazioni veloci dovrebbe essere fatta solo come tempo di ciclo completo, non come singola iterazione.

3. Ma poiché il ciclo nel tuo esempio è limitato a 10 secondi (Perché! Per i tic credo che 0,1 secondi siano sufficienti. Perché può benissimo succedere che 3 tick arrivino in un secondo, e tutti e tre i tick saranno eseguiti per 10 secondi ciascuno, e in parallelo), quindi non è necessario alcun timing. È più facile calcolare quante iterazioni saranno eseguite in un dato tempo. Più, più produttività.

Ho modificato "un po'" il tuo codice. Penso che la mia variante rifletta meglio la realtà.

Il calcolo viene fatto uno alla volta, per non mischiare le due varianti. I tick pari sono perSYMBOL_BID, quelli dispari - per GetBid().

Ho aggiunto le somme e il loro output per sicurezza, come tentativo di ingannare il compilatore contro l'ottimizzazione.
Il risultato dell'uscita è cumulativo.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  TimeLoop 125  // 15.625*8  

bool GetPosition(const int Type = OP_BUY)
  {
   bool Res = false;
   for(int i = PositionsTotal() - 1; (i >= 0) && !Res; i--)
      Res = PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) &&
            (PositionGetString(POSITION_SYMBOL) == _Symbol);
   return(Res);
  }

// Альтернативный способ получения Bid-цены текущего символа.
// Запускать только на демо-счетах.
double GetBid()
  {
   static const TICKET_TYPE Ticket = GetPosition() ? PositionGetInteger(POSITION_TICKET) : OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);
   return(PositionSelectByTicket(Ticket) ? PositionGetDouble(POSITION_PRICE_CURRENT) : 0);
  }

#define  TOSTRING(A) ", "#A + " = " + (string)(A)


long N1=0;
long N2=0;
long n=0;
double sum1=0;
double sum2=0;

const bool Init = EventSetTimer(10) && GetBid(); // Будем выводить статистику каждый 10 секунд.

//+------------------------------------------------------------------+

void OnTick()
  {
//  return;
   const uint StartTime = GetTickCount();
   if(n%2==0)
      while(!IsStopped() && (GetTickCount() - StartTime < TimeLoop))
        {
         sum1+=SymbolInfoDouble(_Symbol, SYMBOL_BID);
         N1++;
        }
   else
      while(!IsStopped() && (GetTickCount() - StartTime < TimeLoop))
        {
         sum2+=GetBid();
         N2++;
        }
   if(n%2==0 && n>1)
      if (N1>N2) Print(_Symbol+": SYMBOL_BID быстрее GetBid() в " + DoubleToString(double(N1)/N2,2) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString((TimeLoop*1000000.0*n/2)/N1,2) + " ns, GetBid() - " + DoubleToString((TimeLoop*1000000.0*n/2)/N2,2) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
      else       Print(_Symbol+": GetBid() быстрее SYMBOL_BID в " + DoubleToString(double(N2)/N1,2) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString((TimeLoop*1000000.0*n/2)/N1,2) + " ns, GetBid() - " + DoubleToString((TimeLoop*1000000.0*n/2)/N2,2) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
      n++;
  }
//+------------------------------------------------------------------+

Il mio risultato:

2020.10.26 19:26:46.193 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.97 раза. Среднее время одной итерации: SYMBOL_BID - 45.80 ns, GetBid() - 135.80 ns, sum1 = 106706334.7283292, sum2 = 35987491.50911281
2020.10.26 19:26:46.193 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.90 раза. Среднее время одной итерации: SYMBOL_BID - 45.10 ns, GetBid() - 130.82 ns, sum1 = 34042649.2788716,  sum2 = 11735304.45101236
2020.10.26 19:26:47.085 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.95 раза. Среднее время одной итерации: SYMBOL_BID - 45.57 ns, GetBid() - 134.55 ns, sum1 = 110131593.3516681, sum2 = 37303001.98488424
2020.10.26 19:26:52.397 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 45.48 ns, GetBid() - 135.90 ns, sum1 = 113269505.1945728, sum2 = 37903458.6724181
2020.10.26 19:26:59.412 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.85 раза. Среднее время одной итерации: SYMBOL_BID - 45.16 ns, GetBid() - 128.57 ns, sum1 = 36611618.7279973,  sum2 = 12858907.51985167
2020.10.26 19:27:00.131 FxSaberBidSpeed (BTCUSD,M1)     BTCUSD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 47.10 ns, GetBid() - 130.88 ns, sum1 = 305215291120.0239, sum2 = 109832697267.1495
2020.10.26 19:27:03.303 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.96 раза. Среднее время одной итерации: SYMBOL_BID - 45.44 ns, GetBid() - 134.61 ns, sum1 = 116279675.0471961, sum2 = 39248002.75579567
2020.10.26 19:27:06.318 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 45.17 ns, GetBid() - 135.96 ns, sum1 = 119877506.6663743, sum2 = 39829996.08171722
2020.10.26 19:27:06.709 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 44.92 ns, GetBid() - 135.42 ns, sum1 = 123505976.1123297, sum2 = 40965170.16304104
2020.10.26 19:27:07.803 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 44.84 ns, GetBid() - 134.00 ns, sum1 = 126664503.6443297, sum2 = 42385980.37108831
Come potete vedere, la differenza di prestazioni è tre volte a favore della versione standard.
 
Nikolai Semko:


Come potete vedere la differenza di prestazioni è tre volte a favore della versione originale.

La versione originale di fxsaber mostra il vantaggio di GetBid, o si tratta di un PC più potente/meno carico?

 
Andrey Khatimlianskii:

La versione originale di fxsaber mostra il vantaggio di GetBid, o è un PC più potente/meno carico?

La sua variante ha anche mostrato il vantaggio di GetBid a pieno carico della CPU. Ma allo stesso tempo la mia variante mostra tre volte il vantaggio della funzione regolare allo stesso carico.
Questo
perché la mia variante prende in considerazione il tempo medio di tutte le iterazioni per ottenere il prezzo Bid e la sua solo una minuscola frazione con appese anomale.
Chissà per quale motivo il processore si impantana con la funzione regolare (quando il ritardo è superiore a 100 µ) in un "minuto" difficile. Ma ancora il tempo medio è tre volte inferiore per la funzione regolare

Così, per esempio, se (Intervallo##A > 100) questo è il caso:

mentre se (Intervallo##A > 0) è già abbastanza diverso, mostrando una distribuzione casuale di ritardi anomali tra la versione regolare e quella alternativa di ottenere il prezzo Bid

allo stesso tempo il mio test con lo stesso carico di CPU mostra:

2020.10.26 22:16:10.569 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.95 ns, GetBid() - 161.43 ns, sum1 = 108105265.450882, sum2 = 38804020.20301527
2020.10.26 22:16:12.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.81 ns, GetBid() - 161.06 ns, sum1 = 111212159.8857315, sum2 = 39917412.88663763
2020.10.26 22:16:13.741 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.37 ns, GetBid() - 159.91 ns, sum1 = 114942034.0034028, sum2 = 41233865.03452455
2020.10.26 22:16:14.740 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.18 раза. Среднее время одной итерации: SYMBOL_BID - 52.88 ns, GetBid() - 167.92 ns, sum1 = 75470423.51597476, sum2 = 23764764.64380601
2020.10.26 22:16:15.756 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 57.30 ns, GetBid() - 159.06 ns, sum1 = 117956798.0483066, sum2 = 42491447.24894404
2020.10.26 22:16:17.646 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.19 ns, GetBid() - 158.36 ns, sum1 = 121056970.4066543, sum2 = 43721243.0341278
2020.10.26 22:16:20.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.76 раза. Среднее время одной итерации: SYMBOL_BID - 57.14 ns, GetBid() - 157.85 ns, sum1 = 124053724.3725583, sum2 = 44907061.11418578
2020.10.26 22:16:21.553 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.15 раза. Среднее время одной итерации: SYMBOL_BID - 52.80 ns, GetBid() - 166.11 ns, sum1 = 78375839.87008552, sum2 = 24913626.42960918
2020.10.26 22:16:24.865 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 56.94 ns, GetBid() - 157.50 ns, sum1 = 127392085.5933389, sum2 = 46051851.71182434
2020.10.26 22:16:27.678 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.13 ns, GetBid() - 158.30 ns, sum1 = 129851046.9417646, sum2 = 46862113.16739535

Pertanto, penso che la versione di fxsaber del test sia tutt'altro che obiettiva.

Non ho caricato la CPU con gli agenti, ma con questo script. Era più efficiente.

File:
LSD.mq5  6 kb
 

dopo una leggera modifica del test fxsaber per dimostrare chiaramente quale percentuale di iterazioni viene considerata nei calcoli:

2020.10.26 22:45:03.679 FxSaberBidSpeed (USDCAD,M1)     Alert: , TimeBid1-TimeBid2 = 2142416 mcs., TimeBid1 = 2858669, TimeBid2 = 716253,  Всего итераций - 31456223, из них принято во внимание, NBid1 = 3015, NBid2 = 1714
2020.10.26 22:45:05.739 FxSaberBidSpeed (BTCUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589,  Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 1418
2020.10.26 22:45:06.006 FxSaberBidSpeed (USDJPY,M1)     Alert: , TimeBid1-TimeBid2 = 2241890 mcs., TimeBid1 = 3204507, TimeBid2 = 962617,  Всего итераций - 54138004, из них принято во внимание, NBid1 = 4401, NBid2 = 2083
2020.10.26 22:45:09.099 FxSaberBidSpeed (EURUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1000828 mcs., TimeBid1 = 1496646, TimeBid2 = 495818,  Всего итераций - 10037824, из них принято во внимание, NBid1 = 2429, NBid2 = 1711
2020.10.26 22:45:14.803 FxSaberBidSpeed (USDCAD,M1)     Alert: , TimeBid1-TimeBid2 = 2676273 mcs., TimeBid1 = 3916168, TimeBid2 = 1239895, Всего итераций - 41606744, из них принято во внимание, NBid1 = 4935, NBid2 = 3790
2020.10.26 22:45:15.745 FxSaberBidSpeed (BTCUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589,  Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 1418
2020.10.26 22:45:16.115 FxSaberBidSpeed (USDJPY,M1)     Alert: , TimeBid1-TimeBid2 = 2653810 mcs., TimeBid1 = 4195095, TimeBid2 = 1541285, Всего итераций - 64310228, из них принято во внимание, NBid1 = 6486, NBid2 = 3879
2020.10.26 22:45:19.834 FxSaberBidSpeed (EURUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1949809 mcs., TimeBid1 = 3091755, TimeBid2 = 1141946, Всего итераций - 19435170, из них принято во внимание, NBid1 = 4724, NBid2 = 3547

cioè circa lo 0,01%.

Ci puoi scommettere.
Se il tempo medio di esecuzione di SymbolInfoDouble(_Symbol, SYMBOL_BID) è di circa 50 nanosecondi, solo quelli con tempo di esecuzione superiore a 100 000 nanosecondi sono presi in considerazione.

File:
 
Nikolai Semko:

dopo una leggera modifica del test fxsaber per dimostrare chiaramente quale percentuale di iterazioni viene considerata nei calcoli:

cioè circa lo 0,01%.

Ci puoi scommettere.
Se il tempo medio di esecuzione di SymbolInfoDouble(_Symbol, SYMBOL_BID) è di circa 50 nanosecondi, vengono contate solo le iterazioni maggiori di 100 000 nanosecondi.

Avremmo potuto semplicemente rendere la condizione non più di 100 µs, ma più di 3 µs. Il risultato è stato apparentemente lo stesso. Il pensiero era che uno studio segmentale e in diverse condizioni di esecuzione ci può essere una differenza in diversi segmenti e in diverse sezioni. Le priorità di esecuzione sono spesso fatte in funzione di qualsiasi cosa. A un carico leggero alcune priorità, a un carico elevato altre, a quelli critici, quelli che non fanno bloccare il computer e crash, e le prestazioni passano in secondo piano.

In generale, il commercio con un carico superiore al 70% dell'hardware non è corretto. È una performance quasi critica. Il carico di ferro sugli EA da combattimento non dovrebbe essere superiore al 60%.

 
Non sarò al mio computer per un po', quindi la farò breve.

In algotrading, nessuno si preoccupa della temperatura media dell'ospedale quando ci sono rallentamenti regolari. Ottenere prezzi in millisecondi è un evento regolare. E questo in un ambiente di combattimento.

Se è possibile ottenere prezzi senza picchi di lag in momenti importanti del trading, allora mi batterò proprio per questa opportunità.

Ho dimostrato con il codice che tale stampella esiste. Se volete evitare i lag, usate la stampella.

Nessuno qui ha mai guardato il codice confrontando i prezzi ricevuti quando si lavora anche con un tumbler. E lì, per usare un eufemismo, ci sono domande serie.

Il fatto è che la funzione regolare è in ritardo in modo catastrofico più spesso della stampella. E non mi interessa che il tempo medio sia vicino allo zero. Sono i ritardi che causano problemi durante il trading

Vuoi HFT - dimentica anche il lento livello di millisecondi per ora.
 
avete già dei broker HFT?).
 
secret:
e avete già broker HFT?).
Sì.
 
Igor Makanu:

provare a testare SymbolInfoTick quando c'è un solo simbolo nella panoramica del mercato e quando ci sono decine di simboli, ma chiedere un solo strumento - come nel tuo esempio

c'è un'alta probabilità che il server stia inviando traffico compresso e che SymbolInfoTick stia sperimentando questo rallentamento intermittente quando decomprime i dati

cioè, quando ci sono molti simboli, ci saranno cali ancora più frequenti o più profondi nel tempo di prova

Nelle ultime build, la ricezione del flusso di tick non ha alcun effetto, anche teoricamente. In pratica, SymbolInfoTick funziona già con la cache, ma alcuni cittadini continuano a cercare un gatto nero.

Non vedo il senso dei test su un processore caricato all'80%.

Non è nemmeno l'80% nel test. Ci sono 6 agenti in esecuzione su 4 core, cioè garantiti al 100%.

L'unica domanda è come il task scheduler del suo sistema sta gestendo la situazione. Allo stesso tempo, alcuni sostengono che la colpa è dell'implementazione del terminale.

Cioè, si crea artificialmente una situazione in cui un computer è sovraccarico, quando letteralmente tutto su di esso rallenta, e poi si fanno delle affermazioni sotto forma di "Oh, guarda, perché il terminale a volte lagga".

Chiudiamo gli occhi sul fatto che anche in queste condizioni è "circa lo 0,01%" - al diavolo i dettagli! Basta dire che "a nessuno interessa la temperatura media dell'ospedale", "i ritardi causano problemi nel trading" e "vogliamo l'HFT".

Inoltre, ovviamente vogliamo HFT in 20 esperti su un vecchio desktop da ufficio o una macchina virtuale morta.

PS PositionSelectByTicket() nella sua implementazione ha certamente accesso a una risorsa condivisa con sincronizzazione degli accessi. E se non selezioni la posizione su ogni chiamata, stai leggendo il vecchio prezzo. Era più facile "fotografare" tramite SymbolInfoDouble.

Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • www.mql5.com
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
 
il kernel in tempo reale può aiutare in qualche modo?