Doppel gleitender Durchschnitt Bollinger Bands Trend nach Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-01 14:15:11
Tags:

img

Übersicht

Diese Strategie trifft Handelsentscheidungen auf der Grundlage von doppelten gleitenden Durchschnitts Bollinger Bands, um dem Trend zu folgen.

Strategie Logik

Die Strategie gilt sowohl für einfache als auch für erweiterte Bollinger-Bänder.

Einfache Bollinger-Bänder verwenden für den mittleren Band eine SMA der Schlusskurse, während verbesserte Bollinger-Bänder eine EMA der Schluskurse verwenden.

Die oberen und unteren Bands werden anhand der Standardabweichungen des mittleren Bandes ± N berechnet.

Die Strategie beurteilt die Stärke des Trends anhand der Differenz zwischen den oberen und unteren Bands.

Wenn der Preis sich dem unteren Band nähert, verlangt er sich. Wenn der Preis sich dem oberen Band nähert, schließt er die Position. Die Stop-Loss-Methode ist festes Prozent. Trailing-Stop kann auch aktiviert werden.

Die Gewinnspanne hängt vom Schließen in der Nähe des mittleren oder des oberen Bandes ab.

Die Strategie kann sich auch dafür entscheiden, nur mit Gewinn zu verkaufen, um Verluste zu vermeiden.

Analyse der Vorteile

Die Vorteile dieser Strategie:

  1. Doppel Bollinger Bands verbessern die Effizienz

Durch den Vergleich einfacher und erweiterter Bollinger-Bänder kann die bessere Version für höhere Effizienz ausgewählt werden.

  1. Spread beurteilt die Trendstärke

Wenn sich der Spread verengt, zeigt dies einen stärkenden Trend an.

  1. Flexible Gewinnspielzeiten und Stop-Loss

Festprozentualer Stop-Loss kontrolliert Einzelhandelsverluste. Gewinn in der Nähe des mittleren oder oberen Bandes.

  1. Schutzmechanismus gegen Verluste

Nur der Verkauf mit Gewinn verhindert, dass sich der Verlust vergrößert.

Risikoanalyse

Zu den Risiken gehören:

  1. Abzugsrisiko

Der Trend, der sich selbst folgt, birgt Rückzugsrisiken. Sie müssen aufeinanderfolgende Verluste mental ertragen.

  1. Whipsaw-Risiko

Wenn die Bands breit sind, kann sich der Markt seitwärts drehen. Die Strategie ist weniger effektiv. Der Handel muss pausiert werden, bis der Trend wieder aufgenommen wird.

  1. Risikopositionen, für die keine Risikopositionen gelten

Ein festes Stop-Loss-Prozent ist vielleicht zu aggressiv.

Optimierungsrichtlinien

Die Strategie kann folgende Aspekte optimieren:

  1. Bollinger-Band-Parameter

Versuche verschiedene MA-Längen und Standardabweichungsmultiplikatoren, um optimale Kombinationen für verschiedene Märkte zu finden.

  1. Filter hinzufügen

Fügen Sie Filter wie MACD, KD auf das Bollinger-Signal hinzu, um die Trades während der Whipsaw-Märkte zu reduzieren.

  1. Gewinnabhängigkeit und Stop Loss

Test verschiedene Trailing Stop Methoden oder optimiere Stop Loss basierend auf Volatilität, ATR usw.

  1. Geldmanagement

Optimieren Sie die Positionsgröße pro Handel. Testen Sie verschiedene Add-on-Strategien.

Schlussfolgerung

Diese Strategie kombiniert die Stärken von doppelten Bollinger Bands und beurteilt die Trendstärke anhand der Bandbreite und der Handelsrückgänge während der Trends.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 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/
// © JCGMarkets 

//@version=4
strategy("B.Bands | Augmented | Intra-range | Long-Only", shorttitle = "BB|A|IR|L", initial_capital=5000, commission_value=0.075, slippage = 1, overlay = true)

//Technical Indicators Data
show_simp   = input(false, title="Trade on Simple Bollinger Bands ", type= input.bool, group="Select Strategy System")
show_augm   = input(true, title="Trade on Augmented Bollinger Bands", type= input.bool, group="Select Strategy System") 
periods     = input(20, title="Periods for Moving Average", type =input.integer, minval = 2, step = 1, group="Technical Inputs")
std         = input(2, title="Std", type = input.float, minval=0.1 , step = 0.1, group="Technical Inputs")

// Strategy data
max_spread_bb   = input(20000.0, title="Max Spread Tolerance Beetween Bands", type=input.float, step=0.1, group="Strategy Inputs")
entry_source    = input(close, title="Entry data source", type=input.source, group="Strategy Inputs")
exit_source     = input(high, title="Exit data source", type=input.source, group="Strategy Inputs")
take_profit     = input("middle", title = "Profit to band:", options = ["middle", "opposite"], group="Strategy Inputs")
stop_loss       = input(3.00, title="Stop Loss %", type=input.float, step=0.05, group="Strategy Inputs")
trailing        = input(false, title="Activate trailing stop?", type = input.bool, group="Strategy Inputs")
stop_perc       = input(6.00, title="Trailing %", type=input.float, step=0.125, group="Strategy Inputs") * 0.01
sell_profit     = input(false, title="Only sell in profit (Stop Loss still active) ", type= input.bool, group="Strategy Inputs")


var SL = 0.0
var SLT= 0.0


//Simple BB Calculation -> adapt if needed with different std for upper-lower, sma-ema, etc 
middle_sim = sma(close, periods)

//Augmented BB Calculation -> adapt if needed with different std for upper lower, etc
middle_augm  = ema(close, periods)
middle_upp = ema(high, periods)
middle_low = ema(low, periods)

//Multiplier
dev      = stdev(close, periods) * std

//Upper & Lower Bands
upper = (middle_sim + dev)
lower = (middle_sim - dev)

//Augmented Bands
upper_augm = (middle_upp + dev)
lower_augm = (middle_low - dev)

//Bands Spread
spread   = upper - lower
spread_augm   = upper_augm - lower_augm

//From date
filter_from    =   input(  true,    title="===> From", group="Date Control")
from_y         =   input(  2010,    title = "from year", group="Date Control")
from_m         =   input(     1,    title = "from month", minval =1, maxval=12, group="Date Control")
from_d         =   input(     1,    title = "from day",  minval=1, maxval=31, group="Date Control")

//To date
filter_to   =    input( true,   title="===> To", group="Date Control")
to_y        =    input( 2030,   title = "To year", group="Date Control")
to_m        =    input(    1,   title = "To month", minval =1, maxval=12, group="Date Control")
to_d        =    input(    1,  title = "To day",  minval=1, maxval=31, group="Date Control")

// Date Condition
In_date() =>  true

in_position = strategy.position_size > 0 

// Trailing stop 
SLT := if in_position and In_date()
    stop_inicial = entry_source * (1 - stop_perc)
    max(stop_inicial, SLT[1])
else
    0

slts = (low <= SLT) and (trailing == true)


//Essential Trade logics
entry_long = (entry_source <= lower) and (spread < max_spread_bb)
entry_long_augm = (entry_source <= lower_augm) and (spread_augm < max_spread_bb)

// Simple Bollinger Conditions

if (not in_position and show_simp and In_date())
    if entry_long
        // Trigger buy order
        position_size = round( strategy.equity / close ) // All available equity for this strategy example
        strategy.entry("Entry", strategy.long, qty = position_size )
        SL := close * (1 - (stop_loss / 100)) // You could determine wether or not implement stop loss with bool input and if condition here.


if in_position and show_simp and not sell_profit and In_date()
    //Exits if not sell in profit
    if take_profit == "middle" 
        strategy.exit("Target", "Entry", limit = middle_sim, stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry", limit = upper, stop = SL, comment="Exit")    

if in_position and show_simp and sell_profit and In_date()
    //Exits if sell in profit
    if take_profit == "middle" 
        strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? middle_sim: na), stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? upper: na), stop = SL, comment="Exit")    



if in_position and show_simp and slts and In_date()
    //Trailing activation
    strategy.close("Entry", comment="SLT")

if not In_date()
    //Exit due out of date range
    strategy.close("Entry", comment="Out of date range")



// Augmented Bollinger Conditions

if (not in_position and show_augm and In_date()) 
    if entry_long_augm
        // Trigger buy order
        position_size = round( strategy.equity / close )
        strategy.entry("Entry_A", strategy.long, qty = position_size )
        SL := close * (1 - (stop_loss / 100) )

if in_position and show_augm and not sell_profit and In_date()
    //Exits and not sell in profit
    if take_profit == "middle"
        strategy.exit("Target", "Entry_A", limit = middle_augm, stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry_A", limit = upper_augm, stop = SL, comment="Exit")            
        

if in_position and show_augm and sell_profit and In_date() 
    //Exit only in profit
    if take_profit == "middle"
        strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? middle_augm:na), stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? upper_augm: na) , stop = SL, comment="Exit") 


if in_position  and show_augm and slts and In_date()
    //Trigger trailing
    strategy.close("Entry_A", comment="SLT")
    
if not In_date()
    //Out of date trigger
    strategy.close("Entry_A", comment= "Out of date range")




// Plotting

plot(in_position ? SL > 0 ? SL : na : na , style = plot.style_circles, color = color.red, title = "Stop Loss")
plot(in_position ? trailing ? SLT > 0 ? SLT : na : na : na , style = plot.style_circles, color = color.blue, title = "Trailing Stop" )

s = plot(show_simp ? upper : na , color = color.aqua)
plot(show_simp ? middle_sim : na , color=color.red)
i = plot(show_simp ? lower : na , color = color.aqua)
fill(s,i, color=color.new(color.aqua,90))


plot(show_augm ? middle_augm : na , color=color.blue)
s_a = plot( show_augm ? upper_augm : na, color=color.orange)
i_a = plot( show_augm ? lower_augm : na, color= color.orange)
fill(s_a,i_a, color=color.new(color.orange, 90))

Mehr