Volatilitäts-Preiskanal - gleitender Durchschnitt - Handelsstrategie


Erstellungsdatum: 2023-12-12 11:44:15 zuletzt geändert: 2023-12-12 11:44:15
Kopie: 0 Klicks: 552
1
konzentrieren Sie sich auf
1621
Anhänger

Volatilitäts-Preiskanal - gleitender Durchschnitt - Handelsstrategie

Überblick

Die Strategie basiert auf einem Supertrend- und einem Preiskanal-Indikator, der in Kombination mit einem Gleichgewichtssignal gehandelt wird. Die Kernidee besteht darin, den Preiskanal zu nutzen, um zu beurteilen, ob der aktuelle Preis in einem außergewöhnlichen Zustand ist, den Supertrend, um die Richtung des aktuellen Trends zu bestimmen und ein Handelssignal mit einer Kombination von Gleichgewichtssignalen zu erzeugen.

Strategieprinzip

  1. Berechnen Sie einen Supertrend-Indikator. Die Oberbahn und die Unterbahn sind N-fache des aktuellen Preises plus/minus den ATR-Indikator. Wenn der Preis über der Oberbahn liegt, ist er bullish, wenn der Preis unter der Unterbahn liegt, ist er bearish.

  2. Berechnen Sie den Preiskanalindikator. Die Preiskanallinie ist das M-fache der N-Tage-Standarddifferenz des Preises. Preise, die über/unter der Kanallinie liegen, werden als Ausnahmezustand betrachtet.

  3. Berechnen Sie die Durchschnittslinie. Nehmen Sie den Durchschnitt der Eröffnung, der Schließung und des Supertrends.

  4. Das sind die wichtigsten Faktoren, die uns helfen können.

    • Kaufsignal: Überschreitung der Supertrendlinie am Ende und über der Durchschnittslinie am Anfang

    • Verkaufssignal: Unterhalb der Supertrendlinie unterhalb des Schlusskurses und unterhalb der Durchschnittslinie des Eröffnungskurses

  5. Setzen Sie einen Stop-Loss-Preiskanal.

Strategische Stärkenanalyse

  1. Es gibt mehrere Indikatoren, um falsche Signale zu vermeiden.

  2. Die Preiskanäle werden verwendet, um die außergewöhnlichen Preisverhältnisse zu ermitteln und unerwünschte Einstiegspunkte zu filtern.

  3. Die Linie wird in Kombination mit der Trendrichtung beurteilt, um eine Gegenoperation zu vermeiden.

  4. Setzen Sie eine Stop-Loss-Stop-Range, um das Risiko zu kontrollieren.

Risikoanalyse

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

  2. Der Schadensbegrenzungsbereich ist möglicherweise zu klein eingestellt.

  3. Die Preiskanalparameter sind möglicherweise nicht für alle Sorten geeignet und müssen für verschiedene Sorten getestet werden.

  4. Bei einem starken Trendwechsel kann es zu größeren Verlusten kommen.

Optimierungsrichtung

  1. Testoptimierung der Parameter, um die optimale Parameterkombination zu finden

  2. Verschiedene Durchschnittsphasen werden getestet, um die optimalen Parameter auszuwählen.

  3. Es werden mehrere Sorten getestet, wobei die Parameter je nach Leistung ausgewählt werden.

  4. Optimierung der Stop-Loss-Strategie, um zu vermeiden, dass ein einziger Verlust zu groß ist.

Zusammenfassen

Diese Strategie umfasst verschiedene Indikatoren, die Preisanomalien und Trendrichtung bestimmen. Theoretisch können bestimmte Falschsignale gefiltert werden. Die Parameter-Einstellungen sind jedoch relativ subjektiv und lassen sich optimieren. Darüber hinaus müssen die Auswirkungen von Transaktionskosten wie Gebühren, Gleitpunkte usw. in der konkreten Realität berücksichtigt werden.

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