Trend Bollinger Bands Rata-rata Bergerak Ganda Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2023-11-01 14:15:11
Tag:

img

Gambaran umum

Strategi ini membuat keputusan perdagangan berdasarkan Bollinger Bands rata-rata bergerak ganda untuk mengikuti tren. Ini menggunakan konvergensi dan divergensi rel atas dan bawah Bollinger Bands untuk menentukan perubahan tren, membeli di dekat rel bawah dan menjual di dekat rel atas, untuk mencapai membeli rendah dan menjual tinggi.

Logika Strategi

Strategi ini berlaku untuk Bollinger Bands sederhana dan Bollinger Bands yang ditingkatkan.

Bollinger Bands sederhana menggunakan SMA harga penutupan untuk band tengah, sedangkan Bollinger Bands yang ditingkatkan menggunakan EMA harga penutupan.

Band atas dan bawah dihitung dengan band tengah ± N standar deviasi.

Strategi ini menilai kekuatan tren berdasarkan spread antara band atas dan bawah.

Secara khusus, ketika harga mendekati band bawah, itu panjang. Ketika harga mendekati band atas, itu menutup posisi. Metode stop loss adalah persentase tetap. Trailing stop juga dapat diaktifkan.

Ambil keuntungan tergantung pada penutupan di dekat band tengah atau band atas.

Strategi juga dapat memilih untuk hanya menjual dengan keuntungan untuk mencegah kerugian.

Analisis Keuntungan

Keuntungan dari strategi ini:

  1. Band Bollinger ganda meningkatkan efisiensi

Dengan membandingkan Bollinger Bands sederhana dan ditingkatkan, dapat memilih versi yang lebih baik untuk efisiensi yang lebih tinggi.

  1. Spread menilai kekuatan tren

Ketika spread menyempit, itu menunjukkan tren penguatan.

  1. Pengambilan keuntungan dan stop loss yang fleksibel

Stop loss persentase tetap mengontrol kerugian perdagangan tunggal. mengambil keuntungan di dekat band tengah atau atas. penguncian stop trailing dalam lebih banyak keuntungan.

  1. Mekanisme perlindungan terhadap kerugian

Hanya menjual dengan keuntungan mencegah kerugian dari memperluas.

Analisis Risiko

Risiko termasuk:

  1. Risiko penarikan

Tren yang mengikuti dirinya membawa risiko penarikan.

  1. Risiko Whipsaw

Ketika band lebar, pasar mungkin berbalik ke samping. Strategi kurang efektif. Perlu menunda perdagangan sampai tren dilanjutkan.

  1. Risiko yang diaktifkan oleh stop loss

Stop loss persentase tetap mungkin terlalu agresif.

Arahan Optimasi

Strategi dapat dioptimalkan pada:

  1. Parameter Bollinger Bands

Uji panjang MA yang berbeda, kelipatan standar deviasi untuk menemukan kombinasi optimal untuk pasar yang berbeda.

  1. Tambahkan filter

Tambahkan filter seperti MACD, KD di atas sinyal Bollinger untuk mengurangi perdagangan selama pasar whipsaw.

  1. Mengambil keuntungan dan stop loss

Uji metode stop trailing yang berbeda. atau optimalkan stop loss berdasarkan volatilitas, ATR dll.

  1. Manajemen uang

Mengoptimalkan ukuran posisi per perdagangan. Uji strategi tambahan yang berbeda.

Kesimpulan

Strategi ini menggabungkan kekuatan Bollinger Bands ganda, menilai kekuatan tren dengan lebar band dan penarikan perdagangan selama tren.


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

Lebih banyak