Stratégie de trading à court terme d'achat et de vente avec filtre de plage


Date de création: 2023-09-21 21:17:40 Dernière modification: 2023-09-21 21:17:40
Copier: 0 Nombre de clics: 854
1
Suivre
1617
Abonnés

Aperçu

Cette stratégie est basée sur une gamme de fluctuations du prix pour déterminer le moment d’acheter et de vendre. Elle calcule la gamme de fluctuations du prix au cours d’un certain cycle et génère un signal de transaction avec cette gamme comme condition de filtrage.

Principe de stratégie

L’indicateur central de la stratégie est la marge de fluctuation des prix. Le processus de calcul est le suivant:

  1. Calculer la différence entre le prix le plus élevé et le prix le plus bas des N derniers cycles comme le mouvement des prix

  2. Un traitement linéaire de l’amplitude des prix pour obtenir un filtre de portée

  3. Un signal d’achat est généré lorsque la hausse des prix dépasse le filtre de portée

  4. Un signal de vente est généré lorsque le prix baisse au-delà du filtre de portée

De cette façon, il est possible d’utiliser la rupture de la fourchette de fluctuation pour juger de la direction de la tendance, filtrer le bruit de la transaction et obtenir un signal de transaction plus clair.

Avantages stratégiques

  • Utilisation d’une fourchette de prix pour détecter une rupture
  • La gamme d’oscillation est traitée en douceur, filtrant efficacement le bruit
  • Les signaux de rupture permettent de capturer facilement les courts courants.
  • Fréquence de transaction élevée, adaptée aux opérations de ligne courte
  • Paramètres réglables, faciles à optimiser pour différentes variétés

Risque stratégique

  • La rupture de gamme est sujette à des sauts et des retours
  • Les données historiques nécessitent une plus grande portée de calcul
  • Une mauvaise configuration des paramètres peut être trop sensible ou lente
  • Les pertes ne sont pas efficacement maîtrisées et il y a un retrait important.
  • L’effet peut être affecté par les frais de transaction

Les mesures suivantes peuvent réduire le risque:

  • Coefficient de fluctuation de la gamme de filtrage de la largeur appropriée
  • Optimiser les paramètres pour trouver la meilleure combinaison de paramètres
  • Arrêt de la ligne de stop ou arrêt de mouvement
  • Réduire la fréquence des transactions et les frais de transaction de manière appropriée
  • Paramètres de test selon les variétés

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Paramètres périodiques différents dans la plage de calcul du test

  2. Coefficient de fluctuation de la gamme de filtrage optimisée

  3. Ajout d’indicateurs tels que MACD pour une deuxième confirmation

  4. Utiliser un stop mobile ou un stop suivi

  5. Paramètres d’ajustement différents selon les variétés

  6. Considérer l’optimisation du système de gestion des positions

Résumer

La stratégie utilise la portée de la rupture des prix pour générer des signaux de négociation en ligne courte. Cela permet d’identifier efficacement les opportunités de tendance à court terme. Mais il existe également un risque de rebond. Nous pouvons améliorer le système de stratégie en optimisant les paramètres, en définissant des règles de stop-loss, en ajoutant des filtres d’indicateurs, etc.

Code source de la stratégie
/*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)