Chiến lược dừng lỗ động của Bollinger Band


Ngày tạo: 2024-02-01 10:48:52 sửa đổi lần cuối: 2024-02-01 10:48:52
sao chép: 0 Số nhấp chuột: 682
1
tập trung vào
1617
Người theo dõi

Chiến lược dừng lỗ động của Bollinger Band

Tổng quan

Chiến lược này sử dụng đường đua lên xuống của vòng Brin để thực hiện dừng động. Khi giá phá vỡ đường đua trên vòng Brin, hãy làm trống, khi phá vỡ đường đua dưới, và thiết lập dừng động để theo dõi hoạt động của giá.

Nguyên tắc

Cốt lõi của chiến lược này nằm ở đường ray trên và dưới của dải Brin. Đường ray trung tâm của dải Brin là trung bình di chuyển n ngày, đường ray trên là đường ray trung tâm + k*N ngày sai tiêu chuẩn, đường ray dưới là đường ray trung tâm -k*Khi giá từ đường ray dưới bật lên, làm nhiều hơn; Khi giá từ đường ray trên đi xuống, làm trống. Đồng thời, chiến lược thiết lập điểm dừng lỗ, trong quá trình hoạt động của giá, động thái điều chỉnh điểm dừng lỗ, và thiết lập điểm dừng, để kiểm soát rủi ro thận trọng.

Ưu điểm

  1. Sử dụng đặc tính trung tâm hồi phục mạnh mẽ của các dải Brin để nắm bắt xu hướng đường dài trung bình;
  2. Có thể sử dụng các thiết bị khác để tạo ra các tín hiệu không khí rõ ràng và dễ dàng sử dụng.
  3. Thiết lập điểm dừng lỗ động, khóa lợi nhuận tối đa, kiểm soát rủi ro;
  4. Có thể điều chỉnh theo các tham số của thị trường để thích ứng với các tình huống khác nhau.

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

  1. Brin có thể có nhiều tín hiệu tháo lỗ trong các trường hợp chấn động, dễ bị đặt. Giải pháp là thiết lập mức dừng lỗ hợp lý, kiểm soát tổn thất đơn lẻ.
  2. Thiết lập tham số không đúng cách có thể dẫn đến giảm tỷ lệ thắng. Giải pháp là tối ưu hóa tham số hợp lý theo các giống khác nhau.

Hướng tối ưu hóa

  1. Tối ưu hóa các tham số trung bình di chuyển để phù hợp với đặc điểm của giống;
  2. Các nhà phân tích cho biết, các nhà phân tích cho rằng, sự thay đổi này có thể xảy ra trong một thời gian ngắn.
  3. Kết hợp các chỉ số khác làm điều kiện lọc để tăng sự ổn định của chiến lược.

Tóm tắt

Chiến lược này sử dụng thuộc tính hồi phục của Brin Belt, kết hợp với lỗ hổng trượt động, để có được lợi nhuận theo xu hướng đường dài trung bình với giả định kiểm soát rủi ro, là một chiến lược định lượng có khả năng thích ứng và ổn định cao. Bằng cách tối ưu hóa tham số và tối ưu hóa quy tắc, có thể thích ứng với nhiều giống hơn để có được thu nhập ổn định trong thị trường thực.

Mã nguồn chiến lược
/*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)