Bollinger-Bänder und quantitative Handelsstrategie auf Basis von VWAP

Schriftsteller:ChaoZhang, Datum: 2024-01-04
Tags:

img

Übersicht

Diese Strategie kombiniert Bollinger Bands (BB) und Volume Weighted Average Price (VWAP) Indikatoren, um Ein- und Ausstiegsentscheidungen zu treffen.

Strategie Logik

Die Strategie beruht hauptsächlich auf folgenden Ein- und Ausstiegsregeln:

  1. Schnelle EMA-Linie über langsame EMA-Linie als Voraussetzung für die Beurteilung des Trends

  2. Kaufen, wenn der Schlusskurs über dem VWAP liegt, was auf einen Aufwärtstrend hinweist

  3. Eingabe von Long, wenn der Schlusskurs in den letzten 10 Balken unter BB-Unterband gesunken ist, was auf eine Preisanomalie hinweist

  4. Verkaufen, wenn der Schlusskurs über die BB-Obergrenze steigt, die auf eine Preisumkehr hinweist

Insbesondere beurteilt es zuerst, ob die 50-Tage-EMA über der 200-Tage-EMA liegt, um den Gesamttrend zu bestimmen. Dann wird es mit VWAP kombiniert, um zu beurteilen, ob der Preis in einem kurzfristigen Aufwärtstrend ist. Schließlich werden Bollinger-Bänder verwendet, um einen kurzfristigen Anomalieabfall als Einstiegsmöglichkeit zu erkennen.

Die Ausstiegsregel ist einfach: Ausstieg, wenn der Preis über das obere BB-Band steigt, was auf eine Preisumkehr hinweist.

Analyse der Vorteile

Die Strategie kombiniert mehrere Indikatoren, um die Gültigkeit der Eintrittssignale zu erhöhen. Die Verwendung von EMAs zur Beurteilung des Gesamttrends vermeidet den Handel gegen den Trend. VWAP erfasst kurzfristige Aufwärtsdynamik. BB erkennt kurzfristige Anomalien als Timing für Eintritte.

Risikoanalyse

  1. Ungenaue EMA-Trendbeurteilung, die den Handel gegen den Trend verursacht
  2. VWAP ist für stündliche oder intraday-Daten geeigneter, bei täglichen Daten weniger effizient
  3. Falsche Einstellung der BB-Parameter, fehlende Signale in zu breiten oder schmalen Bands

Um die Risiken zu mindern, können die Parameter von EMA und BB angepasst werden. Testen Sie verschiedene Indikatoren zur Trenddetektion. Verwenden Sie VWAP in kürzerem Zeitrahmen. Optimieren Sie den BB-Parameter für die beste Bandbreite.

Möglichkeiten zur Verbesserung

  1. Testen Sie andere Indikatoren zur Trenddetektion wie den MACD
  2. Optimierung der EMA- und BB-Parameter
  3. Hinzufügen eines Stop-Loss-Mechanismus
  4. Fügen Sie Filter hinzu, um falsche Signale zu vermeiden
  5. Backtest für verschiedene Produkte und Zeitrahmen

Schlussfolgerung

Die Strategie kombiniert BB und VWAP, um kurzfristige Preisanomalien als Einstiegszeitpunkt zu erkennen. Die Verwendung von EMAs zur Bestimmung des Gesamttrends vermeidet den Handel gegen den Trend. Es kann schnell kurzfristige Dynamik erkennen. Geeignet für Intraday- und kurzfristigen Handel. Steigert die Stabilität und Rentabilität durch Optimierung von Parametern und Einbeziehung mehr Logik.


/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mohanee

//@version=4
strategy(title="VWAP and BB strategy [EEMANI]", overlay=true,pyramiding=2, default_qty_value=3, default_qty_type=strategy.fixed,    initial_capital=10000, currency=currency.USD)
//This strategy combines VWAP and BB indicators
//BUY RULE
//1. EMA50 > EMA 200
//2. if current close > vwap session  value 
//3. check if  price dipped BB lower band for any of last 10 candles
//EXIT RULE
//1. price closes above BB upper band   
//STOP LOSS EXIT
//1. As configured --- default is set to 5%

is_price_dipped_bb(pds,source1) =>
    t_bbDipped=false
    for i=1 to pds
        t_bbDipped:=  (t_bbDipped   or  close[i]<source1) ? true : false
        if t_bbDipped==true
            break
        else
            continue
            
    t_bbDipped
    
// variables  BEGIN
shortEMA = input(50, title="fast EMA", minval=1)
longEMA = input(200, title="slow EMA", minval=1)

//BB

smaLength = input(20, title="BB SMA Length", minval=1)
bbsrc = input(close, title="BB Source")



//addOnDivergence = input(true,title="Add to existing on Divergence")
//exitOption = input(title="exit on RSI or BB", type=input.string, options=["RSI", "BB"],      defval="BB")

//bbSource = input(title="BB  source", type=input.string, options=["close", "vwap"],      defval="close")
     
//vwap_res = input(title="VWAP Resolution", type=input.resolution, defval="session")
stopLoss = input(title="Stop Loss%", defval=5, minval=1)

//variables  END




longEMAval= ema(close, longEMA)
shortEMAval= ema(close, shortEMA)


vwapVal=vwap(close)



// Drawings

//plot emas
plot(longEMAval, color = color.orange, linewidth = 1, transp=0)
plot(shortEMAval, color = color.green, linewidth = 1, transp=0)


//bollinger calculation 
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(bbsrc, smaLength)
dev = mult * stdev(bbsrc, smaLength)
upperBand = basis + dev
lowerBand = basis - dev
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
//bollinger calculation 

//plot bb
//plot(basis, "Basis", color=#872323, offset = offset)
p1 = plot(upperBand, "Upper", color=color.teal, offset = offset)
p2 = plot(lowerBand, "Lower", color=color.teal, offset = offset)
fill(p1, p2, title = "Background", color=#198787, transp=95)


plot(vwapVal, color = color.purple, linewidth = 1, transp=0)


// Colour background

barcolor(shortEMAval>longEMAval and close<=lowerBand ? color.yellow: na)
  

//longCondition=  shortEMAval > longEMAval and  close>open and  close>vwapVal
longCondition= shortEMAval >= longEMAval  and  close>=vwapVal and close>open  //      close>vwapVal   and   



//Entry
strategy.entry(id="VWAP_BB LE", comment="VB LE" , long=true,  when= longCondition and  is_price_dipped_bb(10,lowerBand) )  //and strategy.position_size<1 

//add to the existing position
//strategy.entry(id="VWAP_RSI LE", comment="VR LE Add" , long=true,  when= addOnDivergence==true and strategy.position_size>=1 and close<strategy.position_avg_price   and (close<lowerBand or  low<lowerBand) and rsiVal>rsi_buy_line)

barcolor(strategy.position_size>=1  ? color.blue: na)



strategy.close(id="VWAP_BB LE", comment="TP Exit VB LE",   when=crossover(close,upperBand) )

//stoploss
stopLossVal =   strategy.position_avg_price * (1-(stopLoss*0.01) )
strategy.close(id="VB LE", comment="SL Exit",   when= close < stopLossVal)



Mehr