MT5 e la velocità in azione - pagina 56

 
Renat Akhtyamov:
Signori del prog...
Leggere prima l'allocazione della memoria nel computer, poi come e con quali mezzi viene fatta, poi come pulire e leggere da e verso non è difficile. Almeno sono possibili suggerimenti più ragionevoli per gli sviluppatori

Non lo sapresti su mt4?
Usate voi stessi l'Ask Bid predefinito?
In mt5 per l'interastruttura MqlTick mancano per qualche motivo.
Chiamare la funzione, riempire la struttura e solo allora ottenere il valore.
O ottenere immediatamente il valore, c'è una differenza?

O non è nella mia direzione?
Dovresti almeno indicare a chi stai scrivendo ))

 
Roman:

Le variabili predefinite, per il tick corrente, sarebbero probabilmente migliori.

Gli sviluppatori hanno precedentemente spiegato che c'è una limitazione fondamentale all'accesso diretto

void f()
{
        MqlTick t1 = _Tick;
        MqlTick t2 = _Tick;
}

e in generale, t1 non è uguale a t2. Inoltre, i valori dei campi all'interno di t1 e t2 possono finire per riferirsi a tick diversi

 
A100:

Gli sviluppatori hanno precedentemente spiegato che c'è una limitazione fondamentale all'accesso diretto

e in generale t1 non è uguale a t2. Inoltre, i valori dei campi all'interno di t1 e t2 possono riferirsi a tick diversi, anche se sono campi collegati (dovrebbero riferirsi allo stesso tick).

Brr, qual è il limite fondamentale?
La struttura nel tuo esempio non è necessaria, non ha bisogno di essere riempita.

Un valore veniva dalla presa e veniva scritto nella variabile _Ask, _Bid, ecc. secondo la struttura.
Chiedi != Chiedi secondo te?
Una restrizione si verifica se si riempie la struttura, il che richiede un po' di tempo.
Non è necessario riempirlo, ma dare direttamente_Ask, _Bid, ecc.

 
Roman:

Brr, qual è la limitazione di principio?
La struttura nel tuo esempio non è necessaria qui, non ha bisogno di essere riempita.

void f()
{
        double ask1 = _Ask;
        double ask2 = _Ask;
}

Si può riscrivere senza struttura. Nel caso generale ask1 non è uguale a ask2

 
A100:

Puoi anche riscriverlo senza la struttura. Nel caso generale ask1 non è uguale a ask2

Cioè queste sono richieste all'ambiente non sincrono, e la risposta viene ricevuta dallo stato attuale dell'ambiente? E OnTick sta catturando il tick corrente ed elaborando l'EA, ma allo stesso tempo le richieste della struttura del tick quando l'EA sta elaborando possono ottenere risposte dai prossimi tick?

 
A100:

Puoi anche riscriverlo senza la struttura. In generale, ask1 non è uguale a ask2

Così non dovete usare 100500 cifre, dove l'ultima cifra di un numero reale differisce 0.0000000000000000000001
Per ogni variabile una cifra diversa, per il prezzo doppio massimo 8.

 
Renat Fatkhullin:

Rilasciata la beta 2652, di importanza:

  • miglioramento degli interrupt di compilazione (del 22%)
  • accesso a SymbolInfoTick drammaticamente più veloce.

22% buono.

SymbolInfoTick - sulla mia macchina di casa, ho notato a occhio che non si allertava. Tuttavia, ho fatto un filtro su questi avvisi nel Log e ho visto che ce n'erano molti di più dei 2650 emessi durante lo stesso periodo ventiquattro ore fa.

Inviato entrambi i registri al PM.

 
Valeriy Yastremskiy:

Cioè queste sono richieste a un ambiente non sincrono, e la risposta è basata sullo stato attuale dell'ambiente? E OnTick cattura il tick corrente ed elabora l'EA, ma le richieste della struttura del tick quando l'EA sta elaborando possono ottenere risposte dai prossimi tick?

Sì.

 
Renat Fatkhullin:

Per un lavoro di ticchettio di massa, mettete più memoria.

4gb (prezzo €20) non è neanche lontanamente buono nel 2020 quando si tratta di analisi e ricerca.

Stiamo parlando di una chiamata una tantum a CopyTicks. Lo si fa per fare un backtest virtuale su questi tick in OnInit, e poi continuarlo in tempo reale, alimentando solo tick freschi.

Come compromesso, propongo di rilasciare la memoria nel terminale immediatamente dopo il CopyTicks chiamato in OnInit. Allora non dobbiamo introdurre una funzione di raffreddamento forzato per CopyTicks.

In questo momento, la versione Sleep del raffreddamento è molto crutchy. Ma ho mostrato sopra come questa stampella fa risparmiare memoria.


Ora si scopre che 20 Expert Advisors funzionano velocemente anche su VPS lenti. Ma avviarli è un problema serio.


Ecco un Expert Advisor che mostra il problema.

// Демонстрация 10-ти секундного удержания в памяти ненужных данных CopyTicks.
#define  PRINT(A) Print(#A + " = " + (string)(A))

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

int OnInit()
{
  MqlTick Ticks[];
  
  Print("Before CopyTicks:");
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));     
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  
  PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
  ArrayFree(Ticks);
  
  Print("After CopyTicks:");
  
  for (int i = 0; i < 10; i++)
  {
    PRINT(i);
    PRINT(MQLInfoInteger(MQL_MEMORY_USED));    
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(1000);
  }
  
  return(INIT_FAILED);
}


Risultato.

2020.10.14 08:49:24.016 Before CopyTicks:
2020.10.14 08:49:24.016 MQLInfoInteger(MQL_MEMORY_USED) = 0
2020.10.14 08:49:24.031 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 864
2020.10.14 08:49:25.399 CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 14372119
2020.10.14 08:49:25.465 After CopyTicks:
2020.10.14 08:49:25.465 i = 0
2020.10.14 08:49:25.465 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:25.499 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:26.594 i = 1
2020.10.14 08:49:26.594 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:26.630 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:27.729 i = 2
2020.10.14 08:49:27.729 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:27.762 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:28.852 i = 3
2020.10.14 08:49:28.852 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:28.884 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:29.977 i = 4
2020.10.14 08:49:29.977 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:30.009 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:31.102 i = 5
2020.10.14 08:49:31.102 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:31.136 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:32.224 i = 6
2020.10.14 08:49:32.225 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:32.257 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:33.348 i = 7
2020.10.14 08:49:33.348 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:33.381 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:34.468 i = 8
2020.10.14 08:49:34.468 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:34.501 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:35.593 i = 9
2020.10.14 08:49:35.593 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:35.605 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 860
 
fxsaber:

22% - bene.

SymbolInfoTick - sulla macchina di casa ho notato a occhio che non c'erano avvisi. Tuttavia, ho fatto un filtro su questi avvisi nel Log e ho visto che ce n'erano molti di più dei 2650 emessi durante lo stesso periodo ventiquattro ore fa.

Inviato entrambi i registri al PM.

Accelerazione di un fattore dieci nei casi di accesso parallelo di massa.

Per gli altri casi solo l'aggiornamento del processore, della memoria e del sistema operativo.

Motivazione: