MT5 e la velocità in azione - pagina 87

 
fxsaber:

Più veloce.

Fa la stessa cosa - restituisce il valore della funzione. Ma fa anche dei controlli in anticipo.
All'interno della funzione stessa ci sono anche controlli per il valore passato del nome del simbolo, e da esso - o "se un semplice parametro stringa invece di Symbol(), _Symbol o NULL, poi controlli per il programma completo e più richiesta di proprietà", o utilizza i valori del simbolo corrente dalla cache senza ulteriori controlli.
Perché li fate ancora una volta e continuate a sostenere che accelera il recupero dei dati? Non capisco la logica di tale ragionamento.

A proposito, lo faccio sempre nelle mie funzioni, ma non credo che acceleri in qualche modo il recupero dei dati, ma piuttosto lo rallenti a causa dei controlli del valore del nome del simbolo passato nella mia funzione.

 
Artyom Trishkin:

Perché li rifate, eppure sostenete che accelera i dati?

Lei stesso ha citato la spiegazione.

 
Slava:

Symbol(), le voci _Symbol sono equivalenti a NULL (dove NULL è permesso al posto del nome del simbolo)

È lo stesso in MT4? E in MT5 Tester che dire?

 
Artyom Trishkin:

A proposito, faccio sempre così nelle mie funzioni

Mostrami per favore.

 
fxsaber:

Lei stesso ha citato la spiegazione.

Esattamente - è tutto fatto all'interno della funzione regolare. Perché duplicarlo anche all'esterno?

 
Artyom Trishkin:

Esattamente - è tutto fatto all'interno della funzione regolare. Perché duplicarlo anche all'esterno?

Allora non avete capito la spiegazione. La velocità delle due chiamate è diversa.

void OnTick()
{
  static const string Symb = _Symbol;
  MqlTick Tick;
  
  SymbolInfoTick(_Symbol, Tick);
  SymbolInfoTick(Symb, Tick);  
}
 
fxsaber:

Per favore, mostratemi.

Tutte le funzioni e i metodi in cui questo viene fatto con me?

Ce ne sono troppi.

 
Artyom Trishkin:

Tutte le funzioni e i metodi in cui lo faccio?

Uno è sufficiente.

 
fxsaber:

Allora non avete capito la spiegazione. La velocità delle due chiamate è diversa.

Mi sembra di aver capito tutto. Certo che è diverso. Come hai fatto a velocizzarlo? Si passa un valore che non è il simbolo corrente alla funzione in un caso - se è not_Symbol.

Qui, nel caso in cui si passa il valore di cui sopra alla funzione, la funzione non esegue controlli e prende il valore del simbolo corrente dalla cache.

In altri casi, interroga i dati del simbolo specificato con un controllo "programma completo" + la sua presenza nella panoramica del mercato. La vostra funzione "veloce" non si libera di questi controlli quando richiede dati da un simbolo non nativo. Allora dov'è l'accelerazione?

bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}

Solo due opzioni nella vostra funzione quando chiamata if(SymbolInfoTickFast(Symbol(), tick_array)) {}

  1. ottenere i dati del simbolo corrente - chiamare SymbolInfoTick con il parametro _Symbol (rapido)
  2. recuperare i dati di un altro simbolo - chiamare SymbolInfoTick con un parametro stringa (lento)

Un'altra cosa, se voi (nella vostra abitudine di definire tutto ciò che si muove) create una variabile stringa per il simbolo corrente, allora sì - dovete fare dei controlli qui e sostituire la vostra sostituzione macro con una variabile predefinita, o chiamare Symbol()

 
Artyom Trishkin:

Come l'hai accelerato?

È difficile per me spiegare l'ovvio.
const MqlTick GetMarketWatchTick( const string &Symb )
{
  MqlTick Tick = {0};

  SymbolInfoTick(Symb, Tick);

  return(Tick);
}

void OnTick()
{
  MqlTick Ticks[1];
  
  Ticks[0] = GetMarketWatchTick(_Symbol);
  ArrayPrint(Ticks);
}
In questo codice, è possibile accelerare GetMarketWatchTick.