MT5 e la velocità in azione - pagina 23

 
Renat Fatkhullin:

Nel caso in cui qualcuno non lo capisca, è la libreria fxsaber che sta causando la frenata quando viene applicata nel codice di qualcun altro.

Invece di sottolinearlo esplicitamente, ha iniziato a fare il gioco della frenata della piattaforma e degli esempi suicidi di scivolamento. E quando c'è stata l'opportunità di arrivare alla vera causa e appianare la questione, non l'ha colta.

Per il bene dell'ottimizzazione locale stava avvelenando la cache della cronologia per l'applicazione principale.

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

MT5 e la velocità in azione

fxsaber, 2020.09.02 00:02

C'era un codice MQL5 pulito riproducibile da molti. La cronologia del thread prima studio, invece di giocare teoria della cospirazione, che qualcuno ha bisogno di te così tanto che è disposto a spendere il suo tempo su di te per mudsling.

Stai facendo un ottimo lavoro come tacchino. Non c'è stata alcuna discussione di qualsiasi biblioteca qui specificamente nel thread in quanto non è costruttivo.

Il punto è che se qualcuno si avventura a usare librerie condivise in cui il parametro from-input non coincide, avrà dei freni. Non c'è menzione di questo da nessuna parte nella Documentazione. Almeno qualcosa su questo argomento ti è stato estratto con le pinze. E quando è stato fatto, hanno iniziato ad accusarti di imbrogliare.


Questa caratteristica di MQL dovrebbe essere scritta nel ramo Documentazione e nel ramo Caratteristiche. Esegui gli script MQL5 puliti da questo ramo sulle build corrispondenti alle date della loro creazione. A quanto pare, molte correzioni sono state fatte alla cieca, per sicurezza.

 
fxsaber:

Stai facendo un ottimo lavoro come indie. Nessuna biblioteca è stata specificatamente menzionata qui nel thread, perché non è costruttivo.

Perché avete fatto del vostro meglio per non parlare delle vostre biblioteche. In presenza di queste biblioteche. Con la costante opposizione di "il mio è più veloce". Così hai abilmente mascherato l'autoscatto infilando "guarda com'è lento".


Il punto è che se uno osa usare insieme delle librerie in cui il parametro from-input non è lo stesso, otterrà dei ritardi. Non c'è menzione di questo da nessuna parte nella Documentazione. Almeno qualcosa ti è stato tolto con le pinze. E quando è stato fatto, hanno iniziato ad accusarti di imbrogliare.


Questa caratteristica di MQL dovrebbe essere scritta nel ramo Documentazione e nel ramo Caratteristiche. Esegui gli script MQL5 puliti da questo ramo sulle build corrispondenti alle date della loro creazione. A quanto pare, molte correzioni sono state fatte alla cieca, per sicurezza.

La documentazione di HistorySelect dice chiaramente:

La funzione HistorySelect() crea una lista di ordini e una lista di operazioni nel programma mql5 per un ulteriore riferimento agli elementi della lista tramite le funzioni corrispondenti. La dimensione della lista delle offerte può essere ottenuta usando la funzione HistoryDealsTotal(), e la dimensione della lista degli ordini nella storia può essere ottenuta usando la funzione HistoryOrdersTotal(). L'enumerazione degli elementi della lista degli ordini è meglio eseguita utilizzando la funzione HistoryOrderGetTicket(), per gli elementi della lista delle offerte, la funzione HistoryDealGetTicket() è appropriata.

Dopo l'uso della funzione HistoryOrderSelect(), l'elenco degli ordini nella storia, disponibile per mql5-program, viene resettato e riempito nuovamente con l'ordine, se la ricerca dell'ordine per ticket è stata completata con successo. Lo stesso vale per la lista delle offerte, che sono disponibili per il programma mql5 - viene azzerata usando la funzione HistoryDealSelect() e riempita di nuovo se un'offerta viene ottenuta con successo dal numero del biglietto.


Quando lavorate con volumi enormi (e avete mostrato migliaia e decine di migliaia di affari nella storia per una ragione), che richiedono un accesso atomico/snapshot, dovete capire il loro costo.

Tanto più che ho spiegato i dettagli tecnici di queste cache in grande dettaglio in questo thread.


Avete provato per niente a randomizzare ogni campione e ad avvelenare il più possibile la cache? Per il bene della sua posizione qualche autoscatto è in ordine?

 
Renat Fatkhullin:

Perché hai fatto tutto il possibile per mantenere le tue biblioteche in silenzio. Ecco perché avete abilmente mascherato i bug autoinflitti ostentando "guardate quanto è lento".

Il 99% dei bug si trova in questo modo. Prima il comportamento strano si trova nel grande codice. Poi la localizzazione trova la causa. Ero più preoccupato per i freni.

funzione di trading. I problemi sono 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.
...
L'uomo ha deciso di aiutare e ha eseguito un codice MQL5 pulito sulla sua macchina. Un piccolo campione qui sopra. Leggete i nomi delle funzioni di cui sopra.


La documentazione di HistorySelect afferma esplicitamente:

La funzione HistorySelect() crea una lista di ordini e una lista di compravendite nel programma mql5 per un ulteriore riferimento agli elementi della lista tramite le funzioni appropriate. La dimensione della lista delle offerte può essere ottenuta usando la funzione HistoryDealsTotal(), e la dimensione della lista degli ordini nella storia può essere ottenuta usando la funzione HistoryOrdersTotal(). L'enumerazione degli elementi della lista degli ordini è meglio eseguita utilizzando la funzione HistoryOrderGetTicket(), per gli elementi della lista delle offerte, la funzione HistoryDealGetTicket() è appropriata.

Dopo l'uso della funzione HistoryOrderSelect(), l'elenco degli ordini nella storia, disponibile per mql5-program, viene resettato e riempito nuovamente con l'ordine, se la ricerca dell'ordine per ticket è stata completata con successo. Lo stesso vale per la lista delle offerte, che sono disponibili per il programma mql5 - viene azzerata usando la funzione HistoryDealSelect() e riempita di nuovo se un'offerta viene ottenuta con successo dal numero del biglietto.

Mi chiedo chi ha visto qualcosa tra le righe di questo testo? Personalmente, ho capito (prima di questo ramo), che HistoryDealSelect e HistoryOrderSelect devono essere scritti così.

  static bool HistorySelectOrder( const ulong Ticket )
  {
    return((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || ::HistoryOrderSelect(Ticket));
  }

  static bool HistorySelectDeal( const ulong &Ticket )
  {
    return((::HistoryDealGetInteger(Ticket, DEAL_TICKET) == Ticket) || ::HistoryDealSelect(Ticket));
  }

Altrimenti, è garantito che incontrerete dei ritardi.

Quando si lavora con volumi enormi, che richiedono un accesso atomico/snapshot, è necessario capire il loro costo.

Soprattutto perché ho spiegato i dettagli tecnici di queste cache in grande dettaglio in questo thread.

Ho raccolto le informazioni necessarie in questo thread.

 
Renat Fatkhullin:

Avete provato per niente a randomizzare ogni campione e ad avvelenare il più possibile la cache? Per il bene della sua posizione qualche autoscatto è in ordine?

Potete vedere tutto in ordine cronologico in questo thread. Il problema è stato originariamente mostrato senza randomi.

Questo thread è una grande testimonianza di come si possono distorcere le parole del tuo avversario. Tutte le fonti e i loro risultati sono salvati qui.

 

Perché il terminale non può semplicemente aumentare la cache quando la storia completa viene richiesta di nuovo, recuperare e mettere in cache l'intervallo mancante? Questo sembrerebbe risolvere il problema. Dopo tutto, quando si richiedono barre/biglietti, vengono restituiti pacchetti di dati mancanti, quindi c'è un meccanismo per questo.

 
Aleksey Vyazmikin:

Perché il terminale non può semplicemente aumentare la cache quando la storia completa viene richiesta di nuovo, recuperare e mettere in cache l'intervallo mancante?

Questo è già stato fatto.

Ma se tra HistorySelect( 0, INT_MAX ) chiamaHistorySelect( other_time, ... ), la cache sarà ricostruita a partire da other_time e la prossima richiestaHistorySelect( 0,... ) porterà a una nuova costruzione della cache (sarà più lenta).

 
Andrey Khatimlianskii:

Questo è già stato fatto.

Ma se tra le chiamate di HistorySelect( 0, INT_MAX ) chiamiamoHistorySelect( other_time, ... ), la cache sarà ricostruita a partire da other_time e la prossima richiesta diHistorySelect( 0,... ) porterà a una nuova costruzione della cache (sarà più lenta).

Se l'hai fatto, è buono, l'unica questione è poi sulla comodità di lavoro con i dati ricevuti, a condizione che la cache sia costruita.

Non ho capito le operazioni di trading così profondamente, ma se l'intervallo di query cambia, allora non c'è la possibilità di cercare rapidamente i dati all'interno della storia senza una forza bruta completa?

 
Aleksey Vyazmikin:

Non sono così addentro al trading, ma se l'intervallo della query cambia, allora non c'è modo di cercare rapidamente i dati all'interno della storia senza un'enumerazione completa?

Che senso ha questa conoscenza se non la usi?

Nessun problema pratico = nessuna domanda.

 
Renat Fatkhullin:

OrderExist e PositionExist sono funzioni speciali ottimizzate che evitano uno stupido looping di tutti gli ordini o posizioni alla ricerca di voci per simbolo, tipo di transazione e medzhik.

Il risultato è una serie di biglietti.


I programmi possono risparmiare molto denaro utilizzando queste funzioni. Soprattutto quando si chiamano posizioni aperte e ordini in massa, costantemente e ripetutamente in loop di overshoot.

In futuro implementeremo funzioni più efficaci per accedere ai dati commerciali di massa.

Il linguaggio sarà anche drammaticamente rafforzato e semplificato con funzionalità più potenti.

"OrderExist e PositionExist" - non si trovano nella documentazione, dove posso leggerli?
 
HimOrik:
"OrderExist e PositionExist" - non si trovano nella documentazione, dove leggerli?

Molto probabilmente dopo la prossima versione di rilascio (ora in beta)

Motivazione: