Volatilité Stratégie de négociation moyenne mobile du canal de prix

Auteur:ChaoZhang est là., Date: 2023-12-12 11:44:15 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie est basée sur l'indicateur Super Trend et l'indicateur de canal de prix, combiné avec des signaux de moyenne mobile pour le trading.

La logique de la stratégie

  1. Calculez l'indicateur de Super Trend. Les rails supérieur et inférieur sont le prix actuel plus/moins N fois l'indicateur ATR respectivement. Lorsque le prix est supérieur au rails supérieur, il est haussier. Lorsque le prix est inférieur au rails inférieur, il est baissier.

  2. Calculer l'indicateur de canal de prix. La ligne de canal de prix est M fois l'écart type de N jours du prix. Les prix supérieurs/inférieurs à la ligne de canal sont considérés comme des états anormaux.

  3. Prenez les lignes moyennes de prix d'ouverture, de prix de clôture et de Super Trend respectivement.

  4. Générer des signaux de trading:

    • Signal d'achat: le prix de clôture dépasse la ligne Super Trend et est supérieur à la moyenne mobile du prix d'ouverture.

    • Signal de vente: le prix de clôture traverse la ligne Super Trend et est inférieur à la moyenne mobile du prix ouvert.

  5. Mettez un stop-loss et prenez le profit du canal de prix.

Analyse des avantages

  1. La combinaison de plusieurs indicateurs permet d'éviter les faux signaux.

  2. L'utilisation du canal de prix pour juger des états de prix anormaux peut filtrer certains points d'entrée indésirables.

  3. Les moyennes mobiles combinées à l'évaluation de la direction de la tendance évitent de négocier contre la tendance.

  4. La mise en place d'un stop-loss et d'une fourchette de bénéfices contrôle le risque.

Analyse des risques

  1. Les paramètres sont trop subjectifs et doivent être optimisés.

  2. L'intervalle de stop loss et de profit peut être trop large ou trop étroit.

  3. Les paramètres des canaux de prix peuvent ne pas convenir à tous les produits, des essais distincts sont nécessaires.

  4. Des pertes importantes peuvent survenir lors de changements de tendance drastiques.

Directions d'optimisation

  1. Tester et optimiser les paramètres pour trouver des combinaisons optimales.

  2. Testez les moyennes mobiles avec des périodes différentes pour sélectionner les paramètres optimaux.

  3. Tests antérieurs sur plusieurs produits et sélection de paramètres en fonction des performances respectives.

  4. Optimiser la stratégie de stop loss pour éviter une perte unique excessivement importante.

Conclusion

Cette stratégie combine plusieurs indicateurs pour juger des anomalies de prix et des directions de tendance, ce qui peut théoriquement filtrer certains faux signaux. Cependant, les paramètres sont encore relativement subjectifs avec une marge d'optimisation. En outre, les coûts de trading tels que les commissions et le glissement doivent être considérés dans le trading réel.


/*backtest
start: 2023-12-10 00:00:00
end: 2023-12-11 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Vol ST VM", overlay=true)

source = close
hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol = (volume / hilow)
spreadvol = (openclose * vol)
VPT = spreadvol + cum(spreadvol)
window_len = 28

v_len = 14
price_spread = stdev(high-low, window_len)

v =  spreadvol + cum(spreadvol)
smooth = sma(v, v_len)
v_spread = stdev(v - smooth, window_len)
shadow = (v - smooth) / v_spread * price_spread

out = shadow > 0 ? high + shadow : low + shadow
//
src = out
src1=open
src2=low
src3=high
tf =input(720)
len = timeframe.isintraday and timeframe.multiplier >= 1 ? 
   tf / timeframe.multiplier * 7 : 
   timeframe.isintraday and timeframe.multiplier < 60 ? 
   60 / timeframe.multiplier * 24 * 7 : 7

c = ema(src, len)
plot(c,color=color.red)
o = ema(src1,len)
plot(o,color=color.blue)
//h = ema(src3,len)
//l=ema(src2,len)
//
col=c > o? color.lime : color.orange
vis = true
vl = c
ll = o
m1 = plot(vl, color=col, linewidth=1, transp=60)
m2 = plot(vis ? ll : na,  color=col, linewidth=2, transp=80)

fill(m1, m2,  color=col, transp=70)
//

vpt=ema(out,len)

// INPUTS //
st_mult   = input(1,   title = 'SuperTrend Multiplier', minval = 0, maxval = 100, step = 0.01)
st_period = input(10, title = 'SuperTrend Period',     minval = 1)

// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))

up_trend   = 0.0
up_trend   := close[1] > up_trend[1]   ? max(up_lev, up_trend[1])   : up_lev

down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev

// Calculate trend var
trend = 0
trend := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend[1], 1)

// Calculate SuperTrend Line
st_line = trend ==1 ? up_trend : down_trend

// Plotting
plot(st_line[1], color = trend == 1 ? color.green : color.red , style = plot.style_cross, linewidth = 2, title = "SuperTrend")
buy=crossover( close, st_line) and close>o
sell=crossunder(close, st_line) and close<o
//plotshape(crossover( close, st_line), location = location.belowbar, color = color.green,size=size.tiny)
//plotshape(crossunder(close, st_line), location = location.abovebar, color = color.red,size=size.tiny)
plotshape(buy, title="buy", color=color.green, style=shape.arrowup, location=location.belowbar, size=size.normal, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(sell, title="sell", color=color.red, style=shape.arrowdown, location=location.abovebar, size=size.normal, textcolor=color.white, transp=0)  //plot for sell icon


//
multiplier = input(title="TP", type=input.float, defval=2, minval=1)
src5 = close
len5 = input(title="TP length", defval=150, minval=1)
offset = 0

calcSlope(src5, len5) =>
    sumX = 0.0
    sumY = 0.0
    sumXSqr = 0.0
    sumXY = 0.0
    for i = 1 to len5
        val = src5[len5-i]
        per = i + 1.0
        sumX := sumX + per
        sumY := sumY + val
        sumXSqr := sumXSqr + per * per
        sumXY := sumXY + val * per
        
        
    slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX)
    average = sumY / len5
    intercept = average - slope * sumX / len5 + slope
    [slope, average, intercept]

var float tmp = na
[s, a, i] = calcSlope(src5, len5)

vwap1=(i + s * (len5 - offset))
sdev = stdev(close, len5)
dev = multiplier * sdev
top=vwap1+dev
bott=vwap1-dev

//
z1 = vwap1 + dev
x1 = vwap1 - dev

low1 = crossover(close, x1)  
high1 = crossunder(close, z1) 

plotshape(low1, title="low", text="TP", color=color.red, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(high1, title="high", text="TP", color=color.green, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0)  //plot for sell icon



strategy.entry(id="Enter Long MA", long=true, comment="Buy", when=high1)
strategy.entry(id="Short Entry MA", long=false, comment="Sell", when=low1)

/////// Alerts /////
alertcondition(buy,title="buy")
alertcondition(sell,title="sell")
alertcondition(low1,title="sell tp")
alertcondition(high1,title="buy tp")

Plus de