Bollinger Bands Prozentuale Handelsstrategie


Erstellungsdatum: 2023-12-11 11:14:53 zuletzt geändert: 2023-12-11 11:14:53
Kopie: 0 Klicks: 750
1
konzentrieren Sie sich auf
1621
Anhänger

Bollinger Bands Prozentuale Handelsstrategie

Überblick

Die Strategie basiert auf dem Brin-Band-Indikator, kombiniert mit einem Moving Average und einem ATR-Technik-Indikator, um ein kurzperiodiges Breakout-System zu realisieren. Die Strategie ermittelt überkaufliche und überverkaufliche Preise durch Berechnung des relativen Positionsanteils der Preise innerhalb des Brin-Band-Kanals, um ein Handelssignal zu erzeugen, kombiniert mit einem neuen Breakout des Hoch-Low-Punkts.

Strategieprinzip

  1. Berechnung der Brinkennetz-Strecke und des Anteils der Preise an der relative Position innerhalb der Strecke
  2. Der Moving Average wird für den Eröffnungspreis, den Schlusspreis, den Höchstpreis und den Tiefpreis berechnet.
  3. Berechnung der ATR-Indikatoren in Verbindung mit der Einstellung einer Stop-Line
  4. Beurteilen Sie, ob der Preis in der Nähe eines neuen Höchst- oder Tiefstwerts ist
  5. Der Jahreshoch- und -Tiefstpreis wird in Kombination mit dem Preis für die größeren Ebenen verwendet.
  6. Beurteilen Sie, ob ein Handelssignal über die Brin-Band-Prozentsatzänderungen und neue Höhen und Tiefen gesendet wird

Die Strategie nutzt die Bollinger Bands, um die Marktfluktuation zu bestimmen. Die Breite der Bollinger Bands wird durch die Standarddifferenz bestimmt. Der Preis ist ein Kaufpunkt, wenn er von der Bollinger Band abgeht, und der Preis ist ein Verkaufspunkt, wenn er von der Bollinger Band aufgeht.

Strategische Vorteile

  1. Strenge Brin-Band-Gate-Break-Beurteilung reduziert Falschsignale
  2. Der Moving Average gleicht die Preise und erkennt die wahren Trends
  3. ATR-Indikator dynamischer Tracking-Stopp, der einzelne Verluste einschränkt
  4. Neue Höhen und Tiefen sowie jährliche Hoch- und Tiefurteile machen die Signale zuverlässiger
  5. Mehrfache Technik-Indikatoren für eine effizientere Strategie

Strategische Risiken und Lösungen

  1. Die falsche Einstellung der Brin-Band-Gateway-Parameter kann zu zu vielen False-Breakings führen. Verschiedene Parameterkombinationen sollten für optimale Ergebnisse getestet werden.
  2. Der Prozentsatz der höchsten und niedrigsten Preise, die mit einer größeren Bandbreite berechnet werden können, wenn der Schlusskurs als Referenzlinie einen Rückzug über die von ATR festgelegte Stop-Loss-Marge erreicht.
  3. Eine strenge Brin-Filterung kann eine Trendchance auf einer längeren Linie verpassen, wobei Filterbedingungen und Haltedauer entsprechend gelockert werden sollten.
  4. ATR-Indikatoren sind langsamer, um starke Preisschwankungen zu verfolgen, und sollten höherfrequente Schwankungen berücksichtigen, wie z. B. die tatsächliche Breite
  5. Neue Höhen und Neue Tiefen sind von kurzfristigen Geräuschen beeinträchtigt, wobei die statistische Signifikanz und die Nachhaltigkeit der Trends zu bewerten sind.

Richtung der Strategieoptimierung

  1. Verschiedene Kombinationen von Parametern werden getestet, um die optimalen Brin-Band-Parameter und die Länge der Moving Averages zu ermitteln
  2. Modellkombinationen in Kombination mit verschiedenen Brin-Band-Parametern oder Moving Averages
  3. Tests für die Anpassung an die Parameter für verschiedene Zeiträume und Sorten, um die Robustheit zu verbessern
  4. Kombination mit weiteren großer Ebenen, wie z. B. Sonnenstrahl-Ebenen, Brin-Band-Signale oder saisonalen Faktoren
  5. Beurteilung von Trendfollowing-Möglichkeiten zur Erweiterung der Strategie und des Gewinnraums

Zusammenfassen

Die Strategie kombiniert mehrere technische Instrumente wie Brin-Band-Prozentsätze, Moving Averages, ATR-Indikatoren, Neues Hoch, Neues Tief und Jahreshoch-Tief, um eine relativ strenge und effiziente Breakout-Handelsstrategie in kurzen Perioden zu erstellen. Ihr herausragender Vorteil besteht darin, verschiedene Arten von Instrumenten zu nutzen, um den Lärm zu reduzieren und echte Trendsignale zu erkennen.

Strategiequellcode
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Bollinger %B Candles Strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

BBLength = input(100, minval=1, step=1)
StdDev = 10
useMovingAverage = input(true)
MAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
lookbackPeriod = input(22, minval=10, step=10)
colorByPreviousClose = input(true)

AtrMAType = input(title="Moving Average Type", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(10)
AtrMult = input(4)
wicks = input(false)

considerYearlyHighLow = input(false)
considerNewLongTermHighLows = input(false)
shortHighLowPeriod = 100
longHighLowPeriod = 200
tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])

backtestYears = input(10, minval=1, step=1)


//////////////////////////////////// Calculate new high low condition //////////////////////////////////////////////////
f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=>
    newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows
    newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows
    [newHigh,newLow]

//////////////////////////////////// Calculate Yearly High Low //////////////////////////////////////////////////
f_getYearlyHighLowCondition(considerYearlyHighLow)=>
    yhigh = security(syminfo.tickerid, '12M', high[1]) 
    ylow = security(syminfo.tickerid, '12M', low[1]) 
    yhighlast = yhigh[365]
    ylowlast = ylow[365]
    yhighllast = yhigh[2 * 365]
    ylowllast = ylow[2 * 365]
    
    yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast))
    yearlyHighCondition = (  (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow
    yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast))
    yearlyLowCondition = (  (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow
    
    label_x = time+(60*60*24*1000*1)
    [yearlyHighCondition,yearlyLowCondition]

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

inDateRange = true
[yearlyHighCondition,yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow)
[newHighS,newLowS] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)
[middleclose, upperclose, lowerclose] = bb(close, BBLength, StdDev)
[middleopen, upperopen, loweropen] = bb(open, BBLength, StdDev)
[middlehigh, upperhigh, lowerhigh] = bb(high, BBLength, StdDev)
[middlelow, upperlow, lowerlow] = bb(low, BBLength, StdDev)

percentBClose = (close - lowerclose)*100/(upperclose-lowerclose)
percentBOpen = (open - loweropen)*100/(upperopen-loweropen)
percentBHigh = (high - lowerhigh)*100/(upperhigh-lowerhigh)
percentBLow = (low - lowerlow)*100/(upperlow-lowerlow)

percentBMAClose = f_getMovingAverage(percentBClose, MAType, lookbackPeriod)
percentBMAOpen = f_getMovingAverage(percentBOpen, MAType, lookbackPeriod)
percentBMAHigh = f_getMovingAverage(percentBHigh, MAType, lookbackPeriod)
percentBMALow = f_getMovingAverage(percentBLow, MAType, lookbackPeriod)

newOpen = useMovingAverage? percentBMAOpen : percentBOpen
newClose = useMovingAverage? percentBMAClose : percentBClose
newHigh = useMovingAverage? percentBMAHigh : percentBHigh
newLow = useMovingAverage? percentBMALow : percentBLow

truerange = max(newHigh, newClose[1]) - min(newLow, newClose[1])

averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
atr = averagetruerange * AtrMult

longStop = newClose - atr
longStopPrev = nz(longStop[1], longStop)
longStop := (wicks ? newLow[1] : newClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = newClose + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := (wicks ? newHigh[1] : newClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and (wicks ? newHigh : newClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? newLow : newClose) < longStopPrev ? -1 : dir

trailingStop = dir == 1? longStop : shortStop

candleColor = colorByPreviousClose ?
                 (newClose[1] < newClose ? color.green : newClose[1] > newClose ? color.red : color.silver) : 
                 (newOpen < newClose ? color.green : newOpen > newClose ? color.red : color.silver)
plotcandle(newOpen, newHigh, newLow, newClose, title='PercentBCandle', color = candleColor, wickcolor=candleColor)
plot(trailingStop, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= dir == 1 ? color.green : color.red)

buyCondition = dir==1 and yearlyHighCondition and newHighS
exitBuyCondition = dir == -1
sellCondition = dir == -1 and yearlyLowCondition and newLowS
exitSellCondition = dir == 1
strategy.risk.allow_entry_in(tradeDirection)

barcolor(buyCondition? color.lime : sellCondition ? color.orange : color.silver)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=exitBuyCondition)

strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca_sell")
strategy.close("Sell", when=exitSellCondition)