Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 237

 
Alain Verleyen #:

Forse mi sfugge qualcosa, ma ho usato il tuo script per controllare PeriodSeconds (solo).


i miei risultati dal tuo test:

2023.11.15 00:26:58.896 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 29.78 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:26:59.056 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 16.03 наносекунд - PeriodSecondsFast
2023.11.15 00:26:59.477 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.08 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:26:59.477 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:16.018 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:16.318 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 29.99 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:16.474 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.59 наносекунд - PeriodSecondsFast
2023.11.15 00:27:16.901 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.74 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:16.901 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:25.206 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:25.508 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 30.14 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:25.666 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.77 наносекунд - PeriodSecondsFast
2023.11.15 00:27:26.110 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 44.47 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:26.110 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:40.780 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:41.089 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 30.90 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:41.249 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.98 наносекунд - PeriodSecondsFast
2023.11.15 00:27:41.676 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.72 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:41.676 DDD__ (EURUSD,M1)       ========================================================================

0 errors, 0 warnings, 234 msec elapsed, cpu='AVX2 + FMA3'               


Non mi piace molto il test in sé, perché nel test vengono eseguiti 10 milioni di calcoli uguali. In questo caso, non c'è alcuna garanzia che il compilatore non dia sorprese nel suo tentativo di ottimizzare il codice.
E questi valori devono essere divisi per 21 perché ci sono 21*10 000 000 iterazioni in totale.

Tuttavia, anche questo test conferma le mie conclusioni, ma per il mio processore, che sembra essere più fresco e, quindi, utilizza al massimo le moderne caratteristiche prestazionali e, quindi, è più oggettivo perché più aggiornato.


Sarebbe interessante vedere i risultati di questo test per altri.

 
fxsaber #:

Ho guardato il formato.

Probabilmente non lo velocizzerà. Ho sentito parlare della miracolosa velocità dello switch.

Un commutatore rado non dà una velocità miracolosa.

La velocità più straordinaria si ottiene con uno switch con casi da zero a 255 in incrementi di 1.

 
Slava #:

Lo switch sparso non offre una velocità straordinaria.

La velocità più elevata si ottiene con un commutatore con casi da zero a 255 con incrementi di 1

Grazie.

 
Nikolai Semko # :

i miei risultati dal vostro test:



Non mi piace molto il test in sé, perché nel test vengono eseguiti 10 milioni di calcoli uguali. In questo caso, non c'è garanzia che il compilatore non dia sorprese nei suoi tentativi di ottimizzare il codice.
E questi valori dovrebbero essere divisi per 21, perché ci sono 21*10 000 000 iterazioni in totale.

Tuttavia, anche questo test conferma le mie conclusioni, ma per il mio processore, che sembra essere più fresco e, quindi, utilizza al massimo le moderne caratteristiche prestazionali e, quindi, è più oggettivo perché più aggiornato.


Sarebbe interessante vedere i risultati di questo test per altri.

Grazie.

Quando ho postato i risultati SENZA l'ottimizzazione del compilatore era ieri tardi.

Ecco i risultati con cpu='AVX2 + FMA3' e ottimizzazione massima.


 
Nikolai Semko #:

La difficoltà principale di questo algoritmo è il calcolo dell'ora di inizio del mese (evidenziata in verde).

L'aspetto più interessante del codice e quasi non toccato nella discussione.

 
fxsaber #:

La cosa più interessante del codice e quasi non toccata nella discussione.

In questo caso l'anno inizia il 1° marzo anziché il 1° gennaio.
Questo è un suggerimento che ho visto su stackoverflow. Era un buon consiglio.
Ho dovuto scrivere uno script per trovare il fattore 30,68
 

Mi sono trovato di fronte alla necessità di salvare codice molto breve (< 15 righe) sotto forma di mqh-library.

template <typename T1, typename T2>
T1* New( const string &ClassName ) { return((typename(T2) == ClassName) ? new T2 : NULL); }

template <typename T1, typename T2>
T1* New( string ClassName, const T2 &FuncNew[] )
{  
  T1* Res = NULL;
  
#ifdef __MQL5__
  ClassName = "class " + ClassName;
#endif // #ifdef __MQL5__
  
  for (uint i = ArraySize(FuncNew); (Res == NULL) && (bool)i--;)
    Res = FuncNew[i](ClassName);  
    
  return(Res);
}

È una misura forzata perché i puntatori alle funzioni sono possibili solo per le funzioni dello scopus globale.

Quante librerie brevi utilizzate?

 
La firma di una funzione modello può dipendere dalla posizione della sua chiamata.

Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading

Errori, bug, domande

fxsaber, 2023.11.26 23:26

template <typename T>
void Func( void ) { Print(__FUNCSIG__); }

void OnStart()
{
  Func<int>(); // void "void OnStart()"::Func<int>()
}
 

Se ho capito bene, in questo caso il metodo A::f() è inlineato in g().

class A
{
  void f() {}
  void g() { this.f(); }
};


E qui non lo è.

class A
{
  virtual void f() {}
  void g() { this.f(); }
};


Nel secondo caso, A::f() sarà inlineato dal compilatore, a condizione che non vengano creati oggetti discendenti della classe A in nessuna parte del codice?

 
A volte è necessario creare un punto di interruzione in un determinato punto del Visualizzatore. A questo scopo utilizzo una funzione di questo tipo.
bool IsManualChangeTester()
{
  static const bool IsVisual = MQLInfoInteger(MQL_VISUAL_MODE);
  static ENUM_CHART_MODE PrevChartMode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE);  
  
  bool Res = false;
  
  if (IsVisual)
  {
    const ENUM_CHART_MODE ChartMode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE);
      
    if (Res = (ChartMode != PrevChartMode))
      PrevChartMode = ChartMode;
  }
    
  return(Res);
}


Con questa applicazione.

if (IsManualChangeTester())
  DebugBreak();


Quando ho bisogno di creare questa condizione, cambio semplicemente la modalità di visualizzazione del grafico nel visualizzatore.

Poi analizzo il comportamento dell'Expert Advisor in ME.