Estrategia de supertendencia bidireccional


Fecha de creación: 2023-10-08 15:02:45 Última modificación: 2023-10-08 15:02:45
Copiar: 0 Número de Visitas: 676
1
Seguir
1617
Seguidores

Descripción general

La estrategia determina la dirección de la tendencia actual en función de los indicadores ATR calculados para subir y bajar, y da señales de compra y venta. La estrategia se mantiene positiva cuando el precio se eleva y negativa cuando el precio se baja.

Principio de estrategia

  1. Calcula el indicador ATR, que representa el rango medio de fluctuación de los precios
  2. La línea de la vía superior y la línea de la vía inferior se calculan por un múltiplo de los valores ATR
  3. Determinar la relación entre el precio y la trayectoria ascendente y descendente y determinar la dirección de la tendencia
    • Cuando el precio está por encima de la línea, la tendencia de los bulls
    • Cuando el precio está por debajo de la línea de descenso, la tendencia a la baja
  4. Dar señales de compra y venta cuando la tendencia cambia
    • Cuando la tendencia bajista se convierte en una tendencia alcista, se da una señal de compra cerca de la vía superior
    • Cuando la tendencia alcista se convierte en una tendencia bajista, se da una señal de venta cerca de la baja
  5. Visualizar las subidas y bajadas, la dirección de la tendencia y las señales de compra y venta

Análisis de las ventajas

  • El uso del indicador ATR para determinar la tendencia permite configurar los parámetros adecuados en función de la amplitud de las fluctuaciones del mercado, lo que hace que la línea ascendente y descendente se adapte mejor a la tendencia del mercado
  • El uso de breakouts para determinar el cambio de tendencia puede capturar el cambio de tendencia a tiempo.
  • Para evitar la interferencia de las falsas brechas en el mercado, filtra las señales en la dirección de la tendencia
  • Las señales de subida y bajada y las de compra y venta se muestran visualmente a simple vista.

Análisis de riesgos

  • Los parámetros ATR demasiado grandes o demasiado pequeños pueden desviarse del precio de la línea ascendente y descendente y no permitir un seguimiento eficaz de la tendencia
  • El parámetro de multiplicador es demasiado grande y aumenta la señal falsa; el parámetro de multiplicador es demasiado pequeño y la señal se retrasa
  • El tiempo de reversión es inexacto y puede generar pérdidas
  • Necesidad de combinar otros indicadores con señales de estrategia de filtración para reducir el riesgo de arbitraje

Dirección de optimización

  • Se puede considerar la optimización dinámica de los parámetros del ciclo ATR para que las subidas y bajadas sean más adecuadas para las fluctuaciones del mercado
  • Estrategias de ajuste de parámetros para diferentes ciclos de diferentes variedades
  • Puede combinarse con otros indicadores para determinar tendencias, como el aumento de la confirmación de precios
  • La configuración de los parámetros se puede optimizar mediante la tecnología de aprendizaje automático

Resumir

La estrategia en su conjunto implementa la idea de determinar tendencias bidireccionales basadas en el indicador ATR, romper los carriles ascendentes y descendentes para dar una señal de compra y venta, y luego combinar la dirección de la tendencia para filtrar y evitar la interferencia de señales falsas. Se puede adaptar a diferentes entornos de mercado mediante el ajuste de parámetros. Sin embargo, también hay ciertos riesgos que requieren una optimización adicional.

Código Fuente de la Estrategia
/*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)