Esta estrategia integra la señal de reversión media de la línea de base, el filtro de volatilidad ATR y el filtro de tendencia HMA para generar señales comerciales sólidas para estrategias comerciales cuantitativas.
La estrategia utiliza un promedio móvil de 37 períodos como línea de base. Cuando el precio rompe hacia arriba desde esta línea de base, genera una señal de compra, y cuando se rompe desde arriba, genera una señal de venta. Para evitar señales falsas, la estrategia requiere que el precio se mueva más allá de la volatilidad de 2xATR después de penetrar la línea de base para confirmar la validez de las señales. Además, la estrategia utiliza un HMA de 11 períodos para juzgar la tendencia principal. Solo confirma señales válidas cuando la línea de base de penetración del precio está alineada con la dirección de HMA para evitar la selección adversa.
Para la toma de ganancias, la estrategia apoya el uso de uno o múltiples (dos o tres) niveles de toma de ganancias.
En comparación con las estrategias de ruptura de promedios móviles simples, esta estrategia agrega el filtro de volatilidad ATR que elimina muchas señales inválidas. Esto se alinea muy bien con las técnicas de ruptura de patrones visuales, lo que conduce a tasas de ganancia más altas. Además, el sesgo de tendencia HMA evita la selección adversa y reduce significativamente las pérdidas innecesarias.
El principal riesgo es que el filtro de volatilidad ATR puede eliminar algunas señales válidas, causando el fracaso para abrir posiciones a tiempo. Además, el juicio de tendencia HMA no es muy significativo a veces cuando el precio solo tiene un retroceso a corto plazo, no una reversión. Esto puede conducir a un stop loss innecesario. Para reducir los riesgos, podemos reducir el parámetro del filtro de volatilidad ATR para permitir más señales. También podemos ajustar el parámetro del período HMA para usar HMA a largo plazo para juzgar las principales tendencias, evitando interferencias de fluctuaciones a corto plazo.
La estrategia se puede optimizar en los siguientes aspectos:
Prueba más combinaciones de parámetros para encontrar el conjunto óptimo de valores, por ejemplo, período de referencia, período ATR, coeficiente de volatilidad, etc.
Añadir más filtros u osciladores para juzgar las condiciones del mercado para mejorar la robustez del modelo.
Optimizar los parámetros para los mecanismos de obtención de beneficios, probar más niveles de precios y esquemas de asignación.
Incorporar modelos de aprendizaje automático para generar señales comerciales más efectivas.
Esta estrategia integra una doble señal de línea base de media móvil, un filtro de volatilidad ATR y un filtro de sesgo de tendencia HMA en un sistema de negociación cuantitativo muy práctico.
/*backtest start: 2023-01-10 00:00:00 end: 2024-01-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/ // © sevencampbell //@version=5 strategy(title="Baseline Cross Qualifier Volatility Strategy with HMA Trend Bias", overlay=true) // --- User Inputs --- // Baseline Inputs baselineLength = input.int(title="Baseline Length", defval=20) baseline = ta.sma(close, baselineLength) // PBCQ Inputs pbcqEnabled = input.bool(title="Post Baseline Cross Qualifier Enabled", defval=true) pbcqBarsAgo = input.int(title="Post Baseline Cross Qualifier Bars Ago", defval=3) // Volatility Inputs atrLength = input.int(title="ATR Length", defval=14) multiplier = input.float(title="Volatility Multiplier", defval=2.0) rangeMultiplier = input.float(title="Volatility Range Multiplier", defval=1.0) qualifierMultiplier = input.float(title="Volatility Qualifier Multiplier", defval=0.5) // Take Profit Inputs takeProfitType = input.string(title="Take Profit Type", options=["1 Take Profit", "2 Take Profits", "3 Take Profits"], defval="1 Take Profit") // HMA Inputs hmaLength = input.int(title="HMA Length", defval=50) // --- Calculations --- // ATR atr = ta.atr(atrLength) // Range Calculation rangeHigh = baseline + rangeMultiplier * atr rangeLow = baseline - rangeMultiplier * atr rangeColor = rangeLow <= close and close <= rangeHigh ? color.yellow : na bgcolor(rangeColor, transp=90) // Qualifier Calculation qualifier = qualifierMultiplier * atr // Dot Calculation isLong = close > baseline and (close - baseline) >= qualifier and close > ta.hma(close, hmaLength) isShort = close < baseline and (baseline - close) >= qualifier and close < ta.hma(close, hmaLength) colorDot = isLong ? color.green : isShort ? color.red : na plot(isLong or isShort ? baseline : na, color=colorDot, style=plot.style_circles, linewidth=3) // --- Strategy Logic --- // PBCQ pbcqValid = not pbcqEnabled or low[pbcqBarsAgo] > baseline // Entry Logic longCondition = isLong and pbcqValid shortCondition = isShort and pbcqValid if (longCondition) strategy.entry("Long", strategy.long) if (shortCondition) strategy.entry("Short", strategy.short) // Exit Logic if (takeProfitType == "1 Take Profit") strategy.exit("TP/SL", "Long", limit=rangeHigh, stop=rangeLow) strategy.exit("TP/SL", "Short", limit=rangeLow, stop=rangeHigh) else if (takeProfitType == "2 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh) strategy.exit("TP1", "Short", qty=strategy.position_size * 0.5, limit=rangeLow / 2) strategy.exit("TP2", "Short", qty=strategy.position_size * 0.5, limit=rangeLow) else if (takeProfitType == "3 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 0.75) strategy.exit("TP3", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 1.5)