Un ejemplo de uso de la librería es enseñar a la red neuronal MLP la tabla de multiplicar.
:( Me da miedo pensar qué pasará con la nube cuando los usuarios empiecen a usar activamente la librería en sus expertos. Este sencillo script pesa menos de un megabyte.
Lo mismo pero para RF:
cuenta no tan preciso, debería intentar retocarlo
#include <Math\Alglib\dataanalysis.mqh>
//+------------------------------------------------------------------+#define _rand(min,max) ((rand()/(double)SHORT_MAX)*((max)-(min))+min)
//+------------------------------------------------------------------+voidOnStart()
{
CDecisionForest Trf;
CDecisionForestShell RFshell;
CMatrixDouble PatternsMatrix;
CDFReport RF_report;
int RFinfo;
double vector[2], out[1];
// preparación de datos
PatternsMatrix.Resize(100,3);
int m=0; // primer patrónfor(int i=1; i<=10; i++)
for(int j=1; j<=10; j++)
{
PatternsMatrix[m].Set(0,i/10.0); // entrada 1
PatternsMatrix[m].Set(1,j/10.0); // entrada 2
PatternsMatrix[m].Set(2,(i*j)/100.0); // objetivo
m++; //siguiente patrón
}
// Creación de RF.
CDForest::DFBuildRandomDecisionForest(PatternsMatrix,100,2,1,50,0.4,RFinfo,Trf,RF_report);
Print("Info=",RFinfo," Error=",CDForest::DFAvgError(Trf,PatternsMatrix,100));
// comprobar la red en datos enterosstring s="Prueba 1 >> ";
for(int i=1; i<=10; i++)
{
int d1=(int)_rand(1,10), d2=(int)_rand(1,10);
vector[0]=d1/10.0;
vector[1]=d2/10.0;
CDForest::DFProcess(Trf,vector,out);
s+=(string)d1+"*"+(string)d2+"="+DoubleToString(out[0]*100,0)+" // ";
}
Print(s);
// comprobar la red en datos fraccionados
s="Prueba 2 >> ";
for(int i=1; i<=5; i++)
{
double d1=NormalizeDouble(_rand(1,10),1), d2=NormalizeDouble(_rand(1,10),1);
vector[0]=d1/10.0;
vector[1]=d2/10.0;
CDForest::DFProcess(Trf,vector,out);
s+=DoubleToString(d1,1)+"*"+DoubleToString(d2,1)+"="+DoubleToString(out[0]*100,2)+
"("+DoubleToString(d1*d2,2)+") // ";
}
Print(s);
}
Considera que no es tan preciso, hay que intentar ajustarlo
PS
esta forma es más precisa, 500 árboles y r=1, más ajuste y menos ruido.
Me pregunto cuántos árboles hay que hacer para que los resultados sean precisos. Y es la tabla de multiplicar más simple, y si hay varias funciones, tenemos que ejecutar a través de RF y no la tabla de multiplicar, entonces la respuesta, obviamente, se parecerá a algo justo de lejos?
Hemos hecho una revisión completa de la versión basada en C++ GPL de la biblioteca ALGLIB, liberándola como ALGLIB++. Esto rastrea la última versión de ALGLIB, que está en 3.16.0, a partir de 2019/12. Mucho se ha agregado en los módulos de Optimización e Interpolación desde las versiones anteriores con las que MQL5 está sincronizado (por ejemplo, splines de nube de puntos (!), más métodos de interpolación ponderada de distancia inversa, numerosos métodos de optimización adicionales, etc.).
ALGLIB++ es un derivado de ALGLIB que está siendo usado como una forma intermedia en un proceso de reingeniería/refactorización a largo plazo, en el cual será recodificado en C++ nativo (similar a donde estaba antes de la Versión 3), la capa extra y la duplicación siendo removida en preparación para proveer un soporte más directo para multi-threading, así como pruebas y módulos adicionales y eventualmente un lenguaje de scripting front end.
Las diferentes versiones lingüísticas de ALGLIB se generaron a partir de un núcleo común, con la versión C++ proporcionando soporte limitado (pero no oficial) para el dialecto C90 de C. Esta característica hizo necesario simular, dentro de C, características que de otro modo serían nativas de C++, y luego proporcionar una envoltura C++ sobre esto. En consecuencia, hay dos espacios de nombres separados: alglib_impl, que contiene la versión C, y alglib, que contiene las envolturas C++. ALGLIB++ ha conservado la mayor parte de esta estructura y de la codificación original en la medida de lo posible, pero ha reducido o eliminado gran parte de la infraestructura global como primer paso para su eliminación y sustitución por código C++ nativo multihilo y ha simplificado significativamente la interfaz de las envolturas C++. Como tal, representa una forma intermedia que sirve de puente entre ALGLIB, en sí misma, y la futura biblioteca en la que se está transformando ALGLIB++.
Muchos problemas que llevaron a un crecimiento de la complejidad en ALGLIB, desde (y antes de) las versiones adaptadas por MQL5, se han resuelto, con una simplificación resultante en la estructura y la reducción de la complejidad. En su forma actual, debería resultar más fácil de adaptar a MQL5, por aquellos que actualmente mantienen la versión MQL5 de ALGLIB.
Con la distribución se incluye una reformulación completa del manual de ALGLIB++ a partir del original de ALGLIB C++. Las secciones sobre los paquetes y subpaquetes, sin embargo, son compatibles con ambas versiones de ALGLIB, y tanto el diseño como el contenido deberían adaptarse fácilmente a la versión MQL5. MQL5 se menciona en la sección "Referencias y enlaces relacionados" del manual.
La última versión se puede encontrar en para su futura integración en ALGLIB++. Otras bibliotecas, incluida MKL (que, por cierto, tiene rutinas de redes neuronales), también se están estudiando para su futura integración.
Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Permalink
Algunas notas adicionales para los desarrolladores de la versión MQL5 de ALGLIB:
Cuando se adaptó ALGLIB a MQL5, se encontró con dificultades con el "RCOMM" rutinas.
Estas son efectivamente rutinas multi-hilo, donde el cambio de hilo está escrito directamente en el código por:
(1) almacenando en caché variables locales del hilo con cada entrada y salida - ¡y las rutinas de iteración llevan a cabo potencialmente millones y miles de millones de ciclos de llamada/retorno!
(2) implementando la conmutación de hilos saltando fuera de la rutina para "pausar" un evento, y saltando de nuevo a la rutina para "reanudar" después del evento - lo que significa un montón de goto's y múltiples puntos de entrada.
(3) diezmar la estructura de flujo de control de estas rutinas para colocar los puntos de entrada en el nivel superior del cuerpo de la función.
Al adaptar ALGLIB a MQL5 mantuvo el flujo de control de diezmar en su lugar, en realidad el envío de los fragmentos de código en rutinas separadas. Esta solución - como finalmente descubriste - no es mantenible; lo que ha hecho imposible seguir el ritmo de las actualizaciones de ALGLIB. ALGLIB, en sí mismo, se quedó un poco atrás también - sus rutinas RCOMM a veces dejan estructuras y variables huérfanas de versiones anteriores.
En ALGLIB++, la estructura de flujo de control se reintegra: los puntos de entrada saltan de nuevo a la mitad de un bucle u otra estructura de flujo de control donde lo dejaron.
No hay almacenamiento en caché de las variables locales del hilo; por el momento se han hecho estáticas (a costa de la seguridad del hilo - pero el multihilo no es formalmente una parte de ALGLIB GPL).
Como en ALGLIB, esto significa que hay un montón de sentencias goto para hacer todos los saltos hacia adelante y hacia atrás; pero están organizadas de forma más limpia.
Las reparaciones hechas en ALGLIB++, por sí mismas, aceleran las rutinas en un 20-25%, según los resultados de nuestras pruebas.
Hay dos maneras de tratar con esta arquitectura para deshacerse de las sentencias goto y manejar más adecuadamente las variables locales del hilo:
(1) Implementar la conmutación de hilos, lo que significa que las rutinas RCOMM envían mensajes de "evento" (que es lo que las banderas needf, ... algpowerup son en realidad), y la persona que llama tiene que configurar un manejador de eventos para recibir y procesar los mensajes. No estoy seguro si MQL5 puede producir y manejar eventos definidos por el usuario, sin embargo.
(2) Utilice punteros de función para los eventos.
Tenga en cuenta que las rutinas RCOMM pueden estar anidadas; y en algunos casos, pueden retransmitir eventos a su llamador obtenidos de las rutinas RCOMM que ellos mismos llaman.
Los desarrolladores de ALGLIB decidieron no usar punteros de función o multi-threading, cuando implementaron ALGLIB, porque cuando ALGLIB fue lanzado por primera vez no había soporte formal para programación multi-threaded en ningún lenguaje ampliamente distribuido y ampliamente usado, y no todos los lenguajes a los que ALGLIB estaba dirigido tenían el mismo o similar equivalente a los punteros de función de C y C++. Pero MQL5 tiene punteros de función. Si adaptas ALGLIB a MQL5, será mucho más fácil hacerlo desde ALGLIB++, en su lugar, debido a la reintegración de las estructuras de flujo de control.
La solución ideal, sin embargo, es utilizar la conmutación de hilos. Con el tiempo, ya sea punteros de función o de conmutación de hilos se utilizarán en ALGLIB ++, no hemos decidido todavía qué camino tomar.
Algunas notas adicionales para los desarrolladores de la versión MQL5 de ALGLIB:
Cuando adaptaron ALGLIB a MQL5, se encontraron con dificultades con las rutinas "RCOMM".
Estos son efectivamente rutinas multi-hilo, donde el hilo de conmutación está escrito directamente en el código por:
(1) cacheando variables locales del hilo con cada entrada y salida - ¡y las rutinas de iteración llevan a cabo potencialmente millones y miles de millones de ciclos de llamada/retorno!
(2) implementando la conmutación de hilos saltando fuera de la rutina para "pausar" en un evento, y saltando de nuevo a la rutina para "reanudar" después del evento - lo que significa un montón de goto's y múltiples puntos de entrada.
(3) diezmar la estructura de flujo de control de estas rutinas con el fin de poner los puntos de entrada en el nivel superior en el cuerpo de la función.
Al adaptar ALGLIB a MQL5 mantuvo el flujo de control de diezmar en su lugar, en realidad el envío de los fragmentos de código en rutinas separadas. Esta solución - como finalmente descubriste - no es mantenible; lo que ha hecho imposible seguir el ritmo de las actualizaciones de ALGLIB. ALGLIB, en sí mismo, se quedó un poco atrás también - sus rutinas RCOMM a veces dejan estructuras y variables huérfanas de versiones anteriores.
En ALGLIB++, la estructura de flujo de control se reintegra: los puntos de entrada saltan de nuevo a la mitad de un bucle u otra estructura de flujo de control donde lo dejaron.
No hay almacenamiento en caché de las variables locales del hilo; por el momento se han hecho estáticas (a costa de la seguridad del hilo - pero el multihilo no es formalmente una parte de ALGLIB GPL).
Al igual que ALGLIB, esto significa que hay un montón de sentencias goto para hacer todos los saltos hacia adelante y hacia atrás; pero están organizadas de forma más limpia.
Las reparaciones realizadas en ALGLIB++, por sí mismas, aceleran las rutinas en torno a un 20-25%, según los resultados de nuestras pruebas.
Hay dos maneras de tratar con esta arquitectura para deshacerse de las sentencias goto y manejar más adecuadamente las variables locales del hilo:
(1) Implementar la conmutación de hilos, lo que significa que las rutinas RCOMM envían mensajes de "evento" (que es lo que las banderas needf, ... algpowerup son en realidad), y la persona que llama tiene que configurar un manejador de eventos para recibir y procesar los mensajes. Sin embargo, no estoy seguro si MQL5 puede producir y manejar eventos definidos por el usuario.
(2) Utilice punteros de función para los eventos.
Ten en cuenta que las rutinas RCOMM pueden estar anidadas; y en algunos casos, pueden retransmitir eventos a su llamador obtenidos de las rutinas RCOMM que ellos mismos llaman.
Los desarrolladores de ALGLIB decidieron no usar punteros de función o multi-threading, cuando implementaron ALGLIB, porque cuando ALGLIB fue lanzado por primera vez no había soporte formal para programación multi-threaded en ningún lenguaje ampliamente distribuido y ampliamente usado, y no todos los lenguajes a los que ALGLIB estaba dirigido tenían el mismo o similar equivalente a los punteros de función de C y C++. Pero MQL5 tiene punteros de función. Si adaptas ALGLIB a MQL5, será mucho más fácil hacerlo desde ALGLIB++, en cambio, debido a la reintegración de las estructuras de flujo de control.
La solución ideal, sin embargo, es utilizar la conmutación de hilos. Con el tiempo, ya sea punteros de función o de conmutación de hilos se utilizarán en ALGLIB ++, no hemos decidido todavía qué camino tomar.
Querida Lydia:
Pero su archivo de biblioteca ALGLIB ++ en github todavía está en formato C ++ CPP. No se ha convertido a MQL5 mql. ¿proporcionaría archivo de biblioteca ALGLIB ++ como .mql? Gracias!
Estimados desarrolladores, por favor añadan un método para calcular el número conjugado de unnúmero complejo a la estructuracompleja ( fuente en SB <Math\Alglib\complex.mqh>).
Estimados desarrolladores, por favor añadan un método para calcular el número conjugado de unnúmero complejo a la estructuracompleja ( fuente en SB <Math\Alglib\complex.mqh>).
Mi versión:
Después de la próxima publicación de una nueva compilación, tienes que volver a larevisiónanterior. Lo cual es inconveniente.
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
¡Hermoso MQ! Un trabajo serio!
Un ejemplo de uso de la librería es enseñar a la red neuronal MLP la tabla de multiplicar.
:( Me da miedo pensar qué pasará con la nube cuando los usuarios empiecen a usar activamente la librería en sus expertos.
Este sencillo script pesa menos de un megabyte.
Lo mismo pero para RF:
cuenta no tan preciso, debería intentar retocarlo
PS
es más preciso, 500 antiguos y r=1, más ajuste y menos ruido.
Lo mismo para RF:
Considera que no es tan preciso, hay que intentar ajustarlo
PS
esta forma es más precisa, 500 árboles y r=1, más ajuste y menos ruido.
Foro sobre negociación, sistemas automatizados de negociación y ensayo de estrategias de negociación
Errores, fallos, preguntas
Andrey Khatimlianskii, 2019.01.30 04:57 AM
MQL5\Include\Math\AlgLib\dataanalysis.mqh - CLinReg::LRLine no funciona para 1M y más valores?¿Alguien lo sabe?
Gracias @Rashid Umarov
Recomiendo a todos que vayan a la web, porque este hilo lleva actualizado 3 años, pero la web se sigue actualizando.
Hemos hecho una revisión completa de la versión basada en C++ GPL de la biblioteca ALGLIB, liberándola como ALGLIB++. Esto rastrea la última versión de ALGLIB, que está en 3.16.0, a partir de 2019/12. Mucho se ha agregado en los módulos de Optimización e Interpolación desde las versiones anteriores con las que MQL5 está sincronizado (por ejemplo, splines de nube de puntos (!), más métodos de interpolación ponderada de distancia inversa, numerosos métodos de optimización adicionales, etc.).
ALGLIB++ es un derivado de ALGLIB que está siendo usado como una forma intermedia en un proceso de reingeniería/refactorización a largo plazo, en el cual será recodificado en C++ nativo (similar a donde estaba antes de la Versión 3), la capa extra y la duplicación siendo removida en preparación para proveer un soporte más directo para multi-threading, así como pruebas y módulos adicionales y eventualmente un lenguaje de scripting front end.
Las diferentes versiones lingüísticas de ALGLIB se generaron a partir de un núcleo común, con la versión C++ proporcionando soporte limitado (pero no oficial) para el dialecto C90 de C. Esta característica hizo necesario simular, dentro de C, características que de otro modo serían nativas de C++, y luego proporcionar una envoltura C++ sobre esto. En consecuencia, hay dos espacios de nombres separados: alglib_impl, que contiene la versión C, y alglib, que contiene las envolturas C++. ALGLIB++ ha conservado la mayor parte de esta estructura y de la codificación original en la medida de lo posible, pero ha reducido o eliminado gran parte de la infraestructura global como primer paso para su eliminación y sustitución por código C++ nativo multihilo y ha simplificado significativamente la interfaz de las envolturas C++. Como tal, representa una forma intermedia que sirve de puente entre ALGLIB, en sí misma, y la futura biblioteca en la que se está transformando ALGLIB++.
Muchos problemas que llevaron a un crecimiento de la complejidad en ALGLIB, desde (y antes de) las versiones adaptadas por MQL5, se han resuelto, con una simplificación resultante en la estructura y la reducción de la complejidad. En su forma actual, debería resultar más fácil de adaptar a MQL5, por aquellos que actualmente mantienen la versión MQL5 de ALGLIB.
Con la distribución se incluye una reformulación completa del manual de ALGLIB++ a partir del original de ALGLIB C++. Las secciones sobre los paquetes y subpaquetes, sin embargo, son compatibles con ambas versiones de ALGLIB, y tanto el diseño como el contenido deberían adaptarse fácilmente a la versión MQL5. MQL5 se menciona en la sección "Referencias y enlaces relacionados" del manual.
La última versión se puede encontrar en para su futura integración en ALGLIB++. Otras bibliotecas, incluida MKL (que, por cierto, tiene rutinas de redes neuronales), también se están estudiando para su futura integración.
Cuando se adaptó ALGLIB a MQL5, se encontró con dificultades con el "RCOMM" rutinas.
Cuando adaptaron ALGLIB a MQL5, se encontraron con dificultades con las rutinas "RCOMM".
Querida Lydia:
Pero su archivo de biblioteca ALGLIB ++ en github todavía está en formato C ++ CPP. No se ha convertido a MQL5 mql. ¿proporcionaría archivo de biblioteca ALGLIB ++ como .mql? Gracias!
Estimados desarrolladores, por favor añadan un método para calcular el número conjugado de unnúmero complejo a la estructura compleja ( fuente en SB <Math\Alglib\complex.mqh>).
Mi versión:
Después de la próxima publicación de una nueva compilación, tienes que volver a larevisión anterior. Lo cual es inconveniente.
Estimados desarrolladores, por favor añadan un método para calcular el número conjugado de unnúmero complejo a la estructura compleja ( fuente en SB <Math\Alglib\complex.mqh>).
Mi versión:
Después de la próxima publicación de una nueva compilación, tienes que volver a larevisión anterior. Lo cual es inconveniente.
Añadido