MT5 e la velocità in azione - pagina 54

 
Roman:

Ok, lasciami riformulare. Entro mql è approssimativamente possibile, a seconda della velocità di clock del processore.
Che dire del PWM? -Un segnale a impulsi di frequenza costante e duty cycle variabile.
Non imposta una costante?

Prima di tutto, leggete cos'è la funzione WinAPI Sleep e cosa fa effettivamente

PS Windows non è un sistema in tempo reale

 
Slava:

Per prima cosa, leggete cos'è la funzione WinAPI Sleep e cosa fa effettivamente

PS Windows non è un sistema in tempo reale

Cosa c'entra WinAPI Sleep?
Quando si parla di slittamento di microsecondi
Individualmente, per il vostro processore potete definire la frequenza del timer e calcolare il numero di ripetizioni.
Quindi, potete scrivere il vostro MicrosecondCount in mql, ma qual è il punto? Quello standard è sufficiente.

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman:

Mi imbarazza chiedere: cosa c'entra WinAPI Sleep?
Quando si parla di slittamento al microsecondo
Individualmente, per il vostro processore, potete definire la frequenza del timer e calcolare il numero di ripetizioni.
Quindi, potete scrivere il vostro MicrosecondCount in mql, ma qual è il punto? Quello standard è sufficiente.

Il vostro slittamento in sospeso senza commutazione di contesto consumerà il vostro core al 100%.

Questo è un metodo di programmazione inquietante. Dio non voglia che tale codice trapeli nel mercato.

 
Renat Fatkhullin:

Il vostro slittamento d'attesa senza commutazione di contesto consumerà il vostro core al 100%.

È un metodo di programmazione orribile. Dio non voglia che tale codice trapeli nel mercato.

E nessuno ha negato questo hardcore ))
Se mostri un esempio di commutazione di contesto, forse puoi migliorare?

Ecco il carico della CPU per µsSLEEP (µsRange), su VirtualBox con solo 2 core, 4 thread.
I minatori fanno peggio di così ))

cp

 

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

Biblioteche: Sequenza

fxsaber, 2020.10.13 12:54

Un esempio di un EA che ucciderà la maggior parte dei VPS.
#include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.09.01'; // С какой даты анализировать историю

void OnInit()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
    MqlTick Ticks[];
    
    PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(10000); // Ждем освобождения CopyTicks-данных.
  }
}


Lo sto eseguendo su alcuni grafici di diversi simboli. Ho usato questo script con inAmount = 5 per automatizzare questa azione.


Risultato.

2020.10.13 13:26:53.199 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406953
2020.10.13 13:26:53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 2838
2020.10.13 13:26:53.528 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430958
2020.10.13 13:26:53.807 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3144
2020.10.13 13:26:53.924 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244747
2020.10.13 13:26:54.214 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3464
2020.10.13 13:26:54.344 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327679
2020.10.13 13:26:54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3797
2020.10.13 13:26:54.864 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340006
2020.10.13 13:26:55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4308
2020.10.13 13:26:55.666 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730155
2020.10.13 13:26:55.756 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4316

Il terminale richiede più di 4 Gb di memoria per eseguire questi sei Expert Advisors. Si prega di notare che è necessario solo per l'inizializzazione, non per il funzionamento di questi EA. Immaginate di avviare il terminale con Expert Advisors che penzola. Se non si hanno a disposizione 4 Gb di RAM - è quasi un disastro.


Ora rimuoviamo il commento di questa linea nel codice sorgente.

  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

Così, abbiamo abilitato l'inizializzazione sequenziale di Expert Advisors.


Guardiamo il risultato (dopo la ricompilazione).

2020.10.13 13:27:24.002 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406980
2020.10.13 13:27:24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1234
2020.10.13 13:27:35.407 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244772
2020.10.13 13:27:35.422 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1095
2020.10.13 13:27:46.886 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340072
2020.10.13 13:27:46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1224
2020.10.13 13:27:58.293 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327724
2020.10.13 13:27:58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1114
2020.10.13 13:28:09.683 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430999
2020.10.13 13:28:09.696 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1015
2020.10.13 13:28:21.339 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730313
2020.10.13 13:28:21.363 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1519


All'inizio degli Expert Advisors siamo riusciti a ridurre il consumo di memoria del terminale di più di 2,5 Gb. La probabilità di crash dei VPS (e di computer domestici deboli) è diminuita significativamente.


Ecco come appaiono entrambe le corse nella dinamica.

Il lancio sequenziale ha allungato l'inizializzazione complessiva nel tempo, ma è riuscito a mantenere il terminale dal consumare enormi quantità di RAM.


Igrafici superiore e inferiore mostrano chiaramente il processo di inizializzazione parallela (picco alto a sinistra) e sei inizializzazioni consecutive (sei picchi centrali).


SZY Durante gli esperimenti è venuta alla luce una spiacevole sfumatura con Sleep - vedi codice sorgente.


Chiedo di permettere in qualche modo di liberare la memoria con la forza dopo aver usato CopyTicks. Non per creare queste stampelle del sonno.

 
Si prega di raccomandare il modo più economico che consuma memoria per interrogare la cronologia dei tick ad un dato intervallo.
 
fxsaber:
Si prega di consigliare il modo più economico per richiedere la cronologia delle zecche ad un dato intervallo.

mi sembra che tu non stia cercando un economico, ma un modo per liberare rapidamente la memoria

come opzione da controllare:

- avvolgere l'array dinamico MqlTick Ticks[] nella classe e creare un oggetto con new (cioè anche un oggetto dinamico), cancellarlo quando non serve

- lo stesso, ma con struttura, ma in ambito locale ( o funzione o blocco locale { } - o ciclo con una iterazione ? ), le strutture non funzionano bene come le classi - ho riscritto la maggior parte del mio codice EA abbandonando le classi e sostituendole con strutture dati, la velocità di ottimizzazione è aumentata significativamente - forse è un effetto soggettivo - forse le nuove build sono più veloci

- provare ad aggiungere ArrayFree() al distruttore

 
Igor Makanu:

Non credo che tu stia cercando uno economico, ma un modo per liberare rapidamente la memoria

Il terminale non libera la memoria. Le variabili MQL non c'entrano niente.

 
fxsaber:

Il terminale non libera la memoria. Le variabili MQL non c'entrano niente.

Cosa succede se si forza la dimensione = 1?

cosa succede se lo fai^

MqlTick  Tick[];
MqlTick  ZeroTick[1] = {0};
.....
ArrayResize(Tick,1);
ArrayCopy(Tick,ZeroTick)
 
Igor Makanu:

e se

Dopo aver chiamato CopyTicks, il terminale tiene tutti i dati in memoria per alcuni secondi. Solo nel caso in cui qualcuno voglia rileggere un pezzo di storia della zecca.

Cioè, la quantità di memoria così consumata dal terminale non dipende dalla dimensione delle variabili MQL.


Il compito è quello di forzare il terminale a rilasciare la memoria.