Características da linguagem mql5, subtilezas e técnicas - página 237

 
Alain Verleyen #:

Talvez esteja faltando alguma coisa, mas usei seu script para verificar o PeriodSeconds (apenas).


Meus resultados do seu teste:

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'               


Não gosto muito do teste em si, porque 10 milhões dos mesmos cálculos ocorrem no teste. Nesse caso, não há garantia de que o compilador não terá surpresas em suas tentativas de otimizar o código.
E esses valores devem ser divididos por 21 porque há 21*10 000 000 iterações no total.

No entanto, esse teste também confirma minhas conclusões, mas para o meu processador, que parece ser mais novo e, portanto, usa ao máximo os recursos modernos de desempenho e, portanto, é mais objetivo por ser mais atualizado.


Seria interessante ver os resultados desse teste para outras pessoas.

 
fxsaber #:

Dei uma olhada no formato.

Provavelmente não o acelerará. No entanto, ouvi falar da velocidade milagrosa da troca.

Uma chave esparsa não proporciona uma velocidade milagrosa.

A velocidade mais maravilhosa será em uma chave com casos de zero a 255 em incrementos de 1

 
Slava #:

O switch esparso não lhe proporciona uma velocidade maravilhosa.

A velocidade mais maravilhosa será em uma chave com casos de zero a 255 em incrementos de 1

Obrigado.

 
Nikolai Semko # :

meus resultados do seu teste:



Não gosto muito do teste em si, porque 10 milhões dos mesmos cálculos ocorrem no teste. Nesse caso, não há garantia de que o compilador não terá surpresas em suas tentativas de otimizar o código.
E esses valores devem ser divididos por 21, porque há 21*10 000 000 iterações no total.

No entanto, esse teste também confirma minhas conclusões, mas para o meu processador, que parece ser mais novo e, portanto, usa ao máximo os recursos modernos de desempenho e, portanto, é mais objetivo por ser mais atualizado.


Seria interessante ver os resultados desse teste para outras pessoas.

Obrigado.

Ontem, já era tarde quando publiquei os resultados SEM a otimização do compilador.

Aqui estão os resultados com cpu='AVX2 + FMA3' e otimização máxima.


 
Nikolai Semko #:

A principal dificuldade desse algoritmo é calcular a hora de início do mês (destacada em verde).

O aspecto mais interessante do código e que quase não foi abordado na discussão.

 
fxsaber #:

O aspecto mais interessante do código e que quase não foi abordado na discussão.

Lá, o ano começa em 1º de março em vez de 1º de janeiro.
Essa é uma dica que vi no stackoverflow. Foi um bom conselho.
Tive que escrever um script para encontrar o fator 30,68
 

Deparei-me com a necessidade de salvar um código muito curto (< 15 linhas) na forma de 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);
}

É uma medida forçada porque os ponteiros para funções são possíveis apenas para funções do scopus global.

Que bibliotecas curtas você usa?

 
A assinatura de uma função de modelo pode depender dos locais de sua chamada.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Erros, bugs, perguntas

fxsaber, 2023.11.26 23:26

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

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

Se eu entendi corretamente, nesse caso, o método A::f() está incluído em g().

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


E aqui não é.

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


A::f() será alinhado pelo compilador no segundo caso, desde que nenhum objeto descendente da classe A seja criado em qualquer parte do código?

 
Às vezes, é necessário criar um ponto de interrupção em um determinado local do Visualizador. Eu uso essa função para essa finalidade.
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);
}


Com esse aplicativo.

if (IsManualChangeTester())
  DebugBreak();


Quando preciso criar essa condição, basta alterar o modo de exibição do gráfico no visualizador.

Em seguida, analiso o comportamento do Expert Advisor no ME.

Razão: