
La estrategia es una estrategia de comercio cuantitativa que combina una señal de ruptura de doble línea de paridad con un filtro de volatilidad ATR y un desvío de tendencia HMA. La estrategia utiliza una línea de paridad de dos períodos diferentes para construir una señal de negociación, combina un filtro de ATR con un indicador de volatilidad para filtrar una parte de la señal no válida y utiliza HMA para determinar la dirección de la tendencia y evitar operaciones de contrarreloj.
La estrategia utiliza una media de 37 ciclos como media de referencia, generando una señal de compra cuando el precio se rompe por debajo de la media y una señal de venta cuando se rompe por encima. Para filtrar señales de falsedad, la estrategia establece que el precio rompe la media de referencia y continúa moviéndose en la misma dirección con más de 2 veces la oscilación ATR para confirmar la dirección de la generación de señales.
En el modo de ganancia, la estrategia apoya la opción de usar una parada o dos o incluso tres paradas de diferentes precios. En el modo de parada, la estrategia se encuentra directamente por encima y por debajo de la línea de la órbita como una parada de larga y corta duración.
En comparación con la estrategia de ruptura de línea uniforme, la estrategia aumenta el filtro de volatilidad ATR en la generación de señales, que puede filtrar la mayor parte de las señales no válidas, lo que coincide muy bien con la estrategia de forma de línea K visual, por lo que se puede obtener una mayor probabilidad de ganar. Al mismo tiempo, aumentar el HMA para juzgar la tendencia de la desviación, evitar la reversión de la posición, y reducir significativamente las pérdidas innecesarias. En la forma de ganancias, la estrategia admite múltiples configuraciones de puntos de parada, lo que puede bloquear más ganancias hasta cierto punto.
El mayor riesgo de esta estrategia es que el filtrado de la volatilidad de ATR puede eliminar parte de la señal efectiva, lo que hace que la estrategia no pueda establecer una posición a tiempo. Además, el efecto de la HMA en el juicio de la gran tendencia no es obvio, a veces los precios son solo una corrección a corto plazo en lugar de una reversión de la gran tendencia, lo que puede causar pérdidas innecesarias. Para reducir el riesgo mencionado anteriormente, se puede reducir adecuadamente los parámetros del filtrado de la volatilidad de ATR, ampliar el rango de volatilidad y generar más señales de forma de línea K a través de instrucciones de verificación.
La estrategia puede ser optimizada en las siguientes direcciones:
Prueba más tipos de combinaciones de parámetros para encontrar la combinación óptima. La longitud de la línea media de referencia, el ciclo ATR y el coeficiente de filtración de volatilidad son parámetros ajustables.
Aumentar el número de indicadores de filtración o osciladores para evaluar el estado del mercado y mejorar la solidez de la estrategia.
Optimización de la configuración de los parámetros de la manera de obtener ganancias. Prueba adicional de la configuración de los puntos de parada para diferentes niveles de cantidad y precio.
La combinación de modelos de aprendizaje automático para generar señales de negociación más eficientes.
Esta estrategia integra la señal central de ruptura de la línea de paridad doble, la señal de invalidez del filtro de volatilidad ATR y el uso de HMA para determinar el desvío de la gran tendencia para evitar la construcción de posiciones en contra, es una estrategia de negociación cuantitativa muy práctica. El espacio para optimizar los parámetros de la estrategia es grande, el efecto todavía tiene espacio para mejorar, vale la pena investigar y optimizar su implementación.
/*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)