Chiến lược DCA tiến bộ dựa trên các chỉ báo Bollinger Bands và RSI


Ngày tạo: 2024-01-18 11:23:15 sửa đổi lần cuối: 2024-01-18 11:23:15
sao chép: 2 Số nhấp chuột: 941
1
tập trung vào
1617
Người theo dõi

Chiến lược DCA tiến bộ dựa trên các chỉ báo Bollinger Bands và RSI

Tổng quan

Chiến lược này được gọi là chiến lược DCA cấp tiến hai chỉ số. Nó xây dựng tín hiệu giao dịch dựa trên hai chỉ số là kênh Brinh và chỉ số cường độ tương đối (RSI), đồng thời sử dụng phương pháp gia tăng dần để quản lý rủi ro. Ý tưởng chính của nó là nắm bắt xu hướng trong thị trường bò, sử dụng các chỉ số để xây dựng tín hiệu đa đầu; và sử dụng chiến lược DCA cấp tiến để giảm chi phí khi giảm.

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

Chiến lược này kết hợp cả hai chỉ số của kênh Brin và RSI. Cổng Brin có thể xác định rõ xu hướng thị trường, đường trung tâm của Brin ở trên là thị trường bò và ở dưới là thị trường gấu. Chỉ số RSI xác định hiện tượng bán tháo quá mức. Chiến lược xây dựng một chỉ số MIX, nó tạo ra chênh lệch giá của kênh Brin và giá trị K của RSI với giá trị trung bình.

Phần DCA dần dần, đầu tiên mở lệnh đầu tiên khi chỉ số MIX vượt qua 20. Sau đó, mỗi khi giá giảm một mức độ nhất định, hãy thêm vị trí theo một số tiền nhất định. Cho đến khi đạt được số lượng giữ vị trí tối đa hoặc thoát khỏi điểm dừng lỗ. Như vậy, bạn có thể tăng vị trí nhiều lần ở mức thấp của thị trường, để đạt được sự giảm giá bình quân chi phí.

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

  1. Các chỉ số kép kết hợp với xu hướng phán đoán rõ ràng, tăng độ chính xác của tín hiệu.

  2. Chiến lược DCA cấp tiến có thể làm giảm chi phí vị trí trong thời gian giảm giá, giảm rủi ro thua lỗ.

  3. Cài đặt các điều kiện dừng lỗ và ngăn chặn, có thể dừng lỗ kịp thời, kiểm soát rủi ro và đảm bảo một phần lợi nhuận.

  4. Thêm tham số phạm vi ngày mở kho để kiểm tra và tối ưu hóa cho chu kỳ thời gian cụ thể.

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

  1. Cả đường Boolean và chỉ số RSI đều có thể bị hỏng. Bạn có thể thử nghiệm các tổ hợp tham số khác nhau để tìm vị trí tốt nhất.

  2. DCA dần dần có thể tiếp tục thêm vị trí trong tình huống giảm giá lớn dẫn đến tổn thất lớn hơn. Bạn có thể đặt số lần gia tăng tối đa và nâng cao mức độ kiểm soát rủi ro của đường dừng lỗ một cách thích hợp.

  3. Không thể ngăn chặn các sự kiện bất thường. Các chỉ số lớn có thể được thêm vào để đánh giá rủi ro hệ thống, tránh các giai đoạn bất thường.

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

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

  2. Tối ưu hóa các tham số dừng lỗ để tối đa hóa tỷ lệ lỗ.

  3. Kiểm tra mức độ và số lần mở thêm các vị trí khác nhau để tìm kiếm sự kết hợp tốt nhất.

  4. Có thể xem xét thêm mô-đun kiểm soát khối lượng giao dịch để mở hoặc tắt chiến lược trong điều kiện khối lượng giao dịch cụ thể.

Tóm tắt

Phương pháp DCA tiến bộ hai chỉ số sử dụng nhiều chỉ số và phương pháp kỹ thuật định lượng. Nó xây dựng các chỉ số đánh giá xu hướng rõ ràng và sử dụng việc gia tăng dần chi phí để giảm. Đồng thời, các biện pháp kiểm soát rủi ro và ngăn chặn lỗ hổng nghiêm ngặt làm cho nó có thể được thực hiện an toàn. Bằng cách thử nghiệm và tối ưu hóa thêm, chiến lược này có thể trở thành một chương trình giao dịch định lượng có lợi thế độc đáo.

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