Discusión sobre el artículo "Reimaginando las estrategias clásicas en MQL5 (Parte XI): Cruce de medias móviles (II)"

 

Artículo publicado Reimaginando las estrategias clásicas en MQL5 (Parte XI): Cruce de medias móviles (II):

Las medias móviles y el oscilador estocástico podrían utilizarse para generar señales de trading que sigan la tendencia. Sin embargo, estas señales solo se observarán después de que se haya producido la acción del precio. Podemos superar eficazmente este retraso inherente a los indicadores técnicos utilizando la inteligencia artificial. Este artículo le enseñará cómo crear un asesor experto totalmente autónomo impulsado por IA de una manera que pueda mejorar cualquiera de sus estrategias de trading existentes. Incluso la estrategia comercial más antigua posible se puede mejorar.

Anteriormente hemos tratado el tema de la previsión de cruces de medias móviles. El artículo se encuentra disponible en el siguiente enlace: aquí. Observamos que los cruces de medias móviles son más fáciles de pronosticar que los cambios de precios directamente. Hoy volveremos a abordar este problema tan conocido, pero con un enfoque totalmente diferente.
 
Ahora queremos investigar en profundidad qué diferencia supone esto para nuestras aplicaciones comerciales y cómo este hecho puede mejorar sus estrategias comerciales. Los cruces de medias móviles son una de las estrategias comerciales más antiguas que existen. Es un desafío construir una estrategia rentable utilizando una técnica tan ampliamente conocida. Sin embargo, espero demostrarles en este artículo que los perros viejos sí pueden aprender trucos nuevos.

Para ser empíricos en nuestras comparaciones, primero construiremos una estrategia comercial en MQL5 para el par EURGBP utilizando solo los siguientes indicadores:

  1. 2 medias móviles exponenciales aplicadas al precio de cierre. Uno con un período de 20 y el otro establecido en 60.
  2. El oscilador estocástico con los ajustes predeterminados de 5,3,3 aplicados, configurado en el modo de media móvil exponencial y configurado para realizar sus cálculos en el modo CLOSE_CLOSE.
  3. El indicador Average True Range (ATR) con un período de 14 para establecer nuestros niveles de take-profit y stop-loss.

Nuestra estrategia estará orientada a operar en el marco temporal diario. Realizaremos una prueba retrospectiva de esta estrategia desde el 1 de enero de 2022 hasta principios de junio de 2024. Nuestra estrategia utilizará inicialmente las reglas clásicas de negociación. Por lo tanto, se generarán señales de compra cada vez que la media móvil rápida cruce por encima de la media móvil lenta y la lectura estocástica esté por encima de 80. Y lo contrario es válido para nuestras señales de venta. Registraremos una señal de venta cuando la media móvil rápida se encuentre por debajo de la lenta y el oscilador estocástico esté por debajo de 20.

Autor: Gamuchirai Zororo Ndawana

 

Gracias Gamu . Me gustan tus publicaciones y trato de aprender reproduciendo tus pasos.

Estoy teniendo algunos problemas espero que esto puede ayudar a otros.

1) mis pruebas con usted EURGBP_Stochastic diario utilizando el script suministrado sólo produce 2 órdenes y, posteriormente, la relación de Sharpe de 0,02 . Creo que tengo la misma configuración que usted, pero en 2 corredores que produce sólo 2 órdenes.

2) como un aviso para los demás puede que tenga que modificar la configuración del símbolo para que coincida con su corredor (por ejemplo, EURGBP a EURGBP.i) si es necesario

3) Cuando intento exportar los datos obtengo un array fuera de rango para el ATR, creo que esto se debe a que no consigo 100000 registros en mi Array (si lo cambio a 677) puedo obtener un archivo con 677 filas. Para mi el valor por defecto para max barras en un gráfico es 50000, si lo cambio a 100000 el tamaño de mi array es solo 677, pero posiblemente tengo una mala configuración. Tal vez usted también podría incluir la secuencia de comandos de extracción de datos en su descarga .

4)He copiado el código de su artículo para probarlo en Python. Obtengo un error look_ahead not defined ----> 3 data.loc[data["Close"].shift(-look_ahead) > data["Close"], "Binary Target"] = 1

4 data = data.iloc[:-look_ahead,:]


NameError: el nombre 'look_ahead' no está definido

5) cuando cargué su cuaderno de Juypiter lo encuentro necesitado tener mirada adelante fijada #Preveamos 20 pasos en el futuro

look_ahead = 20 , Después de esto he utilizado su archivo incluido sólo pero estoy atascado en el siguiente error , posiblemente relacionados con sólo tener 677 filas .

Ejecuto #Escala los datos antes de empezar a visualizarlos

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

que me da un error que no entiendo cómo resolver

ipython-input-6-b2a044d397d0>:4: SettingWithCopyWarning: Se está intentando establecer un valor en una copia de un slice de un DataFrame. Intente utilizar .loc[row_indexer,col_indexer] = value en su lugar Consulte las advertencias en la documentación: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

 
linfo2 #:

Gracias Gamu . Disfruto con tus publicaciones e intento aprender reproduciendo tus pasos.

Estoy teniendo algunos problemas espero que esto puede ayudar a otros.

1) mis pruebas con usted EURGBP_Stochastic diario utilizando el script suministrado sólo produce 2 órdenes y, posteriormente, la relación de Sharpe de 0,02 . Creo que tengo la misma configuración que usted, pero en 2 corredores que produce sólo 2 órdenes.

2) como un aviso para los demás puede que tenga que modificar la configuración del símbolo para que coincida con su corredor (por ejemplo, EURGBP a EURGBP.i) si es necesario

3) Cuando intento exportar los datos obtengo un array fuera de rango para el ATR, creo que esto se debe a que no consigo 100000 registros en mi Array (si lo cambio a 677) puedo obtener un archivo con 677 filas. Para mi el valor por defecto para max barras en un grafico es 50000, si lo cambio a 100000 el tamaño de mi array es solo 677, pero posiblemente tengo una mala configuracion. Tal vez usted también podría incluir la secuencia de comandos de extracción de datos en su descarga .

4)He copiado el código de su artículo para probarlo en Python. Obtengo un error look_ahead not defined ----> 3 data.loc[data["Close"].shift(-look_ahead) > data["Close"], "Binary Target"] = 1

4 data = data.iloc[:-look_ahead,:]


NameError: el nombre 'look_ahead' no está definido

5) cuando cargué su cuaderno de Juypiter encuentro que necesitó tener mirada adelante fijada #Preveamos 20 pasos en el futuro

look_ahead = 20 , Después de esto he utilizado su archivo incluido sólo pero estoy atascado en el siguiente error , posiblemente relacionados con sólo tener 677 filas .

Ejecuto #Escala los datos antes de empezar a visualizarlos

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()

data[['Abierto', 'Alto', 'Bajo', 'Cierre', 'MA Rápido', 'MA Lento','Estoc Principal']] = scaler.fit_transform(data[['Abierto', 'Alto', 'Bajo', 'Cierre', 'MA Rápido', 'MA Lento','Estoc Principal']])

lo que me da un error que no entiendo como resolver

ipython-input-6-b2a044d397d0>:4: SettingWithCopyWarning: Se está intentando establecer un valor en una copia de un slice de un DataFrame. Intente utilizar .loc[row_indexer,col_indexer] = value en su lugar Consulte las advertencias en la documentación: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

Que tal Neil, confío en que estés bien.

Déjame ver cómo puedo ayudarte:

1) Este error es bastante raro, así es como yo lo enfocaría:

Nuestro sistema sólo abre operaciones si ambos modelos de IA dan el mismo pronóstico. Entrene los modelos y evalúe sus coeficientes, esto le dirá cuándo cada uno generará una señal, y cuál será la señal. A continuación, supervise cuidadosamente la prueba retrospectiva para ver si las condiciones en las que se encuentra el modelo, explican el número de operaciones.

2) Este es un problema constante, y es difícil de controlar porque cada corredor tiene su propia convención de nomenclatura, pero la solución que ha proporcionado es válida.

3) Esto puede indicar que su broker sólo tiene 677 barras de datos Diarios que puede utilizar, excluyendo los cálculos de periodos. Es normal, yo también lo experimento. A veces intento recuperar sólo 1 año de datos diarios pero sólo recupero 200 y pico barras.

4) Trate de definir la mirada hacia adelante justo por encima de la declaración causando problemas, y luego actualizarlo en todo el código si es necesario.

5) Esto puede ser un problema ya sea de nosotros utilizando diferentes versiones de la biblioteca, versiones de Python, etc. Creo que el ajuste debe hacerse antes de la asignación. Así que la línea

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] =

Puede ser necesario ajustar a:

data.loc[:,['Open','High',...,'Stoch Main']] =
 
Gamuchirai Zororo Ndawana #:
Qué pasa Neil, confío en que estés bien.

Déjame ver cómo puedo ayudar:

1) Este error es bastante extraño, así es como yo lo abordaría:

Nuestro sistema sólo abre operaciones si ambos modelos de IA dan el mismo pronóstico. Entrene los modelos y evalúe sus coeficientes, esto le dirá cuándo cada uno generará una señal, y cuál será la señal. A continuación, supervise cuidadosamente la prueba retrospectiva para ver si las condiciones en las que se encuentra el modelo, explican el número de operaciones.

2) Este es un problema constante, y es difícil de controlar porque cada corredor tiene su propia convención de nomenclatura, pero la solución que ha proporcionado es válida.

3) Esto puede indicar que su broker sólo tiene 677 barras de datos Diarios que puede utilizar, excluyendo los cálculos de periodos. Es normal, yo también lo experimento. A veces intento obtener sólo 1 año de datos diarios pero sólo obtengo 200 y pico barras.

4) Trate de definir la mirada hacia adelante justo por encima de la declaración causando problemas, y luego actualizarlo en todo el código si es necesario.

5) Esto puede deberse a que estamos usando diferentes versiones de librerías, versiones de Python, etc. Creo que el ajuste debe hacerse antes de la asignación. Así que la línea:

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] =

Puede ser necesario ajustar a:

data.loc[:,['Open','High',...,'Stoch Main']] =

Gracias Gamu Aprecio que , Sí, sé que hay muchas partes móviles , Voy a ver si esto va a resolver mis problemas

 
linfo2 #:

Gracias Gamu Aprecio que, Sí, sé que hay muchas partes móviles, voy a ver si esto va a resolver mis problemas

Hombre ¿verdad? Así que muchos, y esto sólo una simple aplicación