Bollinger Band và RSI Trộn với Chiến lược DCA

Tác giả:ChaoZhang, Ngày: 2024-01-18 11:23:15
Tags:

img

Tổng quan

Chiến lược này được đặt tên là Bollinger Band và RSI Mixing with DCA. Nó xây dựng các tín hiệu giao dịch dựa trên các chỉ số Bollinger Band và Chỉ số Sức mạnh Tương đối (RSI) và quản lý rủi ro bằng cách sử dụng trung bình chi phí đô la tiến bộ (DCA). Ý tưởng chính là nắm bắt xu hướng trong thị trường tăng bằng cách sử dụng các chỉ số và giảm chi phí trong thị trường giảm thông qua DCA tiến bộ.

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

Chiến lược này tích hợp các chỉ số Bollinger Band và RSI. Bollinger Band đánh giá rõ xu hướng mà ở trên dải giữa có nghĩa là thị trường tăng và bên dưới có nghĩa là thị trường gấu. RSI chỉ ra tình huống mua quá mức và bán quá mức. Chiến lược xây dựng một chỉ số MIX bằng cách cân nhắc độ lệch của dải Bollinger và giá trị K của RSI. Một tín hiệu dài được tạo ra khi chỉ số MIX vượt qua 20 từ dưới.

Đối với phần DCA tiến bộ, một vị trí ban đầu được mở khi MIX vượt qua 20. Các vị trí bổ sung được thêm vào với một số tiền cố định mỗi khi giá giảm một tỷ lệ phần trăm cố định. Điều này được tiếp tục cho đến khi các vị trí tối đa đạt được hoặc dừng lỗ / lấy lợi nhuận được kích hoạt. Bằng cách thêm các vị trí ở mức thấp nhất của thị trường nhiều lần, chi phí trung bình có thể được giảm dần.

Ưu điểm của Chiến lược

  1. Kết hợp hai chỉ số cải thiện độ chính xác tín hiệu bằng cách đánh giá xu hướng rõ ràng hơn.

  2. DCA tiến bộ làm giảm cơ sở chi phí trong thời gian giảm, làm giảm rủi ro mất mát trong khi tăng phạm vi lợi nhuận.

  3. Lấy lợi nhuận và điều kiện dừng lỗ nhanh chóng kiểm soát rủi ro và khóa trong lợi nhuận một phần.

  4. Bộ lọc phạm vi ngày được thêm vào cho phép kiểm tra ngược tập trung và tối ưu hóa các khoảng thời gian cụ thể.

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

  1. Cả Bollinger Band và RSI đều có thể bị thất bại.

  2. DCA tiến bộ có thể làm tăng lỗ trong các vụ sụp đổ lớn bằng cách liên tục thêm các vị trí.

  3. Các sự kiện thiên nga đen và biến động giá bất thường không thể được dự đoán.

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

  1. Kiểm tra và tối ưu hóa các tham số cho chỉ số MIX để có được các tín hiệu giao dịch chính xác hơn.

  2. Tối ưu hóa stop loss, lấy tham số lợi nhuận cho tỷ lệ lợi nhuận/mất tốt nhất.

  3. Kiểm tra các kích thước và tần số vị trí cộng khác nhau để tìm kết hợp tối ưu.

  4. Xem xét thêm các mô-đun kiểm soát khối lượng giao dịch vào chiến lược mở/khép dựa trên điều kiện khối lượng.

Tóm lại

Bollinger Band và RSI Mixing with DCA Strategy kết hợp nhiều kỹ thuật và phương pháp định lượng. Nó xây dựng một chỉ số đánh giá xu hướng rõ ràng và giảm cơ sở chi phí thông qua các bổ sung dần dần. Các phương pháp kiểm soát rủi ro nghiêm ngặt bao gồm dừng lỗ và lấy lợi nhuận làm cho nó thực tế. Các thử nghiệm và tối ưu hóa thêm có thể mở khóa những lợi thế độc đáo của nó thành một hệ thống giao dịch có lợi nhuận. Với cả việc tìm kiếm lợi nhuận và kiểm soát rủi ro trong tâm trí, nó đáng để xác minh với giao dịch trực tiếp và các ứng dụng.


/*backtest
start: 2023-01-11 00:00:00
end: 2024-01-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © lagobrian23
//@version=4
strategy(title = 'Bollinger Bands and RSI mix with DCA', shorttitle = 'BB/RSI with DCA',pyramiding = 20, calc_on_every_tick = true, overlay = false )
source=close
smoothK = input(3, "K", minval=1)
smoothD = input(3, "D", minval=1)
lengthRSI = input(14, "RSI Length", minval=1)
lengthStoch = input(14, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
rsi1 = rsi(src, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

// Bollinger Band

length = input(20,title = 'BB lookback length', minval=1)
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
BBval = (src - basis)/dev*30+50
offset = input(0, title = "Offset", type = input.integer, minval = -500, maxval = 500)
mix=(d + BBval)/2

//plot
//plot(k, "K", color=#606060)
plot(BBval, "BBval", color=#872323, offset = offset)
plot(d, "D", color=#FF6A00)
h0 = hline(80, "Upper Band", color=#606060)
h1 = hline(20, "Lower Band", color=#606060)
plot(mix, "MIX", color=#888888, linewidth=3)

//background MIX
bgcolor(mix < 20 ? color.green : color.white, transp=50)
bgcolor(mix > 80 ? color.red : color.white, transp=50)

// Choosing the date range
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
toMonth = input(defval = 1,    title = "To Month",      type = input.integer, minval = 1, maxval = 12)
toDay   = input(defval = 1,    title = "To Day",        type = input.integer, minval = 1, maxval = 31)
toYear  = input(defval = 2112, title = "To Year",       type = input.integer, minval = 1970)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(toYear, toMonth, toDay, 23, 59)        // backtest finish window
window()  => true

// Initializing the strategy paraeters

P = input(defval = 1, title = 'Amount (P)' , type = input.integer, minval = 1, maxval = 100)
X = input(defval = 2, title = '% Price drop for consecutive entries(X)', type = input.float, minval = 1, maxval = 100)
B_tp = input(defval = 10, title = '% Level for Take Profit (B)', type = input.float , minval = 1, maxval = 100)
D_sl = input(defval = 10, title = '% Level for Stop Loss (D)', type = input.float, minval = 1, maxval = 100)
A = input(defval = 5, title = 'Max consecutive entries (A)', type = input.integer, minval = 2, maxval = 20)
Z = input(defval = 0.5, title = 'Z', type = input.float , minval = 0, maxval = 10)

// Declaring key DCA variables
entry_price = 0.0
entry_price := na(entry_price[1]) ? na : entry_price[1]
new_entry = 0.0
consec_entryCondition = false
// Implementing the strategy
longEntry = crossover(mix,20)
exitLongs = crossunder(mix, 80)

if(longEntry)
    entry_price := close
    strategy.entry('main_LE', strategy.long , P, when = window() and longEntry)

// Exiting conditions
stoploss = strategy.position_avg_price*(1-(D_sl/100))
takeprofit = strategy.position_avg_price*(1+(B_tp/100))
slCondition = crossunder(close, stoploss)
tpCondition = crossover(close, takeprofit)

// We want to exit if the 'mix' indicator crosses 80, take profit is attained or stop loss is tagged.
exitConditions = exitLongs or slCondition or tpCondition

// Consecutive entries upto A times
// strategy.risk.max_intraday_filled_orders(A)

//Dollar-Cost-Averaging
// Enter long whenever price goes down X%: amount set to (P+Y)*Z
newAmount = (P+X)*Z
// If we haven't reached max open trades, buy newAmount immediately price crosses under X% lower the previous entry price
new_entry := entry_price - ((X/100)*entry_price)
consec_entryCondition := crossunder(close, new_entry)
if(consec_entryCondition and strategy.opentrades != A)
    strategy.entry('consec_LE', strategy.long, newAmount, oca_name = 'consecLongs', when = window() and consec_entryCondition)
    entry_price := close
    
// Exiting
// The main trade is closed only when the  main exit conditions are satisfied
strategy.close('main_LE', comment = 'Main Long Closed', when = window() and exitConditions)

// A consective long is closed only when tp or sl is tagged
strategy.exit('ext a consec', 'consec_LE', loss = D_sl*strategy.position_avg_price , profit = B_tp*strategy.position_avg_price, oca_name =  'consecLongs')


Thêm nữa