Stratégie de négociation à court terme de rupture de filtrage de gamme

Auteur:ChaoZhang est là., Date: le 21 septembre 2023
Les étiquettes:

Résumé

Cette stratégie de trading à court terme génère des signaux d'achat et de vente basés sur la fourchette de fluctuation des prix. Elle calcule la fourchette de mouvement des prix sur une période et l'utilise comme filtre pour les signaux de trading. Les signaux sont déclenchés lorsque le prix dépasse la fourchette.

La logique de la stratégie

L'indicateur de base est la fourchette de fluctuation des prix.

  1. Calculer la fourchette haute-basse au cours des N dernières périodes en tant qu'amplitude des prix

  2. Lisser l'amplitude en utilisant des moyennes mobiles pour dériver le filtre de gamme

  3. Un signal d'achat est généré lorsque le prix dépasse le filtre de gamme

  4. Un signal de vente est généré lorsque le prix tombe en dessous du filtre de gamme

De cette façon, les ruptures de la fourchette de prix sont utilisées pour déterminer la direction de la tendance et filtrer le bruit pour des signaux plus propres.

Les avantages

  • Plage de prix facile à juger
  • Une plage de diffusion lisse filtre le bruit.
  • Les signaux de rupture captent les tendances à court terme
  • Fréquence de négociation plus élevée adaptée aux transactions à court terme
  • Paramètres réglables faciles à optimiser

Les risques

  • Les écarts de portée sont sujets aux fouets
  • Besoin de données historiques suffisantes pour calculer la portée
  • Les mauvais paramètres provoquent une sursensibilité ou une lenteur.
  • Aucun arrêt effectif, gros tirages
  • Performance affectée par les frais dus à la fréquence élevée

Les risques peuvent être atténués par:

  • Coefficient de volatilité du filtre à plage de relâchement
  • Optimisation des paramètres pour les paramètres idéaux
  • Mise en œuvre d'un stop loss ou d'un trailing stop
  • Réduction de la fréquence des échanges pour réduire les frais
  • Épreuves de paramètres spécifiques au produit

Directions de renforcement

La stratégie peut être améliorée par:

  1. Test des différentes périodes de calcul de la plage

  2. Optimisation du coefficient de volatilité du filtre à plage

  3. Ajout d'indicateurs de confirmation tels que le MACD

  4. Utilisation d'arrêts en mouvement ou en retard

  5. Paramètres de réglage spécifiques pour chaque produit

  6. Optimisation du système de dimensionnement de la position

Résumé

Cette stratégie utilise la rupture des prix hors des plages pour générer des signaux à court terme, capturant efficacement les tendances temporaires. Mais des risques tels que les whips existent. Des améliorations peuvent être apportées par l'optimisation des paramètres, l'arrêt des pertes, l'ajout de filtres, etc. pour contrôler les risques tout en conservant l'efficacité.


/*backtest
start: 2023-08-21 00:00:00
end: 2023-09-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Range Filter Buy and Sell 5min [Strategy]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, slippage=0)

// === INPUT BACKTEST RANGE ===
useDate = input(true,     title='---------------- Use Date ----------------', type=bool)
FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 25, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
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 = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true  // create function "within window of time"
// === INPUT BACKTEST RANGE ===


sources = input(defval=close, title="Source")
isHA = input(false, "Use HA Candles", bool)
src = isHA ? security(heikenashi(tickerid), period, sources) : sources
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters

per = input(defval=50, minval=1, title="Sampling Period")

// Range Multiplier

mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range

smoothrng(x, t, m)=>
    wper      = (t*2) - 1
    avrng     = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper)*m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter

rngfilt(x, r)=>
    rngfilt  = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt
filt = rngfilt(src, smrng)

// Filter Direction

upward   = 0.0
upward  := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands

hband = filt + smrng
lband = filt - smrng

// Colors

filtcolor = upward > 0 ? lime : downward > 0 ? red : orange
barcolor  = (src > filt) and (src > src[1]) and (upward > 0) ? lime : (src > filt) and (src < src[1]) and (upward > 0) ? green : 
   (src < filt) and (src < src[1]) and (downward > 0) ? red : (src < filt) and (src > src[1]) and (downward > 0) ? maroon : orange

filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")

// Target

hbandplot = plot(hband, color=aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=fuchsia, transp=100, title="Low Target")

// Fills

fill(hbandplot, filtplot, color=aqua, title="High Target Range")
fill(lbandplot, filtplot, color=fuchsia, title="Low Target Range")

// Bar Color

//barcolor(barcolor)

// Break Outs 

longCond = na
shortCond = na
longCond := ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0)) 
shortCond := ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Alerts

plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = white, style=shape.labelup, size = size.normal, location=location.belowbar, color = green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = red, transp = 0)

//strategy.entry("Long", strategy.long, stop = hband, when = window() , comment="Long")
//strategy.entry("Short", strategy.short, stop = lband, when = window() , comment="Short")

strategy.entry("Long", strategy.long, when = longCondition and window() , comment="Long")
strategy.entry("Short", strategy.short, when = shortCondition and window() , comment="Short")



// === Stop LOSS ===
useStopLoss = input(false, title='----- Use Stop Loss / Take profit -----', type=bool)
sl_inp = input(100, title='Stop Loss %', type=float, step=0.25)/100
tp_inp = input(1.5, title='Take Profit %', type=float, step=0.25)/100
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
stop_level_short = strategy.position_avg_price * (1 + sl_inp)
take_level_short = strategy.position_avg_price * (1 - tp_inp)
// === Stop LOSS ===

if useStopLoss
    strategy.exit("Stop Loss/Profit Long","Long", stop=stop_level, limit=take_level)
    strategy.exit("Stop Loss/Profit Short","Short", stop=stop_level_short, limit=take_level_short)


Plus de