Chiến lược Bollinger Bands Stop Loss động

Tác giả:ChaoZhang, Ngày: 2024-02-01 10:48:52
Tags:

img

Tổng quan

Chiến lược này sử dụng các đường ray trên và dưới của Bollinger Bands để thực hiện stop loss động. Nó đi ngắn khi giá vượt qua đường ray trên và đi dài khi giá vượt qua đường ray dưới. Và nó đặt stop loss động để theo dõi chuyển động giá.

Nguyên tắc

Cốt lõi của chiến lược này nằm trong các đường ray trên và dưới của Bollinger Bands. Đường ray giữa là đường trung bình động n ngày. Đường ray trên là đường ray giữa + klệch chuẩn n ngày. Đường sắt dưới là đường sắt giữa − kn ngày lệch chuẩn. Khi giá bật lên từ đường ray dưới, đi dài. Khi giá giảm từ đường ray trên, đi ngắn. Đồng thời, chiến lược đặt điểm dừng lỗ và điều chỉnh động trong quá trình chuyển động giá để đặt điểm lấy lợi nhuận để thực hiện kiểm soát rủi ro thận trọng.

Ưu điểm

  1. Sử dụng Bollinger Bands hồi quy mạnh đến đặc điểm đường sắt giữa để nắm bắt xu hướng trung và dài hạn;
  2. Các tín hiệu dài và ngắn rõ ràng, dễ vận hành;
  3. Thiết lập stop loss trượt động để tối đa hóa việc khóa lợi nhuận và kiểm soát rủi ro;
  4. Các tham số có thể điều chỉnh để thích nghi với các điều kiện thị trường khác nhau.

Rủi ro và giải pháp

  1. Bollinger Bands có thể tạo ra nhiều tín hiệu dài và ngắn trong các thị trường giới hạn phạm vi, khiến người dùng bị mắc kẹt trong whipsaws.
  2. Các thiết lập tham số không chính xác có thể dẫn đến tỷ lệ thắng thấp hơn.

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

  1. Tối ưu hóa các thông số trung bình động để thích nghi với các đặc điểm của sản phẩm;
  2. Thêm lọc xu hướng để tránh thị trường giới hạn phạm vi;
  3. Kết hợp với các chỉ số khác như điều kiện lọc để cải thiện tính ổn định của chiến lược.

Kết luận

Chiến lược này sử dụng các thuộc tính hồi quy Bollinger Bands cùng với stop loss trượt động để có được lợi nhuận xu hướng trung và dài hạn trong khi kiểm soát rủi ro. Đây là một chiến lược định lượng rất thích nghi và ổn định. Thông qua tối ưu hóa tham số và tối ưu hóa logic, nó có thể được điều chỉnh cho nhiều sản phẩm hơn và có được lợi nhuận ổn định trong giao dịch trực tiếp.


/*backtest
start: 2024-01-24 00:00:00
end: 2024-01-31 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(shorttitle="BB Strategy", title="Bollinger Bands Strategy", overlay=true)
length = input.int(20, minval=1, group = "Bollinger Bands")
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group = "Bollinger Bands")
src = input(close, title="Source", group = "Bollinger Bands")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev", group = "Bollinger Bands")

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)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500, group = "Bollinger Bands")
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

lo = input.bool(true, "Long", group = "Strategy")
sh = input.bool(true, "Short", group = "Strategy")
x = input.float(3.0, "Target Multiplier (X)", group = "Strategy", minval = 1.0, step = 0.1)
token = input.string(defval = "", title = "Token", group = "AUTOMATION")
Buy_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1) + '"}'
Buy_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2) + '"}'
Exit_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-1) + '"}'
Exit_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-2) + '"}'
Exit_PE_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2.5) + '"}'
Exit_CE_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1.5) + '"}'
long = high < lower
short = low > upper
var sl_b = 0.0
var tar_b = 0.0
var sl_s = 0.0
var tar_s = 0.0
var static_sl = 0.0
entry = strategy.opentrades.entry_price(strategy.opentrades - 1)
if long and lo and strategy.position_size == 0
    strategy.entry("Long", strategy.long, alert_message = Buy_CE, stop = high)
    strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE)
    sl_b := low
    tar_b := high + (math.abs(high - low) * x)
    static_sl := math.abs(low - high)
if short and sh and strategy.position_size == 0
    strategy.entry("Short", strategy.short, alert_message = Buy_PE, stop = low)
    strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE)
    sl_s := high
    tar_s := low - (math.abs(high - low) * x)
    static_sl := math.abs(high - low)
// if long and strategy.position_size < 0
//     strategy.entry("Long", strategy.long, alert_message = Exit_PE_CE, stop = high)
//     strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE)
//     sl_b := low
//     tar_b := high + (math.abs(high - low) * x)
// if short and strategy.position_size > 0
//     strategy.entry("Short", strategy.short, alert_message = Exit_CE_PE, stop = low)
//     strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE)
//     sl_s := math.max(high[1], high)
//     tar_s := low - (math.abs(high - low) * x)
if ta.change(dayofmonth) or (long[1] and not long[2])
    strategy.cancel("Long")
if ta.change(dayofmonth) or (short[1] and not short[2])
    strategy.cancel("Short")
var count = 1
if strategy.position_size != 0
    if strategy.position_size > 0
        if close > (entry + (static_sl * count))
            strategy.exit("LX", "Long", limit = tar_b, stop = sl_b, alert_message = Exit_CE)
            sl_b := entry + (static_sl * (count - 1))
            count += 1
            
    else
        if close < (entry - (static_sl * count))
            strategy.exit("SX", "Short", limit = tar_s, stop = sl_s, alert_message = Exit_PE)
            sl_s := entry - (static_sl * (count - 1))
            count += 1
// label.new(bar_index, high, str.tostring(static_sl))
if strategy.position_size == 0
    count := 1
plot(strategy.position_size > 0 ? sl_b : na, "", color.red, style = plot.style_linebr)
plot(strategy.position_size < 0 ? sl_s : na, "", color.red, style = plot.style_linebr)
plot(strategy.position_size > 0 ? tar_b : na, "", color.green, style = plot.style_linebr)
plot(strategy.position_size < 0 ? tar_s : na, "", color.green, style = plot.style_linebr)

Thêm nữa