Volatilität Preiskanal bewegliche durchschnittliche Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-12-12 11:44:15
Tags:

img

Übersicht

Diese Strategie basiert auf dem Super Trend-Indikator und dem Preiskanal-Indikator, kombiniert mit gleitenden Durchschnittssignalen für den Handel.

Strategie Logik

  1. Berechnen Sie den Super Trend-Indikator. Die oberen und unteren Schienen sind der aktuelle Preis plus/minus N mal der ATR-Indikator. Wenn der Preis höher ist als die oberen Schienen, ist er bullisch. Wenn der Preis niedriger ist als die unteren Schienen, ist er bärisch.

  2. Berechnen Sie den Preiskanalindikator. Die Preiskanallinie ist M mal die N-Tage-Standard-Abweichung des Preises. Preise höher/niedriger als die Kanallinie gelten als abnormale Zustände.

  3. Berechnen Sie gleitende Durchschnitte. Nehmen Sie die durchschnittlichen Linien des offenen Preises, des Schlusskurses und des Supertrends.

  4. Erstellen von Handelssignalen:

    • Kaufsignal: Der Schlusskurs überschreitet die Super Trendlinie und liegt über dem gleitenden Durchschnitt des offenen Preises.

    • Verkaufssignal: Der Schlusskurs überschreitet die Super Trendlinie und liegt unter dem gleitenden Durchschnitt des offenen Preises.

  5. Setzen Sie Stop-Loss und Gewinnpreis-Kanal.

Analyse der Vorteile

  1. Die Kombination mehrerer Indikatoren verhindert falsche Signale.

  2. Die Verwendung des Preiskanals zur Beurteilung von abnormalen Preiszuständen kann einige unerwünschte Einstiegspunkte herausfiltern.

  3. Bewegliche Durchschnitte in Kombination mit der Beurteilung der Trendrichtung vermeiden den Handel gegen den Trend.

  4. Die Einstellung von Stop-Loss und Take-Profit-Bereich kontrolliert das Risiko.

Risikoanalyse

  1. Die Parameter-Einstellungen sind zu subjektiv und müssen optimiert werden.

  2. Der Stop-Loss- und Take-Profit-Bereich kann zu breit oder zu eng eingestellt werden.

  3. Die Preiskanalparameter sind möglicherweise nicht für alle Produkte geeignet, daher sind separate Prüfungen erforderlich.

  4. Bei drastischen Trendwechseln können erhebliche Verluste eintreten.

Optimierungsrichtlinien

  1. Test und Optimierung von Parametern, um optimale Kombinationen zu finden.

  2. Test gleitende Durchschnitte mit verschiedenen Perioden, um optimale Parameter auszuwählen.

  3. Backtest auf mehreren Produkten und Auswahl von Parametern je nach Leistung.

  4. Optimieren Sie die Stop-Loss-Strategie, um zu große Einzelverluste zu vermeiden.

Schlussfolgerung

Diese Strategie kombiniert mehrere Indikatoren, um Preisanomalien und Trendrichtungen zu beurteilen, die theoretisch einige falsche Signale herausfiltern können. Allerdings sind die Parameter-Einstellungen immer noch relativ subjektiv und lassen sich optimieren. Darüber hinaus sollten Handelskosten wie Provisionen und Slippage im tatsächlichen Handel berücksichtigt werden. Insgesamt eignet sich diese Strategie besser als Trendfolgestrategie, aber Parameter müssen für verschiedene Produkte optimiert und angepasst werden.


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

Mehr