Esta estrategia se basa en promedios móviles, puede ajustar automáticamente los parámetros y es adecuada para mercados ondulados en marcos de tiempo altos.
Esta estrategia utiliza un promedio móvil adaptativo como señal de negociación. Primero calcula el promedio móvil simple (CMA) del período especificado (inicio). Luego prueba los parámetros del CMA alrededor del período, juzgando qué combinación tiene menos toques por cuerpo y mecha del candelabro. Finalmente utiliza el CMA con menos toques como la línea de señal.
Específicamente, la estrategia prueba el CMA con el período más 1 (CMA_P1) y menos 1 (CMA_M1), cuenta el número de toques por cuerpo y mecha. Si CMA tiene menos toques que CMA_P1 y CMA_M1, entonces mantenga el período actual; si CMA_P1 tiene menos toques, entonces aumente el período en 1; si CMA_M1 tiene menos toques, entonces disminuya el período en 1. Esto encuentra un CMA relativamente suave como la línea de señal.
Cuando el precio rompe el CMA hacia arriba, se genera una señal de compra; cuando el precio rompe el CMA hacia abajo, se genera una señal de venta.
Esta estrategia de media móvil adaptativa tiene las siguientes ventajas:
No es necesario seleccionar manualmente el período de media móvil, la estrategia probará diferentes períodos y encontrará el óptimo.
Reduce las señales falsas: en comparación con la MA de período fijo, la MA adaptativa puede filtrar más ruido y reducir muchas señales falsas.
Adaptarse a los cambios del mercado. Cuando el mercado cambia de rango a tendencia, el período de MA aumentará automáticamente para generar señales; cuando el mercado cambia de tendencia a rango, el período de MA disminuirá automáticamente. Así que la estrategia puede adaptarse dinámicamente a los cambios del mercado.
Este método adaptable puede simplificar todo el sistema de negociación sin optimización manual de parámetros.
El concepto se puede aplicar a otros indicadores como bandas de Bollinger adaptativas, KD adaptativa, etc.
También hay algunos riesgos a tener en cuenta para esta estrategia:
Riesgo de opción de compra. Cuando el mercado tiene un patrón de opción de compra, el cuerpo de la vela puede no romper la línea MA, lo que resulta en señales erróneas.
Riesgo de ruptura fallida. La ruptura de MA no siempre continúa, pueden ocurrir algunas rupturas fallidas. Se necesita validación de ruptura para garantizar una alta tasa de éxito.
Riesgo de reversión de tendencia. La reversión de tendencia después de entrar en la tendencia debe cambiarse a tiempo, de lo contrario puede causar pérdidas. Se debe establecer un stop loss para controlar la pérdida.
El riesgo de optimización de parámetros. Los parámetros ajustados adaptativos pueden caer en la optimización local, lo que resulta en MA redundantes.
Riesgo de sobreajuste. El ajuste excesivo de parámetros puede conducir a un sobreajuste y perder la capacidad de generalización del modelo. Se necesita una verificación prolongada en diferentes entornos de mercado, no solo depender de los resultados de las pruebas de retroceso.
Algunas direcciones para mejorar esta estrategia de AM adaptativa:
Añadir la validación de la ruptura de tendencia a través de rupturas consecutivas para filtrar las rupturas falsas.
Aumentar la estrategia de stop loss, stop loss cuando el precio vuelve al otro lado de MA.
Añadir un filtro de opción para evitar señales incorrectas cuando aparece la opción de llamada.
Introduzca métricas de evaluación como IC, LIC, SIC, etc. para restringir el ajuste de parámetros y evitar el sobreajuste.
Extensión a otros indicadores como estrategia de cruz de oro adaptativa, bandas de Bollinger adaptativas, etc.
Optimizar el cálculo de la MA utilizando la MA ponderada, la MA exponencial, etc. para obtener una MA más suave.
Esta estrategia genera señales comerciales ajustando adaptativamente el período de MA para encontrar parámetros óptimos. En comparación con los parámetros fijos, puede reducir muchas señales falsas y adaptarse a los cambios del mercado. Pero también debemos tener cuidado con los riesgos potenciales y hacer verificación y optimización de marcha adelante antes de aplicarlo en el comercio en vivo para obtener ganancias constantes.
[/trans] ¿Qué quieres decir?
/*backtest start: 2022-11-10 00:00:00 end: 2023-11-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © fondDealer96636 //@version=5 strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000) // input start = 20 lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.") smoothing = input(3, "Smoothing") source = input(close, "Source") startYear = input(2020, "Start year") resp = 1 in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0) // global var ix = -1 var mal = array.new_int(0) // functions avg(source, len) => sum = 0.0 for i = 0 to len-1 sum += source[i] sum/len bull = close > open wick_touch(x) => bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close)) body_touch(x) => bull ? (open < x and x < close) : (close < x and x < open) touches(t) => touches = 0 for i = 0 to lookback-1 touches += t[i] ? 1 : 0 touches // local ix := ix+1 prev_mal = ix >= 1 ? array.get(mal, ix-1) : start cma = avg(source, prev_mal) cma_p1 = avg(source, prev_mal+1) cma_m1 = avg(source, prev_mal-1) d = touches(wick_touch(cma)) d_p1 = touches(wick_touch(cma_p1)) d_m1 = touches(wick_touch(cma_m1)) d_b = touches(body_touch(cma)) d_p1_b = touches(body_touch(cma_p1)) d_m1_b = touches(body_touch(cma_m1)) any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0 no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0 wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na)) up = cma > cma[1] down = cma < cma[1] against_trend = (up and close < cma) or (down and close > cma) new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized) next_mal = na(new_mal) ? prev_mal : new_mal array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal)) // graph scma = ta.ema(cma, smoothing) uptrend = scma > scma[1] downtrend = scma < scma[1] plot(scma, "Automatic MA", color=uptrend ? color.green : color.red) uptrending = close > scma and uptrend downtrending = close < scma and downtrend defy = not uptrending and not downtrending defy_cross = defy and body_touch(scma) barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white))) // strategy change_to_uptrend = uptrending and downtrend[1] change_to_downtrend = downtrending and uptrend[1] long = in_date_range and change_to_uptrend short = in_date_range and change_to_downtrend if long strategy.entry("Long", strategy.long) if short strategy.entry("Short", strategy.short)