Stratégie à double sens de SuperTrend

Auteur:ChaoZhang est là., Date: 2023-10-08 15:02:45 Je vous en prie.
Les étiquettes:

Résumé

Cette stratégie utilise les bandes supérieures et inférieures calculées sur la base de l'indicateur ATR pour déterminer la direction de la tendance actuelle et générer des signaux d'achat et de vente.

La logique de la stratégie

  1. Calculer l'indicateur ATR, qui représente la fourchette moyenne de volatilité des prix.
  2. Les bandes supérieure et inférieure sont calculées sur la base de la valeur ATR multipliée par un facteur.
  3. Déterminez la direction de la tendance en fonction de la relation entre le prix et les bandes.
    • Lorsque le prix est au-dessus de la bande supérieure, c'est une tendance haussière.
    • Lorsque le prix est en dessous de la fourchette inférieure, c'est une tendance à la baisse.
  4. Générer des signaux d'achat et de vente lorsque la tendance change de direction.
    • Un signal d'achat est généré près de la bande supérieure lorsque la tendance passe d'une tendance à la baisse à une tendance à la hausse.
    • Un signal de vente est généré près de la bande inférieure lorsque la tendance passe d'une tendance haussière à une tendance baissière.
  5. Visualisez les bandes supérieures/inférieures, la direction de la tendance et les signaux de trading.

Analyse des avantages

  • L'utilisation de l'ATR pour déterminer la tendance peut adapter les bandes à la volatilité du marché en ajustant les paramètres.
  • Capture l'inversion de tendance en temps opportun par rupture des bandes.
  • Filtre les signaux par direction de tendance pour éviter les fausses ruptures.
  • Visualisation claire des bandes et des signaux.

Analyse des risques

  • Une période d'ATR inappropriée peut séparer les bandes du prix.
  • Un multiplicateur trop grand/trop petit provoque plus de faux signaux et de signaux retardés.
  • Le timing inexact de l'inversion entraîne des pertes liées à l'inversion.
  • Il a besoin d'autres filtres pour réduire les coups de fouet.

Directions d'optimisation

  • Optimisation dynamique de la période ATR pour s'adapter à la volatilité du marché.
  • Paramètres ajustés pour différents produits et délais.
  • Combinez d'autres indicateurs tels que le volume pour la validation de la tendance.
  • Utiliser l'apprentissage automatique pour l'optimisation des paramètres.

Résumé

Cette stratégie met en œuvre l'idée de déterminer une tendance bidirectionnelle basée sur l'ATR. Les signaux de rupture sont générés et filtrés par la direction de la tendance pour éviter de faux signaux. Les paramètres peuvent être ajustés pour différents environnements de marché. Il y a encore des risques qui nécessitent une optimisation supplémentaire.


/*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)   




Plus de