Esta es una estrategia de negociación de swing de intervalo diario basada en técnicas de impulso utilizando ATR Stops. Fue creada por Kory Hoang de Stably.
La estrategia identifica la dirección de la tendencia utilizando indicadores de impulso y establece líneas de stop loss basadas en ATR para implementar el swing trading de compra baja-venta alta.
El código primero establece el rango de tiempo de backtesting.
Luego, en la sección de indicadores, se calculan los siguientes indicadores:
La lógica principal para juzgar la tendencia es:
Si el cierre es superior a la línea de stop loss ascendente anterior, se considera una tendencia alcista; si el cierre es inferior a la línea de stop loss ascendente anterior, se considera una tendencia bajista.
Cuando la tendencia cambie, ajuste la posición de la línea de stop loss.
Específicamente, en una tendencia alcista, la línea de stop loss se establece en el precio más alto de la barra anterior menos el valor ATR; en una tendencia bajista, la línea de stop loss se establece en el precio más bajo de la barra anterior más el valor ATR.
Esto realiza la tendencia después de la parada de pérdida.
En la sección de reglas de negociación, abra posiciones largas/cortas cuando el precio rompa la línea de stop loss.
Las ventajas de esta estrategia:
También hay algunos riesgos:
Algunas optimizaciones:
Algunas direcciones para optimizar esta estrategia:
Prueba diferentes parámetros de ATR para encontrar el óptimo. Prueba posterior de conjuntos de parámetros múltiples y evalúa la relación rendimiento/riesgo.
Añadir métricas de volatilidad, relajar las pérdidas de parada adecuadamente durante los períodos de mayor volatilidad.
Añadir filtro de tendencia para evitar las operaciones durante el mercado agitado.
Añadir un mecanismo de tamaño de posición. Ajustar el tamaño de la posición en función de la tasa de utilización de la cuenta, los tiempos consecutivos de stop loss, etc.
Añadir el control del riesgo de brecha de la noche.
Como una estrategia básica de negociación de swing diario, la lógica general es clara. Juzga la tendencia con técnicas de impulso y utiliza ATR para dejar atrás la pérdida, controlando eficazmente el riesgo.
Todavía hay mucho espacio para la optimización, puede mejorar desde aspectos como el juicio de tendencia, el método de stop loss, el tamaño de la posición, etc. para hacer que la estrategia sea más práctica.
/*backtest start: 2023-01-29 00:00:00 end: 2024-02-04 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("BTC Swinger", overlay=true, commission_value = 0.25, default_qty_type=strategy.percent_of_equity, default_qty_value = 100) ///////////////////////////////////////////////////////////// //START - SET DATE RANGE // === BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1) FromDay = input(defval = 1, title = "From Day", minval = 1) FromYear = input(defval = 2010, title = "From Year") ToMonth = input(defval = 12, title = "To Month", minval = 1) ToDay = input(defval = 31, title = "To Day", minval = 1) ToYear = input(defval = 2020, title = "To Year") startDate = time > timestamp(FromYear, FromMonth, FromDay, 1, 1) endDate = time < timestamp(ToYear, ToMonth, ToDay, 23, 59) withinTimeRange = true ///////////////////////////////////////////////////////////// //END - SET DATE RANGE ///////////////////////////////////////////////////////////// //START - INDICATORS length = input(3) mult = input(1, minval = 0.01) atr_ = atr(length) max1 = max(nz(max_[1]), close) min1 = min(nz(min_[1]), close) is_uptrend_prev = nz(is_uptrend[1], true) stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_ vstop_prev = nz(vstop[1]) vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop) is_uptrend = close - vstop1 >= 0 is_trend_changed = is_uptrend != is_uptrend_prev max_ = is_trend_changed ? close : max1 min_ = is_trend_changed ? close : min1 vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1 plot(vstop, color = is_uptrend ? yellow : red, style=circles, linewidth=2) ///////////////////////////////////////////////////////////// //END - INDICATORS ///////////////////////////////////////////////////////////// //START - TRADING RULES direction = input(defval=1, title = "Strategy Direction", minval=-1, maxval=1) strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) condition1 = close > vstop and withinTimeRange condition2 = close < vstop and withinTimeRange strategy.entry("BUY", strategy.long, when = condition1) strategy.entry("SELL", strategy.short, when = condition2) ///////////////////////////////////////////////////////////// //END - TRADING RULES