Discusión sobre el artículo "Distribuciones Estadísticas en MQL5: tomando lo mejor de R" - página 4

 
fxsaber:

¡¿Qué cojones?! Los objetivos de la biblia matemática son claros.

Encontrar un modelo matemático robusto en R. Lo encontraron, así que lo investigaron en R. Y entonces pueden portar fácilmente una solución ya investigada (un algoritmo de trading de hecho) de R a MQL a expensas de bibla y este artículo. Todo tipo de aprendizaje automático es siempre un ajuste para los mercados financieros.
Escribir en MQl es un dolor en el culo)). Es más fácil (y más fiable)) para llamar a la funcionalidad requerida directamente desde R (y así sucesivamente)). Renat mencionó estos métodos - no son los más simples y modernos, pero existen. Por ejemplo, ¿cómo adjuntar objetos COM a MT? Parcialmente se puede (no todo) - (perdón) a través de juntas))).
 
СанСаныч Фоменко:

No entiendo algo

¿Cuál es el resultado de llamar a la función especificada en MQL? ¿Un escalar? ¿Un vector?

Esto es lo que tenemos en 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 ...

Es decir, llamando a la función en R se obtiene un vector que se puede dibujar con el método universal plot

> plot(a)

Pon el archivo actualizado en /Include/Math/Stat, por favor.

Añade una función sobrecargada para el vector + un parámetro log_mode adicional.

Aquí tienes un análogo de tus cálculos, igualando completamente los resultados con 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]);
//---
  }

Conclusión:

-754.2196869142003
-660.2474717208812
-592.1266359491199
-534.5323437511825 
...

Ahora estamos trabajando en añadir operaciones vectoriales para estar lo más cerca posible en sintaxis a R.

Por supuesto, vamos a añadir un montón de nuevas pruebas unitarias a la entrega.

Archivos adjuntos:
Binomial.mqh  19 kb
 

Por cierto, las afirmaciones sobre la optimización a toda velocidad de las bibliotecas matemáticas en R son muy exageradas.

Este es el resultado de escribir código de cabeza y la sobrecarga salvaje del sistema debido al trabajo con objetos/entidades dinámicas. A diferencia de R, MQL5 opera con arrays claramente tipados y compila código en x64 nativo. Esto le da una gran ventaja y le permite ganar incluso contra implementaciones DLL de funciones en R.


He aquí una prueba basada en el ejemplo anterior: 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

La triple ejecución mostró un tiempo mínimo de 20 microsegundos.

La misma prueba en 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 cuenta el doble de rápido: 10 microsegundos frente a 20 microsegundos en R.

Calculado en i7-4930k, Windows 10 x64, MetaTrader 5 x64, sin virtualizaciones y sin carga externa.

 
Renat Fatkhullin:

Por cierto, las afirmaciones sobre la optimización a toda velocidad de las bibliotecas matemáticas en R son muy exageradas.

Este es el resultado de escribir código de cabeza y la sobrecarga salvaje del sistema debido al trabajo con objetos/entidades dinámicas. A diferencia de R, MQL5 opera con arrays claramente tipados y compila código en x64 nativo. Esto le da una gran ventaja y le permite ganar incluso contra implementaciones DLL de funciones en R.


He aquí una prueba basada en el ejemplo anterior: R 3.3.1 x64

La triple ejecución mostró un tiempo mínimo de 20 microsegundos.

La misma prueba en MQL5:

MQL5 cuenta el doble de rápido: 10 microsegundos frente a 20 microsegundos en R.

Calculado en i7-4930k, Windows 10 x64, MetaTrader 5 x64, sin virtualizaciones y sin carga externa.

¡¡¡Enhorabuena!!! Una victoria limpia, en ambas hojas.
 
Renat Fatkhullin:

Por cierto, las afirmaciones sobre la optimización a toda velocidad de las bibliotecas matemáticas en R son muy exageradas.

Este es el resultado de escribir código de cabeza y la sobrecarga salvaje del sistema debido al trabajo con objetos/entidades dinámicas. A diferencia de R, MQL5 opera con arrays claramente tipados y compila código en x64 nativo. Esto le da una gran ventaja y le permite ganar incluso contra implementaciones DLL de funciones en R.


He aquí una prueba basada en el ejemplo anterior: R 3.3.1 x64

La triple ejecución mostró un tiempo mínimo de 20 microsegundos.

La misma prueba en MQL5:

MQL5 cuenta el doble de rápido: 10 microsegundos frente a 20 microsegundos en R.

Cálculo en i7-4930k, Windows 10 x64, MetaTrader 5 x64, sin virtualizaciones y sin carga externa.

y tengo un error((

'vars' - conversión de parámetros no permitida

 
ivanivan_11:

y tengo un error((

'vars' - conversión de parámetros no permitida

Usted necesita tomar el archivo actualizado de https://www.mql5.com/ru/forum/97153/page4#comment_2882502.

La función anulada para los vectores se ha añadido allí.

 
Renat Fatkhullin:

Usted necesita tomar el archivo actualizado de https://www.mql5.com/ru/forum/97153/page4#comment_2882502

Hay una función redefinida para vectores.

Si, gracias. funciona asi. a mi me funcionaba asi. tengo que decirte de entrada que yo ejecuto MT desde bajo vyne, 32bit. por eso supongo cual sera la respuesta - 64bit es mas rapido))) para evitar confusiones - R tambien es 32bit.



 
ivanivan_11:

Sí, gracias. funciona así. funcionó para mí así. tengo que decir que estoy corriendo MT de bajo wyne, 32bit. así que lo que será la respuesta, puedo adivinar - 64bit es más rápido))))

Eso no es serio.

Bajo wyne, e incluso 32 bits. Para 32 bits MT5 utiliza un viejo compilador similar a MT4. Es un par de decenas de veces más lento que el código de 64 bits que es creado por un nuevo compilador especialmente para la versión de 64 bits de MT5. Hemos publicado un informe comparando la velocidad de los programas MQL5 de 32 y 64 bits.

Cada programa MQL5 contiene en realidad dos copias del código compilado: 32 bits para los sistemas antiguos en aras de la compatibilidad y 64 bits para los nuevos.

Hemos abandonado por completo el desarrollo de compiladores de 32 bits, ya que no tiene sentido ni futuro.

Es por eso que usted debe utilizar sólo las versiones de 64 bits de MetaTrader 5 si desea obtener el máximo rendimiento.


Por cierto, información para aquellos que se sientan en MT4 - allí también la velocidad de ejecución de código MQL4 es un par de docenas de veces más lento que en MetaTrader 5 de 64 bits.

 
Andrey Dik:
¡Felicidades! Una victoria limpia, en ambas hojas.

el cálculo es dos veces más rápido que un cálculo R similar con compilación (la primera pasada de R es byte/or jit compilación, por lo que tiene max>1.5 avg y min~=avg) ?

bueno, logro... :-)

 
Maxim Kuznetsov:

cálculo dos veces más rápido que el mismo cálculo de R con compilación (la primera pasada de R es compilación byte/or jit, por lo que tiene max>1.5 avg y min~=avg) ?

bueno, logro... :-)

R tomó el tiempo mínimo sobre muchas pasadas, no la primera pasada y el tiempo máximo.

Así que no, el "arranque en frío" no lo explica aquí. E incluso en un entorno donde todo el código de la librería está en una DLL. No hay prácticamente nada que calentar.

Pero lo que sí lo explica:

  1. Ausencia de sobrecarga en objetos dinámicos como en R debido al trabajo con datos dobles puramente tipados.
  2. Un compilador terriblemente eficiente en MQL5. Realmente da miedo mirar el código asm resultante.
  3. Presencia de librerias MQL5 en el codigo fuente, lo que te permite inlinear nativamente su codigo directamente en el lugar de llamada y utilizar al maximo el entorno const del lugar llamado.

    Aquí es donde el compilador tiene un montón de espacio en comparación con las implementaciones no optimizadas en DLLs, que no tienen la oportunidad de aprender el entorno y adaptarse a él.