Siempre he soñado con tener un robot que se optimizara solo, así sabría que siempre estaría operando con los mejores valores. Esta es mi humilde contribución para hacer parte de ese sueño realidad. El asesor experto adjunto optimiza los niveles de sobrecompra y sobreventa que utiliza para realizar operaciones. Espero que otros puedan tomar este concepto y expandirlo para crear algo aún mejor. Si lo logras, ¡me encantaría que me lo contaras! Y no olvides calificar mi robot con las estrellas de arriba. Esta estrategia es aplicable a cualquier par de divisas y en cualquier marco temporal, siempre y cuando uses los ajustes correctos.
He incluido varios parámetros en este robot. También he añadido algunas características extra con las que me gusta experimentar. ¡Disfruta!
Parámetros del Robot
- magic = 4376 - Número único para este EA.
- optimizingPeriods = 144 - Períodos de optimización (barras). Este es el número de barras que deseas que utilice el robot para la optimización. Por ejemplo, si utilizas un gráfico horario y eliges 144, el robot mirará hacia atrás 144 horas, lo que equivale a seis días.
- inAggressive = false - ¿Hacer que el experto sea agresivo? Riesgoso. El modo agresivo hará que el asesor tome operaciones de manera más arriesgada. En lugar de esperar un cruce de los niveles de sobrecompra o sobreventa, en modo agresivo el robot abrirá una orden de compra si las compras han sido más rentables que las ventas, y viceversa.
- inTradeReverse = false - Trading inverso. Esta opción cambiará la dirección de tus operaciones.
- inOneOrderAtATime = true - ¿Solo una orden abierta a la vez? Si es verdadero, el robot solo tendrá una orden abierta a la vez; si es falso, abrirá una cantidad ilimitada de órdenes según las condiciones de entrada.
- Lot_sizing_dynamic_invalidates_static - Simplemente un separador para distinguir la mecánica de tamaño de lote de los demás parámetros.
- Lots = 0.01 - Tamaño estático del lote para las órdenes. Especifica el tamaño del lote para tus órdenes usando un número estático.
- inUseDynamicLotSize = true - Usar tamaño de lote dinámico. Activa el tamaño de lote dinámico que se usará en lugar del tamaño de lote estático. Sin embargo, si el tamaño de lote dinámico resulta ser inválido, el robot volverá al tamaño de lote estático.
- inPercentageOfRisk = 2 - Porcentaje del saldo a arriesgar en cada operación (2 = 2%). Al usar tamaño de lote dinámico, especificas tu tamaño de lote como un porcentaje de tu saldo. 2 equivale al 2%. No es necesario ingresar 0.02, porque de hacerlo, el porcentaje usado sería muy pequeño. El porcentaje máximo que se puede usar es del 10%.
- Index_Indicator_Values - Simplemente un separador para distinguir los parámetros del índice del indicador de otros inputs.
- indicator index = _RSI_ - Elige qué índice utilizar. Te permite escoger entre el Índice de Fuerza Relativa (RSI) o el Índice de Flujo de Dinero (MFI).
- IndicatorTopValue = 100 - Valor máximo para operar. Este es el valor superior en el que realizarás una operación con tu indicador. Déjalo en 100 para considerar todos los valores del indicador.
- IndicatorBottomValue = 0 - Valor mínimo para operar. Este es el valor inferior en el que realizarás una operación con tu indicador. Déjalo en 0 para considerar todos los valores del indicador.
- IndyTimeframe = PERIOD_CURRENT - Marco temporal para el índice. Selecciona el marco temporal que deseas utilizar para el indicador durante la optimización y el trading. PERIOD_CURRENT significa que usará el marco temporal del gráfico al que adjuntes el asesor experto. Teóricamente, podrías usar un marco temporal diferente para tus cálculos si así lo deseas; aquí es donde cambiarías esa configuración.
- inIndyPeriods = 14 - Período de promediado para el índice y cálculos del ATR. El Average True Range (ATR) se utiliza para establecer un stop-loss dinámico o un take-profit en los siguientes parámetros.
- IndyAppPrice = PRICE_CLOSE - Precio aplicado para el índice si es necesario.
- SL_TP_Dynamic_invalidates_static_values - Simplemente un separador para distinguir los parámetros de stop loss y take profit de otros inputs.
- iStoploss = 1000 - Valor estático de Stoploss en puntos. Los valores de stop loss están en puntos, que es la unidad más pequeña de movimiento en tu terminal.
- iTakeprofit = 2000 - Valor estático de Takeprofit en puntos. Los valores de take profit están en puntos, que es la unidad más pequeña de movimiento en tu terminal.
- input inDynamic = true - ¿Usar stop loss y take profit dinámicos basados en múltiplos de ATR? Si activas los stop loss y take profit dinámicos, se utilizarán en lugar de los valores estáticos. Las configuraciones dinámicas pueden ser atractivas porque tienen la capacidad de ajustarse según el comportamiento del mercado. Dado que el ATR es mayor cuando hay más movimiento, usar dinámico resultará en stop loss y take profit más amplios cuando el mercado se mueve rápido y configuraciones más cercanas cuando el mercado se ha desacelerado.
- inStoplossMultiple = 2 - SL dinámico = X * ATR (Período de promediado). El stop loss será el valor que ingreses aquí multiplicado por el Average True Range (ATR) usando los períodos especificados en el inIndyPeriods.
- inTakeProfitMultiple = 7 - TP dinámico = X * ATR (Período de promediado). El take profit será el valor que ingreses aquí multiplicado por el Average True Range (ATR) usando los períodos especificados en el inIndyPeriods.
- Break_Even_Settings - El padding debe ser menor que el trigger. Un separador para las configuraciones de break even. Funciona así: cuando los puntos en beneficios superan la cantidad de activación, el stop loss se mueve a break even. Si tienes un ajuste de padding, el stop loss se mueve a break even + padding para asegurar la cantidad de beneficio del padding.
- bUseBreakEven = true - Usar Break Even (BE). Activa o desactiva el uso de break even.
- inTrigger = 200 - Si BE = [true], establecer puntos en beneficio para activar. Si la operación llega a esta cantidad de puntos en beneficio, el stop loss se moverá a break even.
- inPadding = 100 - Puntos de padding para añadir a BE; debe ser menor que el trigger. Este es el número de puntos de beneficio que deseas asegurar al mover a break even; esta cantidad debe ser menor que el trigger.
¿Cómo se autooptimiza este robot? Aquí está el secreto: el robot prueba cada variable en el índice indicador dos veces, así que si un indicador tiene cien valores posibles, toma cada valor y trata de realizar una operación en ese valor, retrocediendo un cierto número de barras (optimizingPeriods). Luego califica ese valor según cuánto dinero habría ganado o perdido al operar en ese valor. Es un poco más complejo que eso, pero estás leyendo esto para obtener más detalles, así que aquí están:
Los parámetros son que cuando un indicador cruza el valor de sobrecompra desde arriba, se emite una orden de venta; se emite una orden de compra cuando un indicador cruza de un valor de sobreventa desde abajo a uno por encima del valor de sobreventa. Por ejemplo, si la sobrecompra se establece en 80 y el valor de tu indicador fue 85 en la barra anterior y el valor del indicador en la última barra fue 79, se emitiría una orden de venta. 85 → 79 cruza 80 hacia abajo, se emite la orden de venta. Si la sobreventa = 23, entonces 19 → 27 hacia arriba generaría una orden de compra.
Así que, este robot toma cada valor para el indicador desde el IndicatorTopValue hasta el IndicatorBottomValue y realiza una prueba, más específicamente, dos pruebas. Realiza una prueba de compra y una de venta en cada valor. Por ejemplo, si el valor superior es 100, toma el valor superior y lo prueba en los optimizingPeriods, digamos que son 144 períodos. Así que vería si comprar en 100 y vender en 100 habría sido rentable en los últimos 144 períodos. Si es rentable, retiene esa cantidad monetaria.
Considerando cuántos períodos estás probando hacia atrás, puede haber tenido la oportunidad de comprar múltiples veces durante la prueba. Si alcanza el take profit antes de alcanzar el stop loss, entonces tendría un resultado rentable; si alcanza el stop loss antes de alcanzar el take profit, tendrá un resultado negativo. Después de probar todos los períodos en los optimizingPeriods, suma todos los resultados rentables con todas las pérdidas para retener un valor monetario. Luego, el indicador pasa al siguiente valor inferior y lo prueba por rentabilidad.
Cuando ha probado todos los valores, selecciona el que tiene la mayor cantidad monetaria y lo elige como el valor óptimo de compra. A continuación, realiza verificaciones similares para el valor de venta. Cuando esto se completa, compara el mejor valor de compra con el mejor valor de venta y busca una operación que sea la mejor de todas. Por ejemplo, después de ejecutar esta optimización, determina que la mejor compra sería en 65 porque una compra en 65 generó el mayor beneficio, digamos $329 en la prueba de retroceso; luego revisa el valor que tiene para la mejor venta, y si la mejor venta fue en 32 con un beneficio de $530, el robot buscará una operación de venta con el indicador cruzando el nivel 32 porque vender es mejor que comprar según los beneficios generados en la prueba de retroceso.
Ideas para Futuras Expansiones
- Operar múltiples pares de divisas al mismo tiempo, posiblemente filtrando por tamaño de spread.
- Autoaprendizaje, donde aprenderá de sus propias operaciones cuál es la mejor estrategia.
- Las pruebas hacia atrás podrían incluir también un componente de pruebas hacia adelante.
- Más indicadores para elegir.
Por favor, deja tus sugerencias y comentarios, ¡y no olvides calificar!
Ahora disponible en el mercado de MetaTrader: https://www.mql5.com/en/market/product/26332
Actualizado con corchetes que faltaban en las líneas 137-142 para resolver el error identificado en los comentarios.
Publicaciones relacionadas
- Schnick: Herramienta de Aprendizaje Automático para MetaTrader 5
- Descarga Historial Completo de Ticks de Símbolos en MetaTrader 5
- Visualización de Resultados de Optimización en Tiempo Real para MetaTrader 5
- Canales de Desviación Estándar: Tu Asesor Experto para MetaTrader 4
- Combo Trader: El Asesor Experto para MetaTrader 4 que Necesitas