Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 2333

 


....

 

Fácil, buen artículo sobre las posibilidades de la programación genética

https://blog.ephorie.de/symbolic-regression-genetic-programming-or-if-kepler-had-r

 

Encontré (para mí) una manera genial de probar mis scripts mql en python, así como acelerar significativamente algunas funciones en él, usando dll.

Aquí está la función inicial en mql5, que quiero poner en python. Simplemente busca los mínimos y máximos de un precio utilizando su patrón suavizado.

void get_loc_extremum(double &x[],double &x2[],double &loc_max[],double &loc_min[],bool real_price)
  {
   int N = ArraySize(x);
   for(int i=1; i<N-1; i++)
     {
      if(x[i-1]<x[i]&& x[i]>x[i+1])
        {
         ArrayResize(loc_max,ArraySize(loc_max)+1);
         if(real_price)
            loc_max[ArraySize(loc_max)-1]=x2[i];
         else
            loc_max[ArraySize(loc_max)-1]=x[i];
        }

      if(x[i-1]>x[i]&& x[i]<x[i+1])
        {

         ArrayResize(loc_min,ArraySize(loc_min)+1);
         if(real_price)
            loc_min[ArraySize(loc_min)-1]=x2[i];
         else
            loc_min[ArraySize(loc_min)-1]=x[i];
        }

     }

Esto se hace en varios pasos

1. En algún lugar, en visual studio o en codeblock compila tu dll. En el archivo .cpp escribimos nuestra función, en el archivo .h la declaramos. Un ejemplo que me ha funcionado en el adjunto del post. En la carpeta del proyecto codeblox, archivo main.cpp, archivo main .h, en la carpeta \bin\Debug archivo my_lib.dll. En resumen, aquí está la cabecera de la función en c++:

void DLL_EXPORT GetLocalMaxMin(double* x_sm[],double* x_rl[], double* loc_max[], double* loc_min[], int N, bool real_price)
{
...
}

2 En python haz lo siguiente:

from ctypes import *

my_dll = cdll.LoadLibrary("my_dll/my_lib.dll") 					#загружаем  свою DLL
my_dll.GetLocalMaxMin.argtypes = [POINTER(c_double), 
        POINTER(c_double), POINTER(c_double), POINTER(c_double), c_int, c_bool] #определяем  типы входных аргументов функции через атрибуты ctypes
my_dll.GetLocalMaxMin.restype = None                                            #определяем  типы выходных данных 

...
#  y - список цен
#  y_sm - список сглаженных цен
#  len(y)=len(y_sm) - длина списков одинаковая

x_sm = (c_double * len(y))(*y_sm)    				  #создаем  указатель на массив x_sm размером len(y_sm) предаем туда указатель на массив y_sm
x_rl = (c_double * len(y))(*y)       			       	  #создаем  указатель на массив x_rl размером len(y) предаем туда указатель на массив y
loc_max = (c_double * len(y))()      				  #создаем  указатель на массив loc_max размером len(y) заполный 0.0 
loc_min = (c_double * len(y))()     				  #создаем  указатель на массив loc_min размером len(y) заполный 0.0 
my_dll.GetLocalMaxMin(x_sm, x_rl, loc_max, loc_min, len(y), True) #вызываем  функцию и передаем туда все что насоздавали

print(list(loc_max),list(loc_min)) #смотрим  что получилось

Esta no es la verdad definitiva, si tiene alguna adición, u otras opciones, escriba.

Archivos adjuntos:
my_lib.zip  36 kb
 
welimorn:

Encontré (para mí) una manera genial de probar mis scripts mql en python, así como acelerar significativamente algunas funciones en él, usando dll.

Aquí está la función inicial en mql5, que quiero poner en python. Simplemente busca los mínimos y máximos de un precio utilizando su patrón suavizado.

Esto se hace en varios pasos

1. En algún lugar, en visual studio o en codeblock compila tu dll. En el archivo .cpp escribimos nuestra función, en el archivo .h la declaramos. Un ejemplo que me ha funcionado en el adjunto del post. En la carpeta del proyecto codeblox, archivo main.cpp, archivo main .h, en la carpeta \bin\Debug archivo my_lib.dll. En resumen, aquí está la cabecera de la función en c++:

2 En python haz lo siguiente:

Esta no es la verdad final, cualquier adición, u otras opciones, escribir.

¿Qué quiere conseguir?
Si la velocidad, entonces no utilice
ArrayResize(loc_max,ArraySize(loc_max)+1);

dentro del bucle, y una vez antes de llamar a la función, establezca el tamaño que desea, como lo hizo en C++ y python, o resérvelo con el tercer parámetro

ArrayResize(loc_max,ArraySize(loc_max)+1, max_size);

Ahora cada llamada a ArrayResize, crea un nuevo bloque en memoria, copia el anterior en él y borra el anterior. Esto es muy, muy lento.

И

ArraySize(loc_max)

no tienes que hacerlo cada vez, puedes almacenarlo en una variable.


Pruébalo, quizás no tengas que traducir una simple función a 3 lenguajes de programación diferentes. Los desarrolladores dicen que MQL es comparable a C++ en velocidad e incluso más rápido en algunas cosas.

¿Por qué necesitas Python si puedes llamar a la DLL directamente desde MQL?

¿O tiene algún otro propósito?
 
elibrarius:
¿Qué quieres conseguir?
Si la velocidad, no utilice

dentro del bucle, y 1 vez antes de llamar a la función, establezca el tamaño que desea, como lo hizo en C++ y Python, o resérvelo con el 3er parámetro

Ahora cada llamada a ArrayResize, crea un nuevo bloque en la memoria, copia el antiguo bloque en él y borra el antiguo. Esto es muy, muy lento.

И

no tienes que hacerlo cada vez, puedes almacenarlo en una variable.


Pruébalo, quizás no tengas que traducir una simple función a 3 lenguajes de programación diferentes. Los desarrolladores dicen que MQL es comparable en velocidad a C++, y más rápido en algunas cosas.

¿Por qué necesitas Python si puedes llamar a la DLL directamente desde MQL?

¿O tiene algún otro propósito?

La función de búsqueda de extremos en el mensaje se proporciona simplemente como un ejemplo para mostrar el principio en el que se basa.

El propósito es que es conveniente buscar las dependencias de las características y el objetivo en Python y elegir los modelos, mientras que MQL tiene un buen probador que, si no se engaña, le dará una estimación clara de sus resultados.

Me siento cómodo trabajando con Python, pero estoy aprendiendo y no puedo escribir ninguna función en mql5 con bucles en Python usando cálculos vectoriales. Escribir código sin ellos es una pérdida de tiempo ya que python es muy lento. Algunas funciones pueden ser llamadas en cada barra y eso hace que sea muy difícil de encontrar. He utilizado algib en todas partes ya que tienen soluciones tanto para python como para mql5. Pero cuando se trata de mi loca imaginación, tengo algunos problemas.

El código para mql5 se puede convertir fácilmente a c++ y compilar en dll. Como resultado, utilizo una misma función en el probador y en el script de python.

 
welimorn:

La función de búsqueda de extremos en el mensaje se da simplemente como un ejemplo para mostrar el principio en él.

El propósito es que Python es útil para buscar dependencias de características y objetivo y ajustar modelos, mientras que MQL tiene un buen probador que, si no se engaña, permite obtener una estimación clara de sus resultados.


Así pues, has encontrado las dependencias en Python, has elegido, entrenado y probado el modelo. ¿Y cómo se prueba en un probador? Python no es amigable con el probador o MKL5.

 
Si el tiempo medio de mantenimiento de la posición de una ST es de 10 minutos. ¿Y la posición actual ha estado rondando durante 10 horas, entonces su resultado es un quid pro quo (completamente no sistemático)?
 
fxsaber:
Si el tiempo medio de mantenimiento de la posición de la ST es de 10 minutos. ¿Y la posición actual ha estado colgada durante 10 horas, entonces su resultado es un gambito (completamente no sistémico)?

Depende de cómo esté escrita la lógica/reglas de la ST. El "quizás" es un resultado probabilístico, no determinado por la lógica del TC. Si la lógica funcionó definitivamente durante las 10 horas, entonces es un caso raro.

 
Valeriy Yastremskiy:

Si las 10 horas de lógica funcionaron definitivamente, es un caso raro.

Que la lógica haya funcionado no hace que el resultado sea sistémico.

 
fxsaber:

El hecho de que la lógica haya funcionado no hace que el resultado sea sistemático.

La pregunta no especifica a qué aplicar el quid pro quo y la sistematicidad. Si a la CT, entonces depende de la CT, si a las condiciones externas, entonces los casos raros son inherentemente no sistémicos. Y puede haber excepciones a la regla. Eurodólar 14 de mayo a marzo '15. No es un caso sistémico.

Razón de la queja: