Xu hướng hai đường băng Bollinger Moving Average theo chiến lược

Tác giả:ChaoZhang, Ngày: 2023-11-01 14:15:11
Tags:

img

Tổng quan

Chiến lược này đưa ra các quyết định giao dịch dựa trên Bollinger Bands động trung bình kép để theo xu hướng. Nó sử dụng sự hội tụ và phân kỳ của các đường ray trên và dưới của Bollinger Bands để xác định những thay đổi xu hướng, mua gần đường ray dưới và bán gần đường ray trên, để đạt được mua thấp và bán cao.

Chiến lược logic

Chiến lược áp dụng cả Bollinger Band đơn giản và Bollinger Band nâng cao.

Bollinger Band đơn giản sử dụng SMA của giá đóng cho dải giữa, trong khi Bollinger Band được tăng cường sử dụng EMA của giá đóng.

Các dải trên và dải dưới được tính bằng các độ lệch chuẩn dải giữa ± N.

Chiến lược đánh giá sức mạnh của xu hướng dựa trên mức chênh lệch giữa các dải trên và dưới. Khi mức chênh lệch dưới ngưỡng, nó cho thấy sự khởi đầu của một giai đoạn xu hướng để theo xu hướng.

Đặc biệt, khi giá tiếp cận dải dưới, nó kéo dài. Khi giá tiếp cận dải trên, nó đóng vị trí. Phương pháp dừng lỗ là tỷ lệ phần trăm cố định.

Lợi nhuận phụ thuộc vào việc đóng cửa gần dải giữa hoặc dải trên.

Chiến lược cũng có thể chọn chỉ bán với lợi nhuận để ngăn ngừa tổn thất.

Phân tích lợi thế

Những lợi thế của chiến lược này:

  1. Bollinger Bands đôi cải thiện hiệu quả

Bằng cách so sánh Bollinger Bands đơn giản và nâng cao, nó có thể chọn phiên bản tốt hơn cho hiệu quả cao hơn.

  1. Spread đánh giá sức mạnh xu hướng

Khi chênh lệch thu hẹp, nó chỉ ra một xu hướng tăng mạnh.

  1. Lợi nhuận linh hoạt và dừng lỗ

Khoản dừng lỗ tỷ lệ cố định kiểm soát lỗ giao dịch duy nhất. Lợi nhuận gần giữa hoặc dải trên.

  1. Cơ chế bảo vệ chống lại tổn thất

Chỉ bán với lợi nhuận mới ngăn cản tổn thất mở rộng.

Phân tích rủi ro

Các rủi ro bao gồm:

  1. Nguy cơ rút vốn

Xu hướng theo sau chính nó mang lại rủi ro rút tiền. Cần phải chịu đựng những tổn thất liên tiếp về mặt tinh thần.

  1. Rủi ro chọc chích

Khi các dải rộng, thị trường có thể quay sang một bên. Chiến lược ít hiệu quả hơn. Cần tạm dừng giao dịch cho đến khi xu hướng tiếp tục.

  1. Tiêu chí rủi ro

Cần dừng trung bình hơn như dừng ATR.

Hướng dẫn tối ưu hóa

Chiến lược có thể tối ưu hóa:

  1. Các thông số Bollinger Bands

Kiểm tra các chiều dài MA khác nhau, số nhân độ lệch chuẩn để tìm kết hợp tối ưu cho các thị trường khác nhau.

  1. Thêm bộ lọc

Thêm các bộ lọc như MACD, KD trên tín hiệu Bollinger để giảm giao dịch trong các thị trường whipsaw.

  1. Lợi nhuận và dừng lỗ

Kiểm tra các phương pháp dừng lại khác nhau hoặc tối ưu hóa dừng lỗ dựa trên biến động, ATR vv

  1. Quản lý tiền

Tối ưu hóa kích thước vị trí cho mỗi giao dịch. Kiểm tra các chiến lược bổ sung khác nhau.

Kết luận

Chiến lược này kết hợp các điểm mạnh của Bollinger Bands kép, đánh giá sức mạnh xu hướng theo chiều rộng dải và rút lui giao dịch trong xu hướng. Nó cũng thiết lập stop loss thích hợp để kiểm soát rủi ro. Những cải tiến hơn nữa có thể được thực hiện thông qua tối ưu hóa tham số và thêm bộ lọc.


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

Thêm nữa