Chiến lược phá vỡ phạm vi động

Tác giả:ChaoZhang, Ngày: 2023-11-21 15:03:19
Tags:

img

Tổng quan

Chiến lược này được thiết kế dựa trên chỉ số Bollinger Bands để tạo ra một chiến lược giao dịch đột phá năng động. Nó kết hợp các điều kiện của bộ lọc thân nến và bộ lọc màu để tìm kiếm các cơ hội đột phá xung quanh dải dưới Bollinger. Các lối ra dựa trên bộ lọc thân. Chiến lược tự động quản lý kích thước vị trí và rủi ro.

Chiến lược logic

Tính toán chỉ số

Đầu tiên, tính toán đường cơ sở và dải dưới của Bollinger Bands dựa trên giá thấp:

src = low
basis = sma(src, length) 
dev = mult * stdev(src, length)
lower = basis - dev

Trong đó src là giá thấp, chiều dài là thời gian tính toán, cơ sở là đường trung bình động, dev là độ lệch chuẩn và thấp hơn là dải dưới.

mult thường được thiết lập là 2, có nghĩa là dải dưới là một độ lệch chuẩn.

Điều kiện bộ lọc

Chiến lược bao gồm hai điều kiện lọc:

Bộ lọc thân nếnSử dụng kích thước cơ thể nbody và trung bình của nó để xác định, chỉ tạo tín hiệu giao dịch khi nbody lớn hơn một nửa của abody.

Bộ lọc màu
Không kéo dài khi nến đóng tích cực (kết thúc > mở).

Các tín hiệu giao dịch

Tạo tín hiệu dài khi đáp ứng các điều kiện dưới đây:

low < lower // price breaks lower band
close < open or usecol == false // color filter
nbody > abody / 2 or usebod == false // body filter  

Khi kích thước cơ thể vượt quá một nửa số trung bình một lần nữa, vị trí gần:

close > open and nbody > abody / 2  

Định kích thước vị trí

Chiến lược tính toán kích thước giao dịch tự động cho sự tăng trưởng theo cấp số nhân của vị trí:

lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1] 

Kiểm soát rủi ro

Thêm các hạn chế về năm, tháng và ngày để giới hạn giao dịch chỉ trong phạm vi ngày cụ thể:

when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))

Ưu điểm

Phạm vi giao dịch năng động

Dải dưới Bollinger cung cấp một khu vực hỗ trợ năng động để nắm bắt sự khôi phục sau xu hướng.

Bộ lọc kép

Sự kết hợp của thân nến và bộ lọc màu sắc ngăn ngừa các sự đột phá giả hiệu quả.

Tự động định vị

Kích thước vị trí tăng theo cấp số nhân đến 100% quản lý rủi ro tự động.

Phạm vi ngày

Đặt khoảng thời gian giảm rủi ro liên quan đến biến động thị trường trong các giai đoạn cụ thể.

Rủi ro

Việc rút tiền kéo dài

Khi xu hướng tăng mạnh, các dải trung và trên BB có thể di chuyển lên nhanh chóng, gây ra giảm kéo dài.

Giải pháp

Kết hợp với các chỉ số xu hướng, dừng chiến lược khi được đánh giá là thị trường tăng để tránh giảm kéo dài.

Thất bại trong việc phá vỡ

Sự đột phá có thể thất bại khi rút lại và thử lại băng tần dưới.

Giải pháp

Thêm stop loss dưới mức hỗ trợ hoặc thêm logic để phát hiện thử nghiệm lại thất bại để dừng nhanh.

Những cải tiến

Thêm Stop Loss

Tối ưu hóa stop loss dưới mức hỗ trợ dựa trên kết quả backtest.

Tối ưu hóa tham số

Fine tune bộ lọc cơ thể thời gian lưu trú, bộ lọc màu sắc vv để tìm tối ưu.

Thêm bộ lọc xu hướng

Ngưng chiến lược khi được đánh giá là thị trường tăng.

Kết luận

Chiến lược này kết hợp hỗ trợ BB, bộ lọc cơ thể, bộ lọc màu sắc và logic đột phá để nắm bắt các lần khôi phục có xác suất cao.


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

//Noro
//2018

//@version=2
strategy(title = "Noro's Wizard Strategy v1.0", shorttitle = "Wizard str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
length = input(25, defval = 25, minval = 1, maxval = 200, title = "BB Period")
usebod = input(false, defval = false, title = "Use Body-Filter")
usecol = input(false, defval = false, title = "Use Color-Filter")
showar = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Bollinger
src = low
mult = 2
basis = sma(src, length)
dev = mult * stdev(src, length)
lower = basis - dev
plot(lower, color = lime, linewidth = 3, title="Bottom Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebod == false

//Signals
up1 = low < lower and (close < open or usecol == false) and body
exit = close > open and nbody > abody / 2

//Arrows
needar = up1 and showar
plotarrow(needar ? 1 : na)

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up1
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Thêm nữa