MT5 e la velocità in azione - pagina 88

 
fxsaber:

Uno è sufficiente.

int CTickSeriesCollection::IndexTickSeries(const string symbol)
  {
   const CTickSeries *obj=new CTickSeries(symbol==NULL || symbol=="" ? ::Symbol() : symbol);
   ...
   ...
   ...
  }

Inoltre controllo per "". Io stesso uso sempre NULL quando chiamo i metodi per il carattere corrente.

 
Artyom Trishkin:

Il vostro codice non darà l'accelerazione.

 
fxsaber:
Trovo difficile spiegare cose ovvie. È possibile accelerare GetMarketWatchTick in questo codice.
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);
}

Pensi che anche se _Symbol è passato come parametro Symbol, una stringa sarà passata a SymbolInfoTick()?

Non credo che non ci siano controlli all'interno delle funzioni standard per l'uguaglianza delle stringhe al simbolo corrente, e tali parametri espliciti iniziano a controllare "a tutta velocità" se una cache per il simbolo corrente è a portata di mano.

 

L'accelerazione avviene a tempo di compilazione, non a tempo di esecuzione.

Il compilatore fa questa sostituzione:

SymbolInfoTick(_Symbol, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(NULL, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(::Symbol(), Tick) -> SymbolInfoTickInside(Tick);

In tutti gli altri casi, non viene effettuata alcuna sostituzione.

 
fxsaber:

L'accelerazione avviene a tempo di compilazione, non a tempo di esecuzione.

Il compilatore fa questa sostituzione:

In tutti gli altri casi, non viene effettuata alcuna sostituzione.

Bene. È di questo che sto parlando - il tuo codice NON velocizzerà la funzione regolare per il carattere NON corrente. Né accelererà il personaggio attuale.

E il mio non lo farà. E non l'ha mai fatto. Neanche io mi sono fatto illusioni al riguardo. Ma io uso sempre Symbol() o NULL quando chiamo le funzioni regolari se la mia funzione viene passata NULL o "". Questo chiama un codice veloce di funzione regolare - dove i dati sono presi dalla cache per il simbolo corrente.
Se la mia chiamata di funzione usa Symbol() o _Symbol - NON viene controllato all'interno della funzione standard se coincide con il simbolo corrente? Il codice con controlli a tutto campo del simbolo corrente sarà davvero eseguito? Non ci credo...

 
Artyom Trishkin:

Bene. È di questo che sto parlando - il tuo codice NON velocizzerà la funzione regolare per il carattere NON corrente. Né accelererà il personaggio attuale.

Forse qualcuno può spiegartelo più chiaramente. Non ha funzionato per me.

 
fxsaber:

Forse qualcuno può spiegartelo più chiaramente. Non l'ho capito.

Cosa stai stregando per accelerare le funzioni regolari?

State usando la sostituzione del valore del carattere corrente quando lo passate alla funzione staff per fargli usare i dati per il carattere corrente dalla cache. Questo NON accelera la funzione normale, usa la sua velocità per il carattere corrente.

Non si può accelerare qualcosa di cui non si ha accesso alla fonte. State usando la tecnica standard per chiamare correttamente la funzione. Ma non sono sicuro, se Symbol è specificato dalla stringa come "EURUSD" quando si lavora su EURUSD, cioè sta usando il simbolo corrente, allora la funzione staff non controllerà se la stringa "EURUSD" è uguale a Symbol() e non userà i dati dalla cache, ma inizierà a controllare il simbolo a tutta velocità.

Allora, dov'è l'accelerazione della funzione regolare? Se c'è, è più che interessante e utile.

 
fxsaber:

È lo stesso in MT4? E in MT5-Tester com'è?

È lo stesso con CopyTicks?

 
fxsaber:

Forse qualcuno può spiegartelo più chiaramente. Non l'ho capito.

È più probabile che lei non abbia capito la mia domanda. L'ho ripetuto più volte (e questa domanda NON riguardava "l'accelerazione della funzione regolare").

 
Slava:

Se viene specificato un normale parametro stringa invece di Symbol(), _Symbol o NULL, allora vengono eseguiti controlli completi e vengono interrogate anche le proprietà.

Per qualche ragione, questa spiegazione non dice che se il parametro stringa è uguale al carattere corrente, allora non viene fatto alcun controllo rispetto al programma completo.