Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 60

 
Alexey Kozitsyn:
Non so di quale GUI tu stia parlando, ma nella scheda dei parametri della finestra del tester puoi impostare i campi di inizio e fine. E il tester determina correttamente il numero di valori dei parametri.

Passo sul campo.

 
fxsaber:

Passo sul campo.

Scusa, non ho letto attentamente.
 
fxsaber:

Campo di passi.

Probabilmente la ragione è che i campi di enumerazione possono avere autovalori che possono non essere un multiplo di qualsiasi passo.

 
Alexey Kozitsyn:

La ragione è probabilmente che i campi di enumerazione possono essere dati autovalori, che possono non essere un multiplo di qualsiasi passo.

Sì, non è un bug, ecco perché abbiamo iniziato a parlarne in questo thread. Se vogliamo un passo di ottimizzazione, può essere impostato tramite MQL per enum.

 

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

Biblioteche: TesterBenchmark

fxsaber, 2017.11.22 16:54

Inserimento di una sola linea in ciascuna delle varianti di MT5

#define Comment(A)

Completamente accelerato del 67%, artigianale del 108%!


Ma non è questo il punto principale. Siamo riusciti a velocizzare i nostri EA con una linea! E questo nell'Optimizer dove il Commento non gioca alcun ruolo.

 
// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам
// Перед использованием должен быть хотя бы один OnTick вызван тестером
bool IsRealTicks( void )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(_Symbol, Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST)));
}


Esempio di utilizzo

// Советник будет тестироваться только в режиме по реальным тикам
void OnTick()
{
  static bool IsRemove = true;
  
  if (IsRemove)
  {
    IsRemove = MQLInfoInteger(MQL_TESTER) && !IsRealTicks();
    
    if (IsRemove)
    {
      Print("Real ticks mode is needed!");
      
      ExpertRemove();
      
      return;
    }
  }
  
  //........
}
Come farlo in OnInit (senza OnTick) - non lo so.
 

Un frammento del dialogo sull'argomento menzionato

fxsaber2017.11.24 08:35
Non usate espressioni nei parametri di stampa (o di commento). Specificare i parametri separati da virgole. Allora sicuramente tutte le conversioni di stringhe saranno sovrascritte

Potresti spiegare con un esempio come queste due stringhe sono diverse in modalità Optimize?

Print((string)i + (string)d);
Print(i, d);
Squadra di supporto2017.11.24 08:44

Quando si ottimizza nel primo caso, l'espressione della stringa sarà calcolata prima della stampa. La stampa stessa sarà chiamata, ma non funzionerà.

Nel secondo caso, Print sarà chiamato, ma non funzionerà. E anche la conversione di stringhe i+d non funziona

In un semplice test, i risultati della prima e della seconda chiamata saranno gli stessi sia nel tempo che nell'output ricevuto.

Cioè, è molto più economico usare Print con le virgole per i modi Optimize che formare un singolo parametro di input per esso come una stringa.


D'altra parte, se forma tutto come una singola stringa all'interno di Print, è facile disabilitare la sua formazione nella modalità Optimize tramite

#define Print(A)

ma un tale costrutto non funziona se si usano le virgole. Inoltre, tale costruzione lo disabiliterà anche in modalità Optimize

Print(SendOrder()); // SendOrder будет проигнорирован при #define Print(A)


Pertanto (e per altre ragioni) è meglio non chiamare funzioni veramente importanti all'interno di Print. Di conseguenza, se vi prendete cura delle prestazioni in modalità Optimize, avrete ancora bisogno di fare qualcosa del genere

static const bool IsNotOptim = !MQLInfoInteger(MQL_OPTIMIZATION);

if (IsNotOptim)
{
  const string Str = GetString(); // дорогой вызов
  
  Print(Str);
//  Comment(Str); 
//  Alert(Str);
}
 
fxsaber:

Un frammento del dialogo sull'argomento menzionato

Cioè è molto più economico usare Print con le virgole per i modi Optimize che formare un singolo parametro di input come una stringa per esso.


D'altra parte, se formate tutto come una singola linea all'interno di Print, è facile disabilitare la sua formazione nella modalità Optimize attraverso

ma un tale costrutto non funziona se si usano le virgole. Inoltre, tale costruzione lo disabiliterà anche in modalità Optimize


Pertanto (e per altre ragioni) è meglio non chiamare funzioni veramente importanti all'interno di Print. Alla fine, se vi interessa la performance in modalità Optimize, dovrete comunque fare qualcosa del genere

Scusate, forse non capisco, ma perché chiamare funzioni importanti all'interno della stampa?
 
Vladislav Andruschenko:
Scusate, forse non capisco, perché devo chiamare funzioni importanti in stampa?

Non è proibito.

 
fxsaber:

Non è proibito.

Sono d'accordo.

volevo solo sapere qual è il punto?

Ora ho riscontrato un problema con più di 1000 trade nella storia e quando chiamo la funzione di elaborazione della storia, per esempio, per calcolare il profitto della storia. + Non so perché mi preoccupo di questo problema. Cioè le citazioni vengono con un ritardo.

Motivazione: