Discusión sobre el artículo "Aplicación de OpenCL para simular patrones de velas"

 

Artículo publicado Aplicación de OpenCL para simular patrones de velas:

En este artículo analizaremos el algoritmo de implementación de un simulador de patrones de velas en el lenguaje OpenCL en el modo "OHLC en M1". Asimismo, compararemos su rapidez con el simulador de estrategias incorporado en el modo de optimización rápida y lenta.

Para asegurarnos de que la implementación del simulador en OpenCL funciona correctamente, debemos apoyarnos en algo. Por eso, para comenzar, vamos a escribir un experto en MQL5, y después compararemos los resultados de su simulación y optimización con el simulador estándar con los resultados correspondientes del simulador implementado en OpenCL.

El objeto de la simulación será un experto sencillo que comercia según los siguientes patrones de velas (en los sucesivo denominados patrones).
  • Barra pin bajista
  • Barra pin alcista
  • Envolvente bajista
  • Envolvente alcista

La estrategia será sencilla:

  • Barra pin bajista o envolvente bajista — venta
  • Barra pin alcista o envolvente alcista — compra
  • Número de posiciones abiertas simultáneamente — no está limitado
  • Tiempo máximo de mantenimiento de una posición abierta  — limitado, el usuario lo establece
  • Los niveles de Take Profit y Stop Loss son fijos, el usuario los establece

La presencia de un patrón se comprueba con las barras completamente cerradas. En otras palabras, en el momento de aparición de una nueva barra, buscaremos el patrón en la tres anteriores.

Los niveles de detección de patrones son los siguientes:

Pinbar

Autor: Serhii Shevchuk

 

Autor, ¡Gracias por el artículo! Creo que has elegido esta TC en particular para la demostración por una razón, ya que es perfectamente paralela. Sin embargo, se trata de un nicho muy estrecho.

En el artículo te has alejado mucho de la universalidad para acercarte a la particularidad. Está claro que el objetivo es demostrar las posibilidades potenciales. Pero hay poco para aplicarlo a las propias necesidades.

Me gustaría ver ejemplos de traducción de diferentes códigos MQL a códigos OpenCL. Quizás esto esté contenido en los artículos enlazados al principio de tu artículo.

 
Los símbolos personalizados pueden ayudar a librarse de intercambios y comisiones al comparar los resultados de los probadores.
 
¿Falta el archivo OCLDefines.mqh sólo para mí? :-)
 
Denis Kirichenko:
¿Falta el archivo OCLDefines.mqh sólo para mí? :-)

Gracias por tu atención) Lo arreglaremos, pero entiendo que ya desde el lunes. Aquí está la fuente:

//+------------------------------------------------------------------+
//| define|
//+------------------------------------------------------------------+
//--- estableciendo un error de ejecución
#define  SET_ERR(c) do {m_last_error.function = __FUNCTION__; \
      m_last_error.line =__LINE__; \
      m_last_error.code=::GetLastError(); m_last_error.comment=c;} while(0)
//--- establecer un error de ejecución pasando el nombre de la función y el número de línea a través del parámetro
#define  SET_ERRx(c,f,l) do {m_last_error.function = f; m_last_error.line = l; \
      m_last_error.code=::GetLastError(); m_last_error.comment=c;} while(0)
//--- establecer un error de usuario
#define  SET_UERR(err,c) do {m_last_error.function = __FUNCTION__; \
      m_last_error.line =__LINE__; \
      m_last_error.code=ERR_USER_ERROR_FIRST+err; m_last_error.comment=c;} while(0)
//--- establecer un error de usuario pasando el nombre de la función y el número de línea a través del parámetro
#define  SET_UERRx(err,c,f,l) do {m_last_error.function = f; m_last_error.line = l; \
      m_last_error.code=ERR_USER_ERROR_FIRST+err; m_last_error.comment=c;} while(0)
//--- llamadas a funciones para trabajar con OpenCL
#define _BufferFromArray(buffer_index,data,data_array_offset,data_array_count,flags) \
      if(BufferFromArray(buffer_index,data,data_array_offset,data_array_count,flags,__FUNCTION__,__LINE__)==false) return false
#define _BufferCreate(buffer_index,size_in_bytes,flags) \
      if(BufferCreate(buffer_index,size_in_bytes,flags,__FUNCTION__,__LINE__)==false) return false
#define _BufferRead(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count) \
      if(BufferRead(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count,__FUNCTION__,__LINE__)==false) return false
#define _BufferWrite(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count) \
      if(BufferWrite(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count,__FUNCTION__,__LINE__)==false) return false
#define _Execute(kernel_index,work_dim,work_offset,work_size) \
      if(Execute(kernel_index,work_dim,work_offset,work_size,__FUNCTION__,__LINE__)==false) return false
#define _SetArgument(kernel_index,arg_index,value) \
      if(SetArgument(kernel_index,arg_index,value,__FUNCTION__,__LINE__)==false) return false
#define _SetArgumentBuffer(kernel_index,arg_index,buffer_index) \
      if(SetArgumentBuffer(kernel_index,arg_index,buffer_index,__FUNCTION__,__LINE__)==false) return false
#define _KernelCreate(k,src) \
      if(KernelCreate(k,src,__FUNCTION__,__LINE__)==false) break

//--- Errores de usuario 
#define  UERR_NONE                0     // No hay error
#define  UERR_NO_OCL              1     // El objeto COpenCL no existe
#define  UERR_GET_MEMORY_SIZE     2     // Error al obtener el tamaño de la memoria
#define  UERR_KERNEL_CREATE       3     // Error al crear un núcleo
#define  UERR_SET_BUF_COUNT       4     // Error al establecer el número de buffers
#define  UERR_DOUBLE_NOT_SUPP     5     // No compatible con double
#define  UERR_BUFFER_CREATE       6     // Error de creación de búfer
#define  UERR_BUFFER_FROM_ARRAY   7     // Error al crear buffer a partir de array
#define  UERR_BUFFER_READ         8     // Error de lectura del búfer
#define  UERR_BUFFER_WRITE        9     // Error de escritura en el búfer
#define  UERR_SET_ARGUMENT        10    // Error de configuración de argumentos
#define  UERR_SET_ARGUMENT_BUFFER 11    // Error al establecer buffer como argumento
#define  UERR_EXECUTE             12    // Error de ejecución del kernel
#define  UERR_NO_ENOUGH_MEM       13    // No hay memoria libre

//--- Errores de comprobación
#define  UERR_TESTER_ERROR_FIRST  256
#define  SET_UERRt(err,c)         SET_UERR(UERR_TESTER_ERROR_FIRST+err,c)
//+------------------------------------------------------------------+
 
fxsaber:
Los símbolos personalizados pueden ayudar a librarse de los intercambios y las comisiones al comparar los resultados de los probadores.

Sí, pero eso está aún más lejos del mundo real. A menos que sea para depurar.

 
El artículo es realmente impresionante. Es una pena que sea así cuando no se quiere comparar la cantidad de gasto mental y el rendimiento útil.
 

Enhorabuena, ¡ha escrito un gran artículo!

El código del artículo será citado y has puesto el listón muy alto para tus colegas que vayan a escribir artículos sobre computación paralela en el comercio.

 
fxsaber:

En el artículo, te has alejado mucho de lo universal para acercarte a lo particular.

Eso es sólo el principio. La universalidad está por delante. El mensaje oculto del artículo es que no todo es tan sencillo. No basta con convertir código serie en código paralelo. Hay que escribir en paralelo desde el principio.

Si la comunidad está interesada, publicaré mis desarrollos posteriores en esta dirección.

 
Serhii Shevchuk:

Esto es sólo el principio. La versatilidad está por llegar. El mensaje oculto del artículo es que no todo es tan sencillo. No basta con convertir código serie en código paralelo. Hay que escribir código paralelo desde el principio.

Si la comunidad está interesada, publicaré mis futuros desarrollos en este sentido.

la comunidad está muy interesada, "Afftar fishi ischo!!!1111".

un tema muy importante en términos de acelerar la optimización/pruebas, especialmente para algoritmos de aprendizaje automático

 

¡Artículo muy útil!

Por supuesto, me gustaría ver más ejemplos sencillos de traducción de código MQL ordinario en código OpenCL, en forma de funciones listas con comentarios para dummies.

Y otra pregunta, ¿cuánto tiempo se tarda en transferir / preparar los datos para una tarjeta de vídeo, he oído una opinión que OpenCL para una tarjeta de vídeo no tiene sentido utilizar para el comercio real debido a la pérdida de tiempo en la transferencia de datos para el procesamiento, ¿es realmente así?