Estrategia de negociación a largo plazo basada en SuperTrend

El autor:¿ Qué pasa?, Fecha: 2023-09-20 17:14:33
Las etiquetas:

Resumen general

Esta estrategia identifica oportunidades largas utilizando el indicador SuperTrend. Utiliza ATR y un multiplicador para determinar los niveles de soporte dinámico para la entrada larga.

Estrategia lógica

  1. Las bandas superior e inferior se calculan en función del período ATR, multiplicador.

  2. La tendencia actual se sigue, con 1 para tendencia alcista y -1 para tendencia bajista.

  3. Un promedio móvil se agrega como un filtro de tendencia. Comprar solo si el precio está por encima de MA al romper por encima de la banda superior. Vender solo si el precio está por debajo de MA al romper por debajo de la banda inferior. Esto evita las rupturas falsas.

  4. Los ayudantes visuales destacan tendencias, señales, etc. para ayudar a la toma de decisiones.

Análisis de ventajas

Las ventajas de esta estrategia:

  1. SuperTrend realiza un seguimiento dinámico de los cambios de precios y refleja los cambios de tendencia a tiempo.

  2. El ATR stop loss ajusta las paradas en función de la volatilidad del mercado, ayudando a obtener ganancias.

  3. El filtro MA elimina las señales falsas del ruido en mercados variados.

  4. El diseño visual presenta intuitivamente la mecánica de la estrategia y la situación del mercado.

  5. Solo las inversiones de tendencia de las operaciones lo hacen adecuado para la tenencia a largo plazo.

Análisis de riesgos

Los principales riesgos son:

  1. SuperTrend es sensible a los parámetros.

  2. En mercados agitados, las paradas pueden desencadenarse con frecuencia.

  3. Sin tener en cuenta los costos de negociación, las cuentas pequeñas sufren mayor impacto.

  4. No hay stop loss significa un alto riesgo de extracción.

  5. El filtro de tendencias puede perder algunas oportunidades.

Los riesgos pueden reducirse:

  1. Optimizando los parámetros de ATR para una frecuencia de ajuste de banda más baja.

  2. Añadir un filtro de barras equivalente para evitar paradas por oscilaciones menores de alta frecuencia.

  3. Implementar stop loss y tomar ganancias para proteger las ganancias.

  4. Ajuste del período promedio móvil para el efecto de filtrado de equilibrio.

  5. Optimización de la gestión del dinero para reducir los impactos de los costes comerciales.

Direcciones de optimización

La estrategia puede mejorarse en los siguientes aspectos:

  1. Prueba diferentes fuentes de precios como cerrado, alto, etc.

  2. Pruebe otros indicadores dinámicos de stop loss como Chandelier Exit.

  3. Añadir el tamaño de la posición para optimizar la utilización del capital.

  4. Incorporar indicadores de volatilidad para refinar las entradas.

  5. Implementar stop loss y tomar ganancias para controlar los riesgos.

  6. Ajustar los parámetros para diferentes mercados.

  7. Explorar el aprendizaje automático para la optimización de parámetros.

  8. Combinar otros indicadores para mejorar la precisión del filtro.

Conclusión

Esta estrategia utiliza SuperTrend con paradas dinámicas para determinar tendencias y agrega un filtro MA para identificar entradas largas.


/*backtest
start: 2020-09-13 00:00:00
end: 2023-09-19 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Long Strategy", overlay=true, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=50000)

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)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)

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

// Moving Average as Trend Filter
periodes_ma = input(title="Moving Average Period", type=input.integer, defval=20)
src_ma = input(title="Moving Average Source", type=input.source, defval=close)
ma = sma(src_ma, periodes_ma)

upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1 and close > ma
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0))

dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1 and close < ma
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.new(color.green, 70) : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.new(color.red, 70) : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highlighter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highlighter", color=shortFillColor)

FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       

window()  => time >= start and time <= finish ? true : false

longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())

shortCondition = sellSignal
if (shortCondition)
    strategy.close("BUY")
    strategy.entry("SELL", strategy.short, when = window())

buy1 = barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)


Más.