Điều chỉnh BB+RSI+Aroon Strategy Backtest

Tác giả:ChaoZhang, Ngày: 2023-09-21 15:05:38
Tags:

Tổng quan

Chiến lược này kết hợp các Dải Bollinger (BB), Chỉ số sức mạnh tương đối (RSI) và chỉ số Aroon để tận dụng điểm mạnh của mỗi người để giao dịch tín hiệu vào và ra hiệu quả.

Làm thế nào nó hoạt động

  1. Giá phá vỡ BB dải dưới cho thấy tín hiệu dài.

  2. Chỉ số RSI vượt qua đường bán quá mức cho xác nhận dài.

  3. Aroon crossover cho thấy xác nhận dài.

  4. Mở rộng khi tất cả 3 điều kiện được đáp ứng.

  5. Giá phá vỡ BB dải trên cho thấy tín hiệu ngắn.

  6. RSI vượt qua đường mua quá mức cho xác nhận ngắn.

  7. Aroon crossover cho thấy xác nhận ngắn.

  8. Nhập ngắn khi tất cả 3 điều kiện được đáp ứng.

Ưu điểm

  • Các tham số có thể cấu hình để tối ưu hóa
  • Nhiều xác nhận cải thiện độ chính xác
  • Khả năng thích nghi với các điều kiện thị trường khác nhau
  • Logic đơn giản dễ thực hiện

Rủi ro

  • Điều chỉnh tham số kém có thể gây ra tín hiệu sai
  • Nhiều chỉ số thêm sự chậm trễ, có thể bỏ lỡ sự đảo ngược nhanh chóng
  • Sự đảo ngược làm tăng tần suất và chi phí giao dịch

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

  • Kiểm tra ngược trên các thị trường và khung thời gian cho các thông số tối ưu
  • Đánh giá sự đóng góp của mỗi chỉ số, loại bỏ việc bỏ việc
  • Khám phá máy học để tối ưu hóa tham số
  • Tối ưu hóa mã để giảm tính toán
  • Kiểm tra các thông số khác nhau trong thời gian giữ

Kết luận

Chiến lược này kết hợp các điểm mạnh của nhiều chỉ số thành các tín hiệu đầu vào mạnh mẽ. Những cải tiến hơn nữa thông qua tối ưu hóa tham số, giảm các chỉ số dư thừa và tối ưu hóa mã có thể nâng cao hiệu suất.


/*backtest
start: 2023-09-13 00:00:00
end: 2023-09-20 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Developed by Marco Jarquin as part of Arkansas 22 Project for Binary Options
// CBRA for binary options (Configurable Bollinger Bands, RSI and Aroon)

//@version=4
// ====================================================================================

//strategy("A22.CBRA.Strat", overlay=true, initial_capital=10000, currency="USD", calc_on_every_tick=true, default_qty_type=strategy.cash, default_qty_value=4000, commission_type=strategy.commission.cash_per_order, commission_value=0)

// Aroonish Parameters
// ====================================================================================

Aroonish_length = input(4, minval=1, title="Aroonish Lenght")
Aroonish_ConfVal = input(50, minval=0, maxval=100, step=25, title="Aroonish Confirmation Value")
Aroonish_upper = 100 * (-highestbars(high, Aroonish_length+1) + Aroonish_length)/Aroonish_length
Aroonish_lower = 100 * (-lowestbars(low, Aroonish_length+1) + Aroonish_length)/Aroonish_length

// Aroonish confirmations
// ====================================================================================
Aroonish_ConfLong = (Aroonish_lower >= Aroonish_ConfVal) and (Aroonish_upper < Aroonish_lower)
Aroonish_ConfShrt = (Aroonish_upper >= Aroonish_ConfVal) and (Aroonish_upper > Aroonish_lower)

plotshape(crossover(Aroonish_lower, Aroonish_upper), color = color.red, style = shape.triangledown, location = location.abovebar, size = size.auto, title = "Ar-B")
plotshape(crossover(Aroonish_upper, Aroonish_lower), color = color.green, style = shape.triangleup, location = location.belowbar, size = size.auto, transp = 0, title = "Ar-S")

// RSI Parameters
// ====================================================================================
RSI_length = input(4, title="RSI Lenght")
RSI_overSold = input(20, title="RSI Oversold Limit")
RSI_overBought = input(80, title="RSI Overbought Limit" )

RSI = rsi(close, RSI_length)

plotshape(crossover(RSI, RSI_overSold), color = color.orange, style = shape.square, location = location.belowbar, size = size.auto, title = "RSI-B")
plotshape(crossunder(RSI, RSI_overBought), color = color.orange, style = shape.square, location = location.abovebar, size = size.auto, transp = 0, title = "RSI-S")

// Bollinger Parameters
// ====================================================================================
BB_length = input(20, minval=1, title="Bollinger Lenght")
BB_mult = input(2.5, minval=0.1, maxval=50, step=0.1, title="Bollinger Std Dev")
// BB_bars = input(3, minval=1, maxval=5, title="Check bars after crossing")

BB_basis = sma(close, BB_length)
BB_dev = BB_mult * stdev(close, BB_length)

BB_upper = BB_basis + BB_dev
BB_lower = BB_basis - BB_dev

p1 = plot(BB_upper, color=color.blue)
p2 = plot(BB_lower, color=color.blue)

// Bars to have the operation open
// ====================================================================================
nBars = input(3, minval=1, maxval=30, title="Bars to keep the operation open")

// Strategy condition short or long
// ====================================================================================
ConditionShrt = ((crossunder(close, BB_upper) or crossunder(close[1], BB_upper[1])) and Aroonish_ConfShrt) and (crossunder(RSI, RSI_overBought) or crossunder(RSI[1], RSI_overBought[1]))
ConditionLong = ((crossover(close, BB_lower) or crossover(close[1], BB_lower[1])) and Aroonish_ConfLong) and (crossover(RSI, RSI_overSold) or crossover(RSI[1], RSI_overSold[1]))

plotshape(crossover(close, BB_lower), color = color.blue, style = shape.circle, location = location.belowbar, size = size.auto, title = "BB-B")
plotshape(crossunder(close, BB_upper), color = color.blue, style = shape.circle, location = location.abovebar, size = size.auto, transp = 0, title = "BB-S")


// Make input options that configure backtest date range
// ====================================================================================
iMo = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
iDy = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
iYr = input(title="Start Year", type=input.integer, defval=(2020), minval=1800, maxval=2100)

eMo = input(title="End Month", type=input.integer, defval=1, minval=1, maxval=12)
eDy = input(title="End Date", type=input.integer, defval=1, minval=1, maxval=31)
eYr = input(title="End Year", type=input.integer, defval=(2021), minval=1800, maxval=2100)

// Look if the close time of the current bar falls inside the date range
// ====================================================================================
inDateRange = true


// Evaluates conditions to enter short or long
// ====================================================================================
if (inDateRange and ConditionLong)
    strategy.entry("A22.L", strategy.long)

if (inDateRange and ConditionLong[nBars])
    strategy.close("A22.L", comment="A22.L Exit")
    
if (inDateRange and ConditionShrt)
    strategy.entry("A22.S", strategy.short)

if (inDateRange and ConditionShrt[nBars])
    strategy.close("A22.S", comment="A22.S Exit")

if (not inDateRange)
    strategy.close_all()

Thêm nữa