MT5 e la velocità in azione - pagina 60

 
Anton:

Codice di prova:

Questo codice mostra che l'autore non capisce il problema.

Provalo.
// Классический SYMBOL_BID vs Альтернативный SYMBOL_BID.
// Запускать только на демо-счетах.

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

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

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)

#define  MACROS(A, B)                                              \
  const ulong StartTime##A = GetMicrosecondCount();               \
  const double A = B;                                             \
  const ulong Interval##A = GetMicrosecondCount() - StartTime##A; \
                                                                  \
  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;  

long TimeBid1 = 0; // Суммарное время на длительный SYMBOL_BID
long TimeBid2 = 0; // Суммарное время на длительный GetBid()

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

void OnTimer()
{
  // На сколько отстает один вариант от другого по времени выполнения.
  Alert(TOSTRING(TimeBid1 - TimeBid2) + " mcs." + TOSTRING(TimeBid1) + TOSTRING(TimeBid2));
}

void OnTick()
{  
  const uint StartTime = GetTickCount();
  
//  return;
  
  while (!IsStopped() && (GetTickCount() - StartTime < 10000))
  {
    MACROS(Bid1, SymbolInfoDouble(_Symbol, SYMBOL_BID))
    MACROS(Bid2, GetBid())
      
//    if (Bid1 != Bid2)
//      Alert("Error!" + TOSTRING(Bid1) + TOSTRING(Bid2));
    
//    Sleep(0); // Специально убрал.
  }
}

Questo EA ottiene il prezzo Bid del simbolo corrente in due modi. Per ognuno di essi, somma il tempo di esecuzione dei casi di esecuzione lunga. E poi mostra la differenza tra i due.


Caricato 6/8 agenti. E ho eseguito questo EA su sei grafici (diversi simboli) sul demoRannForex-Server. Risultato.

2020.10.26 16:10:40.596 Test9 (EURNZD,H1)       Alert: , TimeBid1-TimeBid2 = 236507295 mcs., TimeBid1 = 246491044, TimeBid2 = 9983749
2020.10.26 16:10:42.596 Test9 (CAC40,H1)        Alert: , TimeBid1-TimeBid2 = 235249710 mcs., TimeBid1 = 241768964, TimeBid2 = 6519254
2020.10.26 16:10:44.267 Test9 (DAX30,H1)        Alert: , TimeBid1-TimeBid2 = 243552816 mcs., TimeBid1 = 253424672, TimeBid2 = 9871856
2020.10.26 16:10:44.382 Test9 (DJI30,H1)        Alert: , TimeBid1-TimeBid2 = 265778370 mcs., TimeBid1 = 272279313, TimeBid2 = 6500943
2020.10.26 16:10:44.623 Test9 (ASX200,H1)       Alert: , TimeBid1-TimeBid2 = 210921561 mcs., TimeBid1 = 219901110, TimeBid2 = 8979549
2020.10.26 16:10:44.732 Test9 (FTSE100,H1)      Alert: , TimeBid1-TimeBid2 = 226824499 mcs., TimeBid1 = 235809635, TimeBid2 = 8985136

Abbiamo una prova completa che il tempo di esecuzione totale(TimeBid1) di SYMBOL_BID è disastrosamente perdente (TimeBid2) rispetto all'alternativa che ottiene il prezzo Bid.


Questa soluzione di tipo stampella per ottenere i prezzi attuali batte le prestazioni della funzione principale MQL5 stessa. Sei d'accordo con questa prova?


Vorrei aver pensato prima a questa stampella eloquente.


ZZZY Affinché un EA funzioni, è necessario consentire il trading algo. Pertanto, eseguitelo solo su conti demo.

 
fxsaber:

Questo EA ottiene il prezzo Bid del simbolo corrente in due modi.

POSITION_PRICE_CURRENT è scattato?

Allora con cosa ci confrontiamo? Ottenere l'ultimo prezzo memorizzato (quando?) con l'ultimo prezzo noto al terminale?

Bene e circa 6 nuclei su 8 l'hanno detto chiaramente. Perché questi test?

 
fxsaber:

Questo codice mostra che l'autore non capisce il problema.

La tua affermazione dimostra che non vuoi vedere l'ovvio.

Questo codice mostra che non c'è nessuna "frenata di SymbolInfoTick".

Su un hardware più o meno moderno, il tempo di esecuzione di SymbolInfoTick è inferiore a 1 MICROSecondo.

Questo Expert Advisor ottiene il prezzo Bid del simbolo corrente in due modi. Per ognuno di essi, somma il tempo di esecuzione dei casi di esecuzione lunga. E poi mostra la differenza tra loro.

Caricato 6/8 agenti. E ho eseguito questo EA su sei grafici (diversi simboli) sul demoRannForex-Server. Risultato.

Abbiamo una prova completa che il tempo di esecuzione totale(TimeBid1) di SYMBOL_BID è disastrosamente perdente (TimeBid2) rispetto all'alternativa che ottiene il prezzo Bid.

Questa soluzione di tipo stampella per ottenere i prezzi attuali batte le prestazioni della funzione principale MQL5 stessa. Sei d'accordo con questa prova?

Vorrei aver pensato prima a questa stampella eloquente.

ZZZY Affinché un EA funzioni, è necessario consentire il trading algo. Pertanto, può essere utile eseguirlo solo su conti demo.

No, non è una prova. Un test assolutamente disgustoso che non può essere preso sul serio.

Non mi prenderò nemmeno la briga di entrare nei dettagli, il fatto che stai di nuovo cronometrando una singola chiamata usando GetMicrosecondCount(), e di nuovo con "Loaded 6/8 Agents" su una CPU a 4 kernel in background.

Ho già mostrato chiaramente sopra che è possibile trovare freni immaginari nell'esecuzione "x++" anche in questo modo.

La tua affermazione sui "freni SymbolInfoTick" è elementarmente controllata e confutata dal mio codice, molto semplice e ovvio.

L'implementazione originale di SymbolInfoTick, anche se abbastanza veloce, permetteva sporadici picchi di tempo di esecuzione su singoli thread sotto un carico stressante di multithreading.

Nelle ultime build, non ha nemmeno questo inconveniente.

È incredibile che continuiate a discutere con qualcuno che sa esattamente di cosa sta parlando, cioè vede le implementazioni e le può profilare in diverse modalità.

"Discutiamo del gusto delle ostriche e delle noci di cocco con chi le ha mangiate".

 
Andrey Khatimlianskii:

POSITION_PRICE_CURRENT è scattato?

No. MT4Orders è usato solo per piazzare una posizione.

Allora con cosa ci confrontiamo? Ottenere l'ultimo prezzo salvato (quando?) vs. ottenere l'ultimo prezzo noto al terminale?

Confrontiamo la durata del prezzo ottenuto da Market Watch e la posizione. I prezzi naturalmente coincidono.

E circa 6 nuclei su 8 hanno detto direttamente. Perché questi test?

Solo per far vedere anche ad un cieco che c'è un problema. Non ha senso, quando Bid-price non rallenta tramite la posizione e SymbolInfoTick è terribilmente in ritardo.


Sento che questo MQ-wall non può essere rotto senza il supporto degli utenti del forum. Il codice è breve, i professionisti dovrebbero essere in grado di afferrarlo rapidamente. Non ci sono difetti. Si dimostra chiaramente che i prezzi attraverso le posizioni si ottengono molto più velocemente che da Market Watch. Come i MQ non vedono l'ovvio - non capisco.

 
Anton:

La tua affermazione dimostra che non vuoi vedere l'ovvio.

Questo codice mostra che non c'è alcuna "frenata di SymbolInfoTick".

Su un hardware più o meno moderno, il tempo di esecuzione di SymbolInfoTick non supera 1 MICROsecondo.

No, non è una prova. Un test assolutamente disordinato che non può essere preso sul serio.

Non mi prenderò nemmeno la briga di entrare nei dettagli, il fatto che state ancora una volta misurando il tempo di una singola chiamata di GetMicrosecondCount(), e di nuovo sullo sfondo di "Loaded 6/8 Agents" su una CPU a 4 core è sufficiente.

Ho già mostrato chiaramente sopra che è possibile trovare freni immaginari nell'esecuzione "x++" anche in questo modo.

La tua affermazione sui "freni SymbolInfoTick" è elementarmente controllata e confutata dal mio codice, molto semplice e ovvio.

L'implementazione originale di SymbolInfoTick, anche se abbastanza veloce, permetteva sporadici picchi di tempo di esecuzione su singoli thread sotto un carico stressante di multithreading.

Nelle ultime build, non ha nemmeno questo inconveniente.

È incredibile che continuiate a discutere con qualcuno che sa esattamente di cosa sta parlando, cioè vede le implementazioni e le può profilare in diversi modi.

"Discutiamo del gusto delle ostriche e delle noci di cocco con chi le ha mangiate".

Non hai guardato il codice. Non credo nell'incompetenza.

  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;

È una condizione in cui conta solo se l'esecuzione è durata più di 100µs. Se pensi che sia un valore piccolo, allungalo di un ordine di grandezza. L'effetto è lo stesso.

Le due funzioni confrontate sono in condizioni assolutamente uguali. Uno è alla fine frenato, l'altro no. Date un'altra occhiata da vicino a ciò che misura il codice.


Al momento, la sostituzione di SymbolInfoTick negli EA di combattimento con la stampella suggerita rimuove quasi tutti i ritardi associati all'ottenimento dei prezzi correnti. È sconclusionato, ma purtroppo è così.


HI Notate il while in OnTick. È fatto deliberatamente per catturare le zecche che sono arrivate dopo che OnTick è stato accettato. Il codice non è stato scritto di punto in bianco. Non è un ciclo forzato completamente artificiale che misura la temperatura media dell'ospedale in condizioni ideali.

 
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.

Non ci sono errori nel codice, quindi SymbolInfoTick è più lento che ottenere il prezzo di una posizione aperta

Bella mossa ottenere il prezzo dalla posizione, non avrei mai immaginato o realizzato che ci potesse essere una tale differenza
 
fxsaber:

Solo per far capire anche a un cieco che c'è un problema. Beh, non ha senso quando il prezzo Bid attraverso la posizione non è lento, ma SymbolInfoTick è laggoso in modo terribile.

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

è molto probabile che il server abbia traffico compresso e che SymbolInfoTick abbia questo ritardo intermittente quando decomprime i dati

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


quindi se questo si dimostra vero, allora rifare tutta l'architettura.... piacere discutibile

 
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 ritardi periodici quando i dati vengono decompressi

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

Questa ipotesi si riferisce al caso in cui i prezzi nel Market Watch sono in ritardo rispetto ai prezzi di tumblr (e viceversa). Ma finora stiamo parlando solo della frenata di SymbolInfoTick stesso all'interno del terminale, senza toccare la questione della rilevanza del prezzo.

 
fxsaber:

Le due funzioni confrontate si trovano esattamente nelle stesse condizioni.

Almeno GetBid viene chiamato dopo SymbolInfoDouble. Se li scambiamo, il risultato sarà lo stesso?

Qualcosa mi dice chePOSITION_PRICE_CURRENT prende il prezzo memorizzato e non il prezzo fresco.

Poi di nuovo, non vedo il senso di testare su una CPU caricata all'80%. Stiamo testando le prestazioni della CPU e l'allocazione delle risorse da parte del windup, non le caratteristiche di cui abbiamo bisogno.

 
Andrey Khatimlianskii:

Almeno GetBid viene chiamato dopo SymbolInfoDouble. Se lo scambiate, il risultato sarà lo stesso?

Lo stavo sperimentando prima della pubblicazione. No, non influisce sul risultato.

Qualcosa mi dice chePOSITION_PRICE_CURRENT prende il prezzo memorizzato e non il prezzo fresco.

Questo è il punto, i programmi MQL hanno bisogno dell'ultimo prezzo che è arrivato al terminale, non di qualcos'altro. Quando un tick entra in Terminal, aggiorna automaticamente tutte le tabelle di posizione/ordine.

Bene e di nuovo, non vedo il senso dei test su una CPU caricata all'80%. Stiamo testando le prestazioni della CPU e l'allocazione delle risorse tramite il windup, non le caratteristiche di cui abbiamo bisogno.

La condizione principale è che l'ambiente sia identico per entrambe le funzioni. Il carico della CPU è il fattore più eclatante per la visibilità delle discrepanze.

Venti EAs in parallelo possono a volte fare una chiamata SymbolInfoTick allo stesso tempo, quindi c'è una raffica di millisecondi di carico e lag. Ho solo suggerito di farlo esplicitamente in modo che il problema si noti immediatamente.


Di nuovo, le condizioni di prova sono identiche per entrambe le funzioni. Fatto.

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

MT5 e la velocità in azione

fxsaber, 2020.10.26 17:53

Al momento, la sostituzione di SymbolInfoTick negli EA di combattimento con la stampella proposta rimuove quasi tutti i freni associati all'ottenimento dei prezzi correnti. È delirante, ma purtroppo è così.