Estrategia de doble dirección de SuperTrend

El autor:¿ Qué pasa?, Fecha: 2023-10-08 15:02:45
Las etiquetas:

Resumen general

Esta estrategia utiliza las bandas superior e inferior calculadas en base al indicador ATR para determinar la dirección de la tendencia actual y generar señales de compra y venta.

Estrategia lógica

  1. Calcular el indicador ATR, que representa el rango medio de volatilidad de los precios.
  2. Se calcularán las bandas superior e inferior basándose en el valor ATR multiplicado por un factor.
  3. Determinar la dirección de la tendencia basada en la relación del precio con las bandas.
    • Cuando el precio está por encima de la banda superior, es una tendencia alcista.
    • Cuando el precio está por debajo de la banda inferior, es una tendencia bajista.
  4. Generar señales de compra y venta cuando la tendencia cambia de dirección.
    • Una señal de compra se genera cerca de la banda superior cuando la tendencia cambia de tendencia bajista a tendencia alcista.
    • Una señal de venta se genera cerca de la banda inferior cuando la tendencia cambia de tendencia alcista a tendencia bajista.
  5. Visualice las bandas superior/inferior, la dirección de la tendencia y las señales comerciales.

Análisis de ventajas

  • El uso de ATR para determinar la tendencia puede adaptar las bandas a la volatilidad del mercado ajustando los parámetros.
  • Captura la reversión de tendencia a tiempo por la ruptura de las bandas.
  • Filtra las señales por dirección de tendencia para evitar fallas falsas.
  • Visualización clara de bandas y señales.

Análisis de riesgos

  • El período ATR inadecuado puede separar las bandas del precio.
  • El multiplicador demasiado grande/pequeño causa más señales falsas y señales rezagadas.
  • El tiempo de reversión inexacto conduce a pérdidas por negociación inversa.
  • Necesita otros filtros para reducir el ser aserrado.

Direcciones de optimización

  • Optimización dinámica del período ATR para adaptarse a la volatilidad del mercado.
  • Ajuste de parámetros para diferentes productos y plazos.
  • Combinar otros indicadores como el volumen para la validación de tendencias.
  • Utilice el aprendizaje automático para la optimización de parámetros.

Resumen de las actividades

Esta estrategia implementa la idea de determinar una tendencia bidireccional basada en ATR. Las señales de ruptura se generan y filtran por la dirección de la tendencia para evitar señales falsas. Los parámetros se pueden ajustar para diferentes entornos de mercado. Todavía hay algunos riesgos que necesitan una mayor optimización. En general, esta es una estrategia simple y práctica que vale la pena investigar y mejorar.


/*backtest
start: 2022-10-01 00:00:00
end: 2023-10-07 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

TradeId = "RVG"

InitCapital = 1000
InitPosition = 1000
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true

//@version=4
// strategy("Supertrend RG", overlay = true,process_orders_on_close=true,commission_type=strategy.commission.percent,commission_value=InitCommission,
//  currency=currency.USD,initial_capital=InitCapital,default_qty_type=strategy.cash, default_qty_value=InitPosition, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick,pyramiding=InitPyramidMax)

//
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2018, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true



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=true)
highlighting = input(title="Highlighter 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
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
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=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
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


strategy.entry(TradeId + " Long", true, when=buySignal[1] and time_cond)
strategy.entry(TradeId + " Short", false, when=sellSignal[1] and time_cond)   




Más.