Bollinger-Bänder ATR-Rücklauf-Stopp-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-03 11:20:06
Tags:

img

Übersicht

Diese Strategie kombiniert den Bollinger Bands Indikator und den Average True Range (ATR) Indikator, um eine Breakout-Handelsstrategie mit einer Trailing Stop Loss-Funktion zu bilden. Handelssignale werden erzeugt, wenn die Preise durch die Bollinger Bands spezifizierter Standardabweichungen durchbrechen. Gleichzeitig wird der ATR Indikator zur Berechnung von Stop Loss und Gewinngewinn verwendet, um das Risiko / Gewinnverhältnis zu kontrollieren. Darüber hinaus verfügt die Strategie auch über Funktionen wie Zeitfilter und Parameteroptimierung.

Strategie Logik

Schritt 1 Berechnen Sie das mittlere Band, das obere Band und das untere Band. Das mittlere Band ist der einfache gleitende Durchschnitt (SMA) des Preises, und die oberen und unteren Bande sind Multiplikatoren der Preisstandardabweichung. Wenn der Preis aus dem unteren Band nach oben bricht, gehen Sie lang. Wenn der Preis aus dem oberen Band nach unten bricht, gehen Sie kurz.

Schritt 2: Berechnen Sie den ATR-Indikator. Der ATR-Indikator spiegelt die durchschnittliche Preisvolatilität wider. Gemäß dem ATR-Wert legen Sie den Stop-Loss für Long- und Short-Positionen fest. Gleichzeitig setzen Sie die Take-Profit-Position basierend auf dem ATR-Wert, um das Risiko/Rendite-Verhältnis zu kontrollieren.

Schritt 3: Verwenden Sie den Zeitfilter, um nur in einem bestimmten Zeitraum zu handeln, um drastische Schwankungen durch wichtige Nachrichtenereignisse zu vermeiden.

Schritt 4, Trailing-Stop-Mechanismus. Halten Sie den Stop-Loss anhand der letzten ATR-Position anpassen, um mehr Gewinne zu erzielen.

Analyse der Vorteile

  1. Die Bollinger-Bänder selbst spiegeln das Preisgleichgewicht effektiver wider als ein einzelner gleitender Durchschnitt.

  2. ATR-Stop-Loss-Kontrollen für das Risiko-Rendite-Verhältnis jedes Handels;

  3. Trailing Stop wird automatisch anhand der Marktvolatilität angepasst, um Gewinne zu erzielen;

  4. Die zahlreichen Strategieparameter ermöglichen eine hohe Anpassbarkeit.

Risikoanalyse

  1. Bei Konsolidierung des Marktes können mehrere kleine Verluste eintreten;

  2. Fehlgeschlagene Breakout-Umkehrung mit Bollinger-Band-Crossover;

  3. Höhere Risiken im Zusammenhang mit Übernachtungen und wichtigen Nachrichtenereignissen.

Gegenmaßnahmen:

  1. Strenge Einhaltung der Grundsätze des Risikomanagements und Kontrolle der Verluste pro Handel;
  2. Optimierung der Parameter zur Verbesserung der Gewinnrate;
  3. Zeitfilter anwenden, um Risikoperioden zu vermeiden.

Optimierungsrichtlinien

  1. Versuche verschiedene Parameterkombinationen;
  2. Hinzufügen eines Zeitindikators wie OBV;
  3. Einbeziehung eines Modells für maschinelles Lernen.

Schlussfolgerung

Diese Strategie kombiniert Bollinger-Bänder zur Bestimmung des Trendgleichgewichts und der Breakout-Richtungen, ATR zur Berechnung von Stop-Loss und Take-Profit, um das Risiko/Reward-Verhältnis zu kontrollieren, und Trailing-Stop, um Gewinne zu erzielen. Seine Vorteile liegen in der hohen Anpassbarkeit, kontrollierbaren Risiken und der Eignung für den kurzfristigen Intraday-Handel. Weitere Verbesserungen der Gewinnrate und der Rentabilität können durch Parameteroptimierung und maschinelles Lernen erreicht werden.


/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 1m
basePeriod: 1m
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/
// © sadeq_haddadi

//@version=5

strategy('Bollinger Bands + ATR / trail- V2', overlay=true ) // Interactive Brokers rate)



//date and time
startDate   = input(title="Start Date", defval=timestamp("01 Aug 2023 00:00 +0000"), tooltip="Date & time to begin analysis",group = 'Time Filter')
endDate     = input(title="End Date", defval=timestamp("1 Jan 2099 00:00 +0000"), tooltip="Date & time to stop analysis")
timeSession = input(title="Time Session To Analyze", defval="0300-1700", tooltip="Time session to analyze")
inSession(sess) => true

// indicators 

length = input.int(20, minval=1,group = 'Bollinger Band')
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
src = input(close, title="Source")
mult1 = input.float(2.0, minval=0.001, maxval=50, title="StdDev1")
mult2 = input.float(3.0, minval=0.001, maxval=50, title="StdDev2")

ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

basis = ma(src, length, maType)
dev1 = mult1 * ta.stdev(src, length)
dev2 = mult2 * ta.stdev(src, length)
upper1 = basis + dev1
lower1 = basis - dev1
upper2 = basis + dev2
lower2 = basis - dev2
offset = input.int(0, "Offset", minval = -500, maxval = 500)
plot(basis, "Basis", color=#2962FF, offset = offset,linewidth=2)
p1 = plot(upper1, "Upper", color=color.new(color.white,50), offset = offset,linewidth=2)
p2 = plot(lower1, "Lower", color=color.new(color.white,50), offset = offset,linewidth=2)
p3 = plot(upper2, "Upper", color=color.new(color.white,80), offset = offset,linewidth=1)
p4 = plot(lower2, "Lower", color=color.new(color.white,80), offset = offset,linewidth=1)

fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
fill(p3, p4, title = "Background", color=color.rgb(33, 150, 243, 95))

show_crosses = input(false, "Show Cross the Bands?")

plotshape(show_crosses and ta.crossover(close, upper2)  ? src : na, "S", style = shape.triangledown, location =location.abovebar, color = color.yellow, size = size.tiny)
plotshape(show_crosses and ta.crossunder(low, lower2) ? src : na ,"L", style = shape.triangleup, location =  location.belowbar, color = color.purple, size = size.tiny)

second_entry = input(true, "Show second deviation entry point?")

//atr

length_ATR = input.int(title="Length", defval=5, minval=1,group = 'ATR')
smoothing = input.string(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
m = input.float(1, "Multiplier")
src1 = input(high)
src2 = input(low)
pline = input.bool(title = 'show ATR lines ?', defval=false)



ma_function(source, length_ATR) =>
	if smoothing == "RMA"
		ta.rma(source, length_ATR)
	else
		if smoothing == "SMA"
			ta.sma(source, length_ATR)
		else
			if smoothing == "EMA"
				ta.ema(source, length_ATR)
			else
				ta.wma(source, length_ATR)
				
a = ma_function(ta.tr(true), length_ATR) * m
x = ma_function(ta.tr(true), length_ATR) * m + src1
x2 = src2 - ma_function(ta.tr(true), length_ATR) * m

PP1 = plot(pline ? x :na , title = "ATR Short Stop Loss", color= color.new(color.red,20) )
PP2 = plot(pline ? x2:na , title = "ATR Long Stop Loss",  color=color.new(color.green,20) )

Tp_to_Sl = input.float(1.5, "TP/SL")
candle_size =  input.float(10, "candle/pip")
distance_source =  input.float(1.5, "distance to midline/pip")
//strategy

buyCondition = low[2] < lower1 and  ta.crossover(close[1], lower1)  and strategy.position_size == 0 and (close[1] - open[1]) < candle_size * 0.0001 and close > open and ( basis - close) > distance_source * 0.0001

sellCondition = high[2] > upper1 and ta.crossunder(close[1], upper1)  and strategy.position_size == 0 and (open[1] - close[1]) < candle_size * 0.0001 and close < open  and (close - basis) > distance_source * 0.0001
//
buyCondition2 = low[2] < lower2 and  ta.crossover(close[1], lower2)  and (close[1] - open[1]) < candle_size * 0.0001 and close > open and ( basis - close) > distance_source * 0.0001
sellCondition2 = high[2] > upper2 and ta.crossunder(close[1], upper2)   and (open[1] - close[1]) < candle_size * 0.0001 and close < open  and (close - basis) > distance_source * 0.0001

plotshape(second_entry and  sellCondition2 ? src : na, "S", style = shape.triangledown, location =location.abovebar, color = color.rgb(241, 153, 177), size = size.tiny)
plotshape(second_entry and buyCondition2 ? src : na ,"L", style = shape.triangleup, location =  location.belowbar, color = color.rgb(177, 230, 168), size = size.tiny)
//
since_buy  =ta.barssince(buyCondition)
since_sell =ta.barssince(sellCondition)
entry_price = ta.valuewhen(buyCondition or sellCondition, src, 0)

sl_long = ta.valuewhen(buyCondition, x2[1], 0)
sl_short = ta.valuewhen(sellCondition, x[1], 0)
buyprofit = entry_price + (Tp_to_Sl*( entry_price - sl_long))
sellprofit= entry_price + (Tp_to_Sl*( entry_price - sl_short))

//alert_massage = "new strategy position is {{strategy.position_size}}"
//prof = ta.crossover(high,upper1)
//buyexit=ta.valuewhen(prof,upper1,0)

if buyCondition and inSession(timeSession)

    strategy.entry( id = "long", direction = strategy.long , alert_message='Open Long Position' )

if sellCondition and inSession(timeSession)
   
    strategy.entry(id= "short", direction = strategy.short, alert_message='Open Short Position')

//trail-stop loss
use_trailing = input.bool(title = 'use trailing stop loss?', defval=true)
pricestop_long=0.00
pricestop_short=100000.00
if (strategy.position_size > 0)
   
    if use_trailing == false
        pricestop_long := sl_long
    else
        pricestop_long := math.max (x2, pricestop_long[1]) //trail - long

if (strategy.position_size < 0)
   
    if use_trailing == false
        pricestop_short := sl_short
    else
        pricestop_short := math.min (x, pricestop_short[1])  // trail - short 

if strategy.position_size > 0 
   
    strategy.exit(id = 'close', limit =  buyprofit , stop = pricestop_long  )

if strategy.position_size < 0 

    strategy.exit(id = 'close', limit = sellprofit  , stop = pricestop_short  )

alertcondition(buyCondition or sellCondition, 'Enter_position')



Mehr