Esta estrategia utiliza el indicador Supertrend para determinar las tendencias de precios y entra en posiciones largas o cortas cuando las tendencias cambian. La estrategia permite ajustar el período ATR y el multiplicador para optimizar los parámetros. También proporciona la opción de cambiar el método de cálculo ATR para resultados ligeramente diferentes.
La estrategia tiene rangos de fecha de backtesting incorporados y la capacidad de operar solo dentro de ciertos momentos del día y cerrar todas las operaciones al final de ese marco de tiempo. Esto es especialmente útil para las acciones de negociación diaria. Cuando la opción de marco de tiempo está habilitada, puede elegir entrar en la posición actual inmediatamente cuando comience el marco de tiempo, o esperar a que un cambio de tendencia entre en la primera posición.
La estrategia también le permite especificar niveles de stop loss y take profit basados en el porcentaje. En la mayoría de los casos, la parada basada en ATR proporcionada por Supertrend hace que una stop loss adicional sea innecesaria.
Por último, existen campos de alerta personalizados para los mensajes de entrada y salida que se utilizarán con los servicios de negociación automatizados.
La estrategia de Supertrend se basa en los siguientes principios clave:
Calcular el valor de ATR: puede elegir entre el cálculo de SMA o el indicador ATR incorporado.
atr2 = sma(tr, Periods)
Calcular las bandas superior e inferior. banda superior es cerca menos ATR multiplicador veces ATR. banda inferior es cerca más multiplicador veces ATR.
up = close - (Multiplier * atr)
dn = close + (Multiplier * atr)
Determine la dirección de la tendencia comparando el precio con las bandas. Tendencia alcista cuando el precio cruza por encima de la banda inferior. Tendencia bajista cuando el precio cruza por debajo de la banda superior.
trend := trend == -1 and close > dn ? 1 : trend == 1 and close < up ? -1 : trend
Generar señales de negociación sobre el cambio de tendencia, por ejemplo, señal de venta cuando se cambia de tendencia alcista a tendencia bajista:
sellSignal = trend == -1 and trend[1] == 1
Filtrar la entrada en función de las señales y condiciones adicionales.
Utilice stop loss y take profit para bloquear las ganancias o limitar los riesgos.
Estos son los principios de trabajo clave detrás de la estrategia Supertrend. Combinado con la optimización de parámetros, puede producir buenos resultados comerciales.
La estrategia Supertrend tiene varias ventajas:
Supertrend identifica efectivamente las tendencias y se utiliza comúnmente para las paradas de seguimiento.
Los parámetros de ATR personalizables se pueden optimizar en todos los productos para el mejor ajuste.
Los intervalos de tiempo de backtest y de trading en vivo configurables se adaptan a las diferentes sesiones de trading.
La opción de entrar en el primer comercio inmediatamente o esperar a la señal atiende a diferentes productos.
El stop loss y take profit incorporados ayudan a mejorar la gestión del riesgo o a obtener más ganancias.
Alertas comerciales personalizables para la integración con sistemas de negociación automatizados y bots.
También hay algunos riesgos a tener en cuenta:
Supertrend puede producir señales falsas que necesitan ser filtradas con condiciones adicionales.
Los parámetros incorrectos de ATR pueden conducir a un exceso de negociación o tendencias faltantes.
El stop loss demasiado cercano puede terminar prematuramente las operaciones rentables.
La configuración de un marco de tiempo deficiente puede perder sesiones de negociación o atar el margen innecesariamente.
Estos riesgos pueden abordarse mediante ajustes apropiados de los parámetros o filtros adicionales para mejorar la robustez.
Algunas maneras en que la estrategia se puede optimizar aún más:
Prueba diferentes períodos de ATR para encontrar el equilibrio correcto, generalmente 10-20 funciona bien.
Pruebe diferentes valores del multiplicador ATR, generalmente 2-5 es apropiado, ajuste para encontrar el óptimo.
Añadir filtros como MACD, RSI, etc. para reducir las señales falsas.
Optimice los niveles de stop loss y de ganancias para obtener los mejores resultados.
Prueba diferentes rangos de tiempo de negociación.
Implementar la selección automática de símbolos para rastrear un gran impulso o volatilidad.
En general, esta es una estrategia de seguimiento de tendencias bastante común y práctica. Rastrea de manera eficiente las tendencias con parámetros personalizables, pero también tiene riesgos inherentes que manejar. Con optimización y condiciones adicionales, se puede refinar en un sistema de comercio de cantidades robusto con alfa consistente.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m 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/ // © REV0LUTI0N //@version=4 // Strategy strategy("Supertrend Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash) Periods = input(title="ATR Period", type=input.integer, defval=10) src = input(hl2, title="Source") Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0) changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true) enableentry = input(true, title="Enter First Trade ASAP") waitentry = input(false, title="Wait To Enter First Trade") atr2 = sma(tr, Periods) atr= changeATR ? atr(Periods) : atr2 up=src-(Multiplier*atr) up1 = nz(up[1],up) up := close[1] > up1 ? max(up,up1) : up dn=src+(Multiplier*atr) dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green) Long = (trend == 1 ? up : na) buySignal = trend == 1 and trend[1] == -1 dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red) Short = (trend == 1 ? na : dn) sellSignal = trend == -1 and trend[1] == 1 // Strategy Backtesting startDate = input(timestamp("2021-01-01T00:00:00"), type = input.time, title='Backtesting Start Date') finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time, title='Backtesting End Date') time_cond = true //Time Restriction Settings startendtime = input("", title='Time Frame To Enter Trades') enableclose = input(false, title='Enable Close Trade At End Of Time Frame') timetobuy = (time(timeframe.period, startendtime)) timetoclose = na(time(timeframe.period, startendtime)) // Stop Loss & Take Profit % Based enablesl = input(false, title='Enable Stop Loss') enabletp = input(false, title='Enable Take Profit') stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100 takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100 longStop = strategy.position_avg_price * (1 - stopTick) shortStop = strategy.position_avg_price * (1 + stopTick) shortTake = strategy.position_avg_price * (1 - takeTick) longTake = strategy.position_avg_price * (1 + takeTick) plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL") plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL") plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit") plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit") // Alert messages message_enterlong = input("", title="Long Entry message") message_entershort = input("", title="Short Entry message") message_closelong = input("", title="Close Long message") message_closeshort = input("", title="Close Short message") // Strategy Execution if Long and time_cond and timetobuy and enableentry strategy.entry("Long", strategy.long, alert_message = message_enterlong) if Short and time_cond and timetobuy and enableentry strategy.entry("Short", strategy.short, alert_message = message_entershort) if buySignal and time_cond and timetobuy and waitentry strategy.entry("Long", strategy.long, alert_message = message_enterlong) if sellSignal and time_cond and timetobuy and waitentry strategy.entry("Short", strategy.short, alert_message = message_entershort) if strategy.position_size > 0 and timetoclose and enableclose strategy.close_all(alert_message = message_closelong) if strategy.position_size < 0 and timetoclose and enableclose strategy.close_all(alert_message = message_closeshort) if strategy.position_size > 0 and enablesl and time_cond strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong) if strategy.position_size < 0 and enablesl and time_cond strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort) if strategy.position_size > 0 and enabletp and time_cond strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong) if strategy.position_size < 0 and enabletp and time_cond strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)