MT5 e la velocità in azione - pagina 78

 
Valeriy Yastremskiy:

Capire correttamente che la memoria del terminale è impilata con la memoria del programma terminale di mcl, tix e altri.

No. Semplicemente CopyTicks memorizza la cache dei tick richiesti per 10 secondi. Per esempio, richiesti 3 Gb di memoria, Terminal memorizzerà questi 3 Gb in più nella cache. Il terminale totale consumerà 6 GB. Se fate ArrayFree e richiedete 3 Gb per un altro simbolo, il terminale consumerà 9 Gb. E così via.

 
Valeriy Yastremskiy:

Capire correttamente che la memoria del terminale si aggiunge alla memoria dei programmi del terminale mcl, tix e altri.

Naturalmente.
 
Abbiamo bisogno di fare uno script che crei un simbolo personalizzato basato sulla storia dei tick di diversi simboli tramite una formula
MqlTick Formula( const MqlTick &Symbol1_Tick
                 const MqlTick &Symbol2_Tick,
                 const MqlTick &Symbol3_Tick,
                 const MqlTick &Symbol4_Tick,
                 const MqlTick &Symbol5_Tick );

Sembrerebbe che 100 MB di RAM dovrebbero essere sufficienti per questo compito, anche per un miliardo di tick. Ma in MT5 non è possibile risolvere questo compito tramite CopyTicks.

Ecco la stampella:

  1. CopyTicks viene chiamato per ogni simbolo separatamente (e necessariamente con l'attesa del rilascio della cache dopo ogni chiamata), scrivendo la storia dei tick nei suoi file corrispondenti tramite FileSave.
  2. Poi viene la lettura delle zecche da questi file e la chiamata di Formula per loro.

Sì, è una stampella inquietante, ma non ci sono altre opzioni. Quindi, non potete lavorare direttamente con CopyTicks. È necessario utilizzare archivi di file delle zecche.


Il maggior consumo di memoria sarà in p.1. anche con la condizione di aspettarsi il rilascio della cache dopo ogni chiamata. In questo caso p.2. funzionerà gratuitamente!

 

Faccio trading su 8 coppie contemporaneamente, con diversi Expert Advisors su ogni coppia. E anche se in termini di risorse sembra buono, l'uso della memoria non è più del 25%, la CPU non è caricata più del 10%, i ritardi sono evidenti, come un nuovo grafico si apre per alcuni secondi, così come nel trading generale. Forse ci sono alcune buone pratiche, almeno in astratto, su come impacchettare il tutto e farlo funzionare più velocemente? So che state virtualizzando diversi Expert Advisor in uno solo. Quali sono le insidie? Come è stato implementato l'invio di ordini commerciali? A cosa dovrei prestare attenzione?

P.S. Io stesso uso la sincronizzazione tramite Virtual e commercio tramite MT4Orders, 1 EA per grafico.

 
fxsaber:

Allo stesso modo. Prendete il vostro VPS. I selezionatori di mercato non possono lavorarci.

ZS Sarebbe bello sbarazzarsi degli intoppi che si verificano da mesi. Esegui questo script su una macchina con RAM infinita. Per esempio, non posso caricare le zecche dal 1° giugno solo un carattere alla volta. Appende semplicemente CopyTicks con zero consumo di risorse.

Fate un dump del terminale quando si "blocca". Vediamo qual è la causa.

 
traveller00:

Faccio trading su 8 coppie contemporaneamente, con diversi Expert Advisors su ogni coppia. E anche se in termini di risorse sembra buono, l'uso della memoria non è più del 25%, la CPU non viene caricata più del 10%, i ritardi sono evidenti, come un nuovo grafico si apre per alcuni secondi, così come nel trading generale. Forse ci sono alcune buone pratiche, almeno in astratto, su come impacchettare il tutto e farlo funzionare più velocemente?

Utilizzate un MT4Orders fresco (dove la gestione della storia è accelerata dopo la creazione di questo ramo) e fate uno snapshot dell'ambiente attuale: ordini e posizioni. Io ho tutto il necessario per volare.

So che state virtualizzando diversi Expert Advisor in uno solo. Quali sono le insidie? Come è stato implementato l'invio di ordini commerciali? A cosa dovrei prestare attenzione?

Sto usando OrderSend sincrono, ma sto disabilitando i controlli di MT5.

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

Biblioteche: MT4Orders

fxsaber, 2020.09.29 08:45

Con questa linea.

MT4ORDERS::OrderSend_MaxPause = 0; // Отключение проверки корректности работы MT5-OrderSend.

può essere usato per disabilitare tutto. Può essere utile in caso di storia di trading MT5 lenta, perché MT4Orders controlla la correttezza (e persino corregge) di MT5-OrderSend a volte attraverso il riferimento a questa storia.

Non consiglio di farlo.


Ogni set (insieme di parametri di input) è dato il proprio Virtuale. Il sincronizzatore passa attraverso tutti i Virtuali e fa la sincronizzazione per ognuno di essi. Deve farlo in un ciclo, non dal primo virtuale.

Dopo ogni chiamata OrderSend (all'interno del sincronizzatore) viene necessariamente fatta un'istantanea e vengono aggiunti nuovi tick (a tutti i Virtual) che sono venuti durante il tempo di esecuzione di OrderSend. Cioè dopo ogni ipotetica pausa facciamo tutto di nuovo.

Le zecche fresche sono prese solo tramite CopyTicks ogni volta. Nessun SymbolInfoTick da scorrere. Assicuratevi che se CopyTicks_LastTick.time_msc < SymbolInfoTick.time_msc (succede spesso, anche se le chiamate sono una dopo l'altra (in qualsiasi sequenza), allora il sincronizzatore non è abilitato. Altrimenti, potreste incontrare che il limite di tempo reale viene eseguito, ma il limite di tempo virtuale no. E ci saranno problemi di sincronizzazione.

Faccio delle istantanee attraverso VIRTUAL::Snapshot. Oltre all'ovvia velocità, ti permette anche di separare il tuo simbolo dal resto - solo il tuo simbolo ci arriva. Questo dà ancora più velocità. Inoltre, non solo la storia è disabilitata nell'istantanea,

#define  VIRTUAL_SNAPSHOT_WITHOUT_HISTORY // Отказ от снепшота истории для повышения производительности

ma anche i campi (contrassegnati qui sotto), che richiedono l'accesso alla storia.

#define  MACROS(A) this.##A = ::Order##A();

  bool ORDERS::Copy( const bool WithoutHistory = false )
  {
    MACROS(CloseTimeMsc)

    if (WithoutHistory && !this.CloseTimeMsc) // Для исторических ордеров оставляем все без изменений.
    {
      const string Str = NULL;
      this.comment = Str;

      this.Commission = 0;
      this.OpenPriceRequest = this.OpenPrice;
    }
    else // В MT4Orders требуется обращение к истории.
    {
      const string Str = ::OrderComment();
      this.comment = Str;

      MACROS(Commission)
      MACROS(OpenPriceRequest)
    }

In precedenza ho anche controllato che LastDeal.time_msc non fosse più grande di LastTick.time_msc. Se questa condizione non era soddisfatta, rifiutavo la sincronizzazione per ovvi motivi. Ma tale controllo consuma molte risorse (funziona con la storia), quindi ho rifiutato.


Funzione di trading on - OnTick.


Probabilmente ho elencato i principali.

 

Sincrono, suppongo, non soloOrderSend, ma tutti gli ordini commerciali, compresa la modifica, la cancellazione ecc.


SymbolInfoTick non viene lanciato attraverso, perché l'ordine dei tick può incasinarsi? E i CopyTick sono esattamente nell'ordine giusto.


Si scopre che SymbolInfoTick è necessario solo per controllare il tempo e questo è tutto? Tutti i trade, ecc. sono corretti solo daCopyTicks?


Ha senso cercare di impacchettare diversi EA in un grafico 1 su 1? Nulla di impossibile, ma cercando di capire se vale la pena di fare la fatica e riscrivere o il profitto sarà minimo?

 
traveller00:

Ha senso cercare di impacchettare diversi EA in un grafico 1 su 1? Niente di impossibile, ma sto cercando di capire se vale la pena di fare la fatica e riscrivere o il profitto sarà minimo?

Da dove verrebbe il profitto? Tutti saranno in attesa di uno qualsiasi di loro al momento del commercio.

E c'è solo meno parallelismo.

A meno che non si possa tenere una cache di ordini per tutti, ma il beneficio è discutibile...

 
Anton:

Fate un dump del terminale quando si "blocca". Vedere cosa lo sta causando.

Il codice che riproduce il problema non ti basta? O non si riproduce?

 
traveller00:

Sincrono, suppongo, non soloOrderSend, ma tutti gli ordini commerciali, compresa la modifica, la cancellazione, ecc.

Intendevo MT5-OrderSend.

SymbolInfoTick non viene passato, perché l'ordine dei tick può essere rovinato? E CopyTicks va esattamente tutto nell'ordine corretto.

Perché ci saranno dei buchi.

Quindi, SymbolInfoTick è richiesto solo per il controllo del tempo, tutto qui?

Sì.

Tutto il commercio, ecc. andrà solo tramiteCopyTicks?

Solo.

Ha senso cercare di impacchettare diversi EAs in 1 su 1 grafico? Nulla di impossibile, ma cercando di capire se vale la pena di fare la fatica e riscrivere o il profitto sarà minimo?

Questo è un grande aiuto per me.


Ogni singolo passaggio (in modalità test singolo) alla fine scrive i suoi insteps nello stesso file. Così, dopo aver guardato alcuni passaggi dopo l'ottimizzazione, ottengo un file con i dati di quei passaggi. Poi li filtro in questo file, lasciando solo ciò che sembra buono. E seleziono semplicemente questo file usando la finestra di dialogo FileSelectDialog quando avvio il robot. Così negozia il portafoglio.


Si scopre che l'Ottimizzazione richiede 20 minuti. Anteprima dei passaggi - 3 minuti. Il loro filtro - 3 minuti. Lancio del robot in funzione - secondi. Il robot non ha bisogno di essere compilato. Tenere traccia delle versioni e dei grafici - allo stesso modo.

All'avvio posso vedere il Rapporto di ogni set. In qualsiasi momento posso vedere lo stato del virtuale e il suo omonimo dal reale, e l'hotkey dettagliato HTML-Report sia per il virtuale che per il reale. Sia per un singolo set che per l'intero portafoglio.


Poiché le statistiche di trading dei Virtuals sono appositamente scritte in modo rapido, è possibile confrontare rapidamente i set al volo (dalla tastiera).

File:
clip0184.gif  64 kb