Discusión sobre el artículo "Aplicación de OpenCL para simular patrones de velas" - página 3

 

Un artículo muy interesante. La principal ventaja es ver un ejemplo real de código OpenCL en acción, es muy útil cuando empiezas a usar OpenCL por ti mismo tener este tipo de ejemplos. Gracias.

Sin embargo, aunque la comparación confirma la enorme ganancia esperada utilizando GPUs, se trata de una estrategia muy específica, en la que no existe relación alguna entre las operaciones. Probablemente es raro ver tal estrategia en el comercio real. Me temo que cuando se empiece a introducir relación entre las operaciones (un máximo de operaciones abiertas, sólo 1 operación a la vez, aumento o disminución del lote después de un ganador / perdedor, etc ...), la complejidad del código OpenCL conducirá rápidamente a perder los beneficios de ganancia de velocidad. (No lo he probado yo mismo así que podría estar equivocado).

Menos importante, para una comparación adecuada, el algoritmo "virtual" usado con GPUs, debería ser usado también sin ella, permitiría medir la ganancia neta debida a las GPUs. Como en el enfoque del artículo, usted no sólo está comparando CPU a GPU (seriel a paralelo), sino también el"Probador de Estrategias" a "virtual".

 
Hola
¿sigue existiendo OpenCL, porque se dice que AMD ya no lo soporta?

¿Hay alguna solución, se necesita Linux o hay algún otro método de programación de GPU para computación paralela que sea de fácil acceso?

Saludos
 

Buenas tardes.

Me puedes decir una forma aproximada de como conseguir en tu código la apertura de una sola operación a la vez para comprar y también una sola para vender.

 
Sergey Seriy:

Buenas tardes.

Me puedes decir una forma aproximada de como conseguir en tu código la apertura de una sola operación a la vez para comprar y también una sola para vender.

En primer lugar, en el kernel tester_step necesitas añadir un argumento más que te permita obtener el tiempo de cierre de la operación (puede ser el índice de la barra M1, donde se cerró la operación, o el tiempo de mantenimiento de la posición, expresado en número de barras M1) con indexación, como en el buffer de resultados __global double *Res.

A continuación, dependiendo de si su pregunta se refiere a la prueba única o la optimización:

1. pruebas. En el bucle en el que se resume el beneficio total, es necesario añadir condiciones que excluyan el solapamiento de posiciones abiertas utilizando las horas de cierre (que serán devueltas por el tester_step finalizado).

2. optimización. Aquí, en lugar del núcleo find_patterns_opt, que resume los beneficios, necesitamos utilizar find_patterns, que simplemente devolverá puntos de entrada. Teniendo en cuenta las condiciones de inadmisibilidad de abrir más de una operación a la vez, tendremos que resumir el beneficio en el código mql5. Sin embargo, puede llevar algún tiempo (debería probarlo), porque en este caso lo que se ejecutó en paralelo se ejecutará secuencialmente (el número de pasadas de optimización se multiplica por la profundidad de la optimización). Otra posible opción de compromiso es añadir un kernel que cuente los beneficios de una pasada (teniendo en cuenta la condición sobre el número de posiciones abiertas simultáneamente), pero por mi propia práctica puedo decir que es una mala idea ejecutar kernels "pesados". Idealmente, uno debería esforzarse por mantener el código del kernel lo más simple posible y ejecutar tantos de ellos como sea posible.

 
Serhii Shevchuk:

En primer lugar, en el núcleo tester_step necesitamos añadir un argumento más que nos permita obtener el tiempo de cierre de una operación (puede ser el índice de la barra M1, donde se cerró la operación, o el tiempo de mantenimiento de una posición expresado en el número de barras de M1) con indexación, como en el buffer de resultados __global double *Res.

Además, dependiendo de si su pregunta se refiere a la prueba única o la optimización:

1. pruebas. En el bucle en el que se resume el beneficio total, debe añadir condiciones que excluyan el solapamiento de posiciones abiertas mediante las horas de cierre (que devolverá el paso_prueba finalizado).

2. optimización. Aquí, en lugar del núcleo find_patterns_opt, que resume los beneficios, necesitamos utilizar find_patterns, que simplemente devolverá puntos de entrada. Teniendo en cuenta las condiciones de inadmisibilidad de abrir más de una operación a la vez, tendremos que resumir el beneficio en el código mql5. Sin embargo, puede llevar algún tiempo (debería probarlo), porque en este caso lo que se ejecutó en paralelo se ejecutará secuencialmente (el número de pasadas de optimización se multiplica por la profundidad de la optimización). Otra posible opción de compromiso es añadir un kernel que cuente los beneficios de una pasada (teniendo en cuenta la condición sobre el número de posiciones abiertas simultáneamente), pero por mi propia práctica puedo decir que es una mala idea ejecutar kernels "pesados". Idealmente, uno debería esforzarse por mantener el código del kernel lo más simple posible y ejecutar tantos de ellos como sea posible.

Buenas tardes.

Gracias por su rápida respuesta. Me interesaba ante todo la respuesta sobre la optimización, como la idea de aplicar el código en la práctica, por cierto pensaba que en parte tendré que escribir en código mql. ¡Muchas gracias por el artículo, ya que no hay nada igual! También si modificamos tester_step (y tester_step_opt) un poco añadiendo a la condición de tiempo p>open to buy (ie. if(j>=maxbar || (TimeM1[j]>=tclose && p>open)) y para vender if(j>=maxbar || (TimeM1[j]>=tclose && p<open))), obtendremos una estrategia para operar con opciones.

 

...También añadiré unas palabras a mi comentario anterior sobre la estrategia de opciones. Aquí tenemos que añadir la variable Option Expiration Time (al mismo tiempo StopLoss y TakeProfit no son necesarios para las opciones durante la optimización), por lo que modificar el código en tester_opt_step de la siguiente manera:

ulong tcloseDEATH=TimeM1[iO]+240*60*60;//añadir variable de tiempo de expiración, например 240 часов (т.е. 10 дней)



//...más comentarios TP y SL ya que no son necesarios para las opciones

/*if(p<=sl)
 {
 Res[idx]=sl-open;
 return;
 }
 else if(p>=tp)
 {
 Res[idx]=tp-open;
 return;
 }*/
// y añadir una comprobación para el tiempo de caducidad (al vencimiento de la VE debe haber una gran PÉRDIDA porque la opción no tiene éxito).
              if(TimeM1[j]>=tcloseDEATH)
              {
               Res[idx]=sl*10-open; //¡Hay un GRAN alce! (для примера в 10 раз больше установленного при оптимизации стоп-лосса)
               return;
              }

 
Buenas tardes. Al ejecutar OpenCL-optimización para USDRUB de acuerdo con su artículo me encontré con un problema - los resultados de la optimización son siempre positivos, siempre un beneficio, es decir, parece que hay un desbordamiento de una variable de tipo int, en el que se genera el resultado, mientras que para EURUSD la optimización funciona correctamente. Tal vez se trate también de una cuestión de cinco dígitos para USDRUB. ¿Puede decirme cómo solucionar este problema?
 
Sergey Seriy:
Buenas tardes. Al ejecutar OpenCL-optimización para USDRUB de acuerdo con su artículo me encontré con un problema - los resultados de la optimización son siempre positivos, siempre un beneficio, es decir, parece que hay un desbordamiento de una variable de tipo int, en el que se genera el resultado, mientras que para EURUSD la optimización funciona correctamente. Tal vez se trate también de una cuestión de cinco dígitos para USDRUB. ¿Podría decirme cómo solucionar este problema?
...adjunto también capturas de pantalla
Archivos adjuntos:
 

En el artículo escribes:

В нашем случае функция atomic_inc()  для начала запрещает доступ другим задачам к ячейке Count[0], затем увеличивает её значение на единицу, а предыдущее возвращает в виде результата.

Según tengo entendido, esta función sólo funciona con un array de tipo int, pero si tengo un array de otro tipo, por ejemplo ushort, ¿qué debo hacer?