Chiến lược giao dịch định lượng đột phá của dải Bollinger độ lệch chuẩn ba kết hợp với tối ưu hóa đường trung bình động 100 ngày

MA BB SMA SD
Ngày tạo: 2024-12-13 11:20:13 sửa đổi lần cuối: 2024-12-13 11:20:13
sao chép: 3 Số nhấp chuột: 483
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng đột phá của dải Bollinger độ lệch chuẩn ba kết hợp với tối ưu hóa đường trung bình động 100 ngày

Tổng quan

Chiến lược này là một chiến lược giao dịch định lượng dựa trên đợt đột phá của Brin, sử dụng đường lên của 3 lần chênh lệch chuẩn và đường xuống của 1 lần chênh lệch chuẩn, đồng thời kết hợp với đường trung bình di chuyển 100 ngày làm đường trung tâm. Chiến lược này chủ yếu để nắm bắt xu hướng dài hạn bằng cách phát hiện giá phá vỡ đường lên và sử dụng đường xuống như một tín hiệu dừng.

Nguyên tắc chiến lược

Nguyên tắc cốt lõi của chiến lược dựa trên đặc tính thống kê của Brin Belt. 3 lần chênh lệch tiêu chuẩn trên đường đua, có nghĩa là trong giả định phân phối bình thường, xác suất giá vượt qua đường đua chỉ là 0,15%, do đó, khi có sự phá vỡ, thường có xu hướng hình thành.

Lợi thế chiến lược

  1. Khả năng nắm bắt xu hướng mạnh mẽ: Với thiết lập chênh lệch tiêu chuẩn gấp 3 lần, có thể nắm bắt hiệu quả các cơ hội phá vỡ xu hướng quan trọng.
  2. Kiểm soát rủi ro hợp lý: Sử dụng chênh lệch chuẩn gấp 1 lần như là đường dừng lỗ, kiểm soát rủi ro khá thận trọng.
  3. Các tham số có thể điều chỉnh được mạnh mẽ: Khoảng thời gian chênh lệch chuẩn và trung bình di chuyển của đường ray lên xuống có thể được điều chỉnh theo các đặc điểm thị trường khác nhau.
  4. Có hệ thống mạnh mẽ: logic chiến lược rõ ràng, chức năng phản hồi hoàn hảo, có thể thống kê chính xác hiệu suất giao dịch.
  5. Khả năng ứng dụng rộng: có thể được áp dụng cho nhiều lĩnh vực như thị trường chứng khoán và thị trường tiền điện tử.

Rủi ro chiến lược

  1. Rủi ro phá vỡ giả: Thị trường có thể có một sự hồi phục nhanh chóng sau khi phá vỡ ngắn hạn, dẫn đến tín hiệu giả.
  2. Sự rút lui lớn: Sự rút lui lớn có thể xảy ra trong một thị trường biến động mạnh.
  3. Rủi ro về sự chậm trễ: đường trung bình 100 ngày có sự chậm trễ, có thể bỏ lỡ một số hoạt động nhanh chóng.
  4. Tùy thuộc vào môi trường thị trường: có thể xuất nhập thường xuyên trong thị trường bất ổn, gây ra chi phí giao dịch quá mức.

Hướng tối ưu hóa chiến lược

  1. Tiếp tục xác nhận số lượng giao dịch: Có thể thêm cơ chế xác nhận số lượng giao dịch đột phá, tăng độ tin cậy tín hiệu.
  2. Tối ưu hóa cơ chế dừng lỗ: Có thể xem xét giới thiệu dừng theo dõi hoặc dừng động ATR, tăng tính linh hoạt của dừng lỗ.
  3. Thêm bộ lọc xu hướng: Bạn có thể thêm các chỉ số đánh giá xu hướng dài hạn, chỉ giao dịch theo hướng xu hướng chính.
  4. Tối ưu hóa quản lý vị trí: có thể điều chỉnh kích thước vị trí theo động lực của cường độ đột phá.
  5. Thêm bộ lọc thời gian: Tránh giao dịch vào một số thời điểm thị trường cụ thể.

Tóm tắt

Đây là một chiến lược theo dõi xu hướng được thiết kế hợp lý, logic và rõ ràng. Với tính năng theo dõi xu hướng của Brinband và tính năng theo dõi xu hướng của moving average, nó có thể nắm bắt hiệu quả các cơ hội đột phá quan trọng trong thị trường. Mặc dù có một số rủi ro rút lui, nhưng với thiết lập dừng lỗ và kiểm soát rủi ro hợp lý, nó vẫn có giá trị thực tế tốt.

Mã nguồn chiến lược
/*backtest
start: 2024-11-12 00:00:00
end: 2024-12-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © MounirTrades007

// @version=6
strategy("Bollinger Bands", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=200)

// Get user input
var g_bb        = "Bollinger Band Settings"
upperBandSD     = input.float(title="Upper Band Std Dev", defval=3.0, tooltip="Upper band's standard deviation multiplier", group=g_bb)
lowerBandSD     = input.float(title="Lower Band Std Dev", defval=1.0, tooltip="Lower band's standard deviation multiplier", group=g_bb)
maPeriod        = input.int(title="Middle Band MA Length", defval=100, tooltip="Middle band's SMA period length", group=g_bb)
var g_tester    = "Backtester Settings"
drawTester      = input.bool(title="Draw Backtester", defval=true, group=g_tester, tooltip="Turn on/off inbuilt backtester display")

// Get Bollinger Bands
[bbIgnore1, bbHigh, bbIgnore2] = ta.bb(close, maPeriod, upperBandSD)
[bbMid, bbIgnore3, bbLow]      = ta.bb(close, maPeriod, lowerBandSD)

// Prepare trade persistent variables
drawEntry   = false
drawExit    = false

// Detect bollinger breakout
if close > bbHigh and barstate.isconfirmed and strategy.position_size == 0
    drawEntry := true
    strategy.entry(id="Trade", direction=strategy.long)
    alert("Bollinger Breakout Detected for " + syminfo.ticker, alert.freq_once_per_bar_close)

// Detect bollinger sell signal
if close < bbLow and barstate.isconfirmed and strategy.position_size != 0
    drawExit := true
    strategy.close(id="Trade")
    alert("Bollinger Exit detected for " + syminfo.ticker, alert.freq_once_per_bar_close)

// Draw bollinger bands
plot(bbMid, color=color.blue, title="Middle SMA")
plot(bbHigh, color=color.green, title="Upper Band")
plot(bbLow, color=color.red, title="Lower Band")

// Draw signals
plotshape(drawEntry, style=shape.triangleup, color=color.green, location=location.belowbar, size=size.normal, title="Buy Signal")
plotshape(drawExit, style=shape.xcross, color=color.red, location=location.belowbar, size=size.normal, title="Sell Signal")

// // =============================================================================
// // START BACKTEST CODE
// // =============================================================================

// // Prepare stats table
// var table testTable = table.new(position.top_right, 2, 2, border_width=1)
// f_fillCell(_table, _column, _row, _title, _value, _bgcolor, _txtcolor) =>
//     _cellText = _title + "\n" + _value
//     table.cell(_table, _column, _row, _cellText, bgcolor=_bgcolor, text_color=_txtcolor)

// // Draw stats table
// var bgcolor = color.black
// if barstate.islastconfirmedhistory
//     if drawTester
//         dollarReturn = strategy.equity - strategy.initial_capital
//         f_fillCell(testTable, 0, 0, "Total Trades:", str.tostring(strategy.closedtrades), bgcolor, color.white)
//         f_fillCell(testTable, 0, 1, "Win Rate:", str.tostring(strategy.wintrades / strategy.closedtrades * 100, "##.##") + "%", bgcolor, color.white)
//         f_fillCell(testTable, 1, 0, "Equity:", "$" + str.tostring(strategy.equity, "###,###.##"), bgcolor, color.white)
//         f_fillCell(testTable, 1, 1, "Return:", str.tostring((strategy.netprofit / strategy.initial_capital) * 100, "##.##") + "%", dollarReturn > 0 ? color.green : color.red, color.white)

// // =============================================================================
// // END BACKTEST CODE
// // =============================================================================