Discussão do artigo "Distribuições estatísticas no MQL5 - tirando o melhor de R" - página 4

 
fxsaber:

Que porra é essa?! Os objetivos da bíblia da matemática são claros.

Encontrar um modelo matemático robusto em R. Eles o encontraram, então o investigaram em R. E então você pode facilmente portar uma solução pesquisada pronta (um algoritmo de negociação, na verdade) do R para o MQL às custas da bibla e deste artigo. Todos os tipos de aprendizado de máquina são sempre adequados para os mercados financeiros.
Escrever em MQl é uma dor de cabeça)). É mais fácil (e mais confiável)) chamar a funcionalidade necessária diretamente do R (e assim por diante)). Renat mencionou esses métodos - eles não são os mais simples e modernos, mas existem. Por exemplo, como anexar objetos COM ao MT? Parcialmente você pode (não tudo) - (perdoe-me) por meio de juntas))).
 
СанСаныч Фоменко:

Não estou entendendo algo

Qual é o resultado da chamada da função especificada em MQL? Um escalar? Um vetor?

Aqui está o que temos no R

n <- 2000

>

> k <- seq(0, n, by = 20)

>

> dbinom(k, n, pi/10, log = TRUE)

[1] -754.219687 -660.247472 -592.126636 -534.532344 -483.881605

[6] -438.460449 -397.256529 -359.600217 -325.015561 -293.146935

[11] -263.718651 -236.510862 -211.344286 -188.070044 -166.562645

[16] -146.714976 -128.434635 -111.641185 -96.264050 -82.240889

[21] -69.516303 -58.040813 -47.770020 -38.663934 -30.686405

[26] -23.804662 -17.988917 -13.212041 -9.449276 -6.678001

[31] -4.877524 -4.028903 -4.114796 -5.119322 -7.027950

> a<-dbinom(k, n, pi/10, log = TRUE)

> str(a)

num [1:101] -754 -660 -592 -535 -484 ...

Ou seja, chamar a função no R produz um vetor que pode ser desenhado usando o método universal plot

> plot(a)

Coloque o arquivo atualizado em /Include/Math/Stat, por favor.

Ele adiciona uma função sobrecarregada para o vetor + um parâmetro log_mode adicional.

Aqui está um análogo de seus cálculos, combinando completamente os resultados com o R:

#include <Math/Stat/Binomial.mqh>

void OnStart(void)
  {
   double    vars[101];
   double    results[101];
   const int N=2000;
//--- 
   for(int i=0;i<=N;i+=20)
      vars[i/20]=i;

   MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
      
   for(int i=0;i<ArraySize(results);i++)
      Print(results[i]);
//---
  }

Conclusão:

-754.2196869142003
-660.2474717208812
-592.1266359491199
-534.5323437511825 
...

Agora estamos trabalhando para adicionar operações de vetor para que a sintaxe seja a mais próxima possível do R.

Obviamente, adicionaremos muitos novos testes unitários à entrega.

Arquivos anexados:
Binomial.mqh  19 kb
 

A propósito, as afirmações sobre a otimização em velocidade total das bibliotecas matemáticas em R são muito exageradas.

Esse é o resultado da escrita do código de cabeça para baixo e da sobrecarga do sistema devido ao trabalho com objetos/entidades dinâmicos. Ao contrário do R, a MQL5 opera com matrizes claramente tipadas e compila o código em x64 nativo. Isso proporciona uma enorme vantagem e permite que você vença até mesmo as implementações de funções em DLL no R.


Aqui está um teste baseado no exemplo acima: R 3.3.1 x64

install.packages("microbenchmark")

library(microbenchmark)
n <- 2000
k <- seq(0,n,by=20)
res <- microbenchmark(a<-dbinom(k, n, pi/10, log = TRUE))
print(res)



Unit: microseconds
                                 expr    min     lq     mean median    uq    max neval
 a <- dbinom(k, n, pi/10, log = TRUE) 20.167 20.168 20.88726 20.469 20.77 35.819   100

A execução tripla mostrou um tempo mínimo de 20 microssegundos.

O mesmo teste em MQL5:

#include <Math/Stat/Binomial.mqh>

void OnStart(void)
  {
   double    vars[101];
   double    results[101];
   const int N=2000;
//--- 
   for(int i=0;i<=N;i+=20)
      vars[i/20]=i;

   ulong msc=GetMicrosecondCount();
   MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
   msc=GetMicrosecondCount()-msc;
      
   Print("Time: ",msc," msc");
//---
  }


2016.10.10 21:21:12.156 new (Si-12.16,H1)       Time: 10 msc

MQL5 conta duas vezes mais rápido: 10 microssegundos contra 20 microssegundos em R.

Calculado em i7-4930k, Windows 10 x64, MetaTrader 5 x64, sem virtualizações e sem carga externa.

 
Renat Fatkhullin:

A propósito, as afirmações sobre a otimização em velocidade total das bibliotecas matemáticas em R são muito exageradas.

Esse é o resultado da escrita do código de cabeça para baixo e da sobrecarga do sistema devido ao trabalho com objetos/entidades dinâmicos. Ao contrário do R, a MQL5 opera com matrizes claramente tipadas e compila o código em x64 nativo. Isso proporciona uma enorme vantagem e permite que você vença até mesmo as implementações de funções em DLL no R.


Aqui está um teste baseado no exemplo acima: R 3.3.1 x64

A execução tripla mostrou um tempo mínimo de 20 microssegundos.

O mesmo teste em MQL5:

MQL5 conta duas vezes mais rápido: 10 microssegundos vs. 20 microssegundos em R.

Calculado em i7-4930k, Windows 10 x64, MetaTrader 5 x64, sem virtualizações e sem carga externa.

Parabéns!!! Uma vitória limpa, em ambas as lâminas.
 
Renat Fatkhullin:

A propósito, as afirmações sobre a otimização em velocidade total das bibliotecas matemáticas em R são muito exageradas.

Esse é o resultado da escrita do código de cabeça para baixo e da sobrecarga do sistema devido ao trabalho com objetos/entidades dinâmicos. Ao contrário do R, a MQL5 opera com matrizes claramente tipadas e compila o código em x64 nativo. Isso proporciona uma enorme vantagem e permite que você vença até mesmo as implementações de funções em DLL no R.


Aqui está um teste baseado no exemplo acima: R 3.3.1 x64

A execução tripla mostrou um tempo mínimo de 20 microssegundos.

O mesmo teste em MQL5:

MQL5 conta duas vezes mais rápido: 10 microssegundos contra 20 microssegundos em R.

Cálculo no i7-4930k, Windows 10 x64, MetaTrader 5 x64, sem virtualizações e sem carga externa.

e recebi um erro((

'vars' - conversão de parâmetro não permitida

 
ivanivan_11:

e recebi um erro((

'vars' - conversão de parâmetro não permitida

Você precisa obter o arquivo atualizado em https://www.mql5.com/ru/forum/97153/page4#comment_2882502.

A função substituída para vetores foi adicionada lá.

 
Renat Fatkhullin:

Você precisa obter o arquivo atualizado em https://www.mql5.com/ru/forum/97153/page4#comment_2882502

Há uma função redefinida para vetores.

Sim, obrigado. Funciona assim. Funcionou assim para mim. Devo dizer desde já que executo o MT em vyne, 32 bits. é por isso que acho que a resposta será - 64 bits é mais rápido))) para evitar qualquer confusão - o R também é 32 bits.



 
ivanivan_11:

Sim, obrigado. Funciona assim. Funcionou assim para mim. Devo dizer que estou executando o MT sob o wyne, 32 bits. Então, qual será a resposta, posso adivinhar - 64 bits é mais rápido))))

Isso não é sério.

Em wyne, e até mesmo em 32 bits. Para 32 bits, o MT5 usa um compilador antigo semelhante ao MT4. Ele é algumas dezenas de vezes mais lento do que o código de 64 bits, que é criado por um novo compilador especialmente para a versão de 64 bits do MT5. Publicamos um relatório comparando a velocidade dos programas MQL5 de 32 e 64 bits.

Na verdade, cada programa MQL5 contém duas cópias do código compilado: 32 bits para sistemas antigos, para fins de compatibilidade, e 64 bits para os novos.

Abandonamos completamente o desenvolvimento de compiladores de 32 bits, pois não faz sentido e não tem futuro.

É por isso que você deve usar apenas versões de 64 bits do MetaTrader 5 se quiser obter o máximo desempenho.


A propósito, uma informação para aqueles que usam o MT4 - lá também a velocidade de execução do código MQL4 é algumas dezenas de vezes mais lenta do que no MetaTrader 5 de 64 bits.

 
Andrey Dik:
Parabéns! Uma vitória limpa, em ambas as lâminas.

o cálculo é duas vezes mais rápido do que o cálculo semelhante do R com compilação (a primeira passagem do R é a compilação byte/or jit, portanto, tem máx>1,5 avg e mín~=avg)?

bem, conquista... :-)

 
Maxim Kuznetsov:

duas vezes mais rápido do que o mesmo cálculo do R com compilação (a primeira passagem do R é a compilação byte/or jit, portanto, tem max>1,5 avg e min~=avg)?

bem, realização... :-)

O R levou o tempo mínimo de várias execuções, não a primeira execução e o tempo máximo.

Portanto, não, a "inicialização a frio" não explica o problema aqui. E mesmo em um ambiente em que todo o código da biblioteca está em uma DLL. Não há praticamente nada para aquecer.

Mas o que de fato explica o fato:

  1. Ausência de sobrecarga em objetos dinâmicos como no R devido ao trabalho com dados duplos puramente tipados
  2. Um compilador terrivelmente eficiente em MQL5. É realmente assustador olhar para o código asm resultante.
  3. Presença de bibliotecas MQL5 no código-fonte, o que lhe permite incorporar nativamente o código delas diretamente no local da chamada e usar ao máximo o ambiente const do local chamado.

    É aqui que o compilador tem muito espaço em comparação com as implementações realmente não otimizadas em DLLs, que não têm chance de aprender o ambiente e se ajustar a ele.