Chiến lược theo dõi xu hướng đường băng Bollinger hai đường trung bình động

Tác giả:ChaoZhang, Ngày: 2023-12-11 15:10:02
Tags:

img

Tổng quan

Chiến lược này xác định hướng xu hướng thị trường chung bằng cách tính toán hai đường trung bình động theo cấp số nhân (EMA) trong các khung thời gian khác nhau và xác định các cơ hội mua quá mức và bán quá mức dọc theo hướng xu hướng bằng cách sử dụng Bollinger Bands thích nghi để thực hiện giao dịch xu hướng.

Chiến lược logic

  1. EMA 200 giai đoạn và EMA 30 giai đoạn được tính toán. Nếu EMA 200 lớn hơn EMA 30, xu hướng dài hạn được xác định là tăng. Nếu không, nó được xác định là giảm.

  2. Sau khi định hướng xu hướng, đường cơ sở, dải trên và dải dưới của Bollinger Bands được tính toán. Dải cơ sở áp dụng SMA trong một khung thời gian có thể cấu hình (ví dụ 8 giai đoạn).

  3. Khi xu hướng dài hạn tăng, phá vỡ dải dưới báo hiệu bước vào dài; khi xu hướng dài hạn giảm, sự phá vỡ dải trên báo hiệu bước vào ngắn.

  4. Để lọc các đột phá giả, tỷ lệ thay đổi trên nến cuối cùng trước khi đột phá được kiểm tra để dưới ngưỡng có thể cấu hình (ví dụ 3%), và chiều rộng dải được kiểm tra để vượt quá mức có thể cấu hình (ví dụ 2,2% giá đóng).

  5. Sau khi mở các vị trí, dừng lỗ có thể cấu hình (ví dụ -3%) và lấy lợi nhuận (ví dụ 10%) được thiết lập để khóa lợi nhuận.

Điểm mạnh của chiến lược

  1. Các EMA kép xác định xu hướng chính và tránh mở các vị trí không có trật tự khi xu hướng chính không rõ ràng.

  2. Các dải Bollinger thích nghi đặt các điểm đầu vào dọc theo xu hướng. Điều chỉnh chiều rộng tự động khóa xu hướng hơn nữa.

  3. Tốc độ thay đổi và các yêu cầu về chiều rộng tối thiểu lọc hiệu quả các sự đột phá sai.

  4. Các thiết lập dừng lỗ và lấy lợi nhuận hợp lý khóa lợi nhuận trong khi giữ rủi ro dưới sự kiểm soát.

Rủi ro chiến lược

  1. Các EMA kép không thể xác định chính xác các điểm đảo ngược xu hướng, bỏ lỡ cơ hội tại các điểm chuyển hướng.

  2. Các thiết lập tham số BB không chính xác có thể gây ra tín hiệu sai.

  3. Stop loss cố định và lấy lợi nhuận không thể thích nghi với biến động thị trường.

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

  1. Bao gồm các chỉ số khác để xác định sự đảo ngược xu hướng chính và thứ cấp.

  2. Sử dụng điều chỉnh động của các thông số BB.

  3. Đặt lệnh có điều kiện để dừng lỗ và lấy lợi nhuận dựa trên các tiêu chí cụ thể.

Kết luận

Chiến lược này thực hiện giao dịch xu hướng bằng cách đánh giá xu hướng chính bằng cách sử dụng EMA kép và xác định các cơ hội với Bollinger Bands. Sức mạnh của nó nằm trong việc thiết lập hợp lý các điều kiện nhập cảnh, dừng lỗ và lấy lợi nhuận để khóa lợi nhuận xu hướng.


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

//@version=3
//////////////////////////////////////////////////////////////////////
// Component Code Start
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2039, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop

strategy("Custom Band Strategy", overlay=true)
source = close //종가 기준

//추세 조건 설정
emaLong = ema(source, input(200, minval=0))
emaShort = ema(source, input(30, minval=0))
trend = if emaShort>=emaLong
    1
else
    -1
    
plot(emaLong, color=red, transp=0)
plot(emaShort, color=blue, transp=0)


//BB 계산(default 14/3.2)
length = input(8, minval=1)

basis = sma(source, length)
plot(basis, color=green, transp=0)
max=highest(abs(source-basis), length)

factor1 = input(1.3, minval=0.5)
factor2 = input(1.1, minval=0.5)

upper = if trend==1
    basis + max*factor1
else
    basis + max*factor2
lower = if trend==-1
    basis - max*factor1
else
    basis - max*factor2

plot1 = plot(upper)
plot2 = plot(lower)
fill(plot1, plot2, transp=80, color=green)

//밴드 이탈 후 재진입 조건 설정
cross_over = (low<=lower and close>=lower) or crossover(close,lower)
cross_under = (high>=upper and close<=upper) or crossunder(close,upper)

//변동율 계산
maxCandle=highest(abs(open-close), length)
    
roc = abs(open-close)/open*100
changerate = input(3, minval=0.0)

//수익률 계산
value = abs(strategy.position_size)*strategy.position_avg_price
roe = strategy.openprofit/value * 100
expRoeL = (upper-lower)/lower*100
expRoeS = (upper-lower)/upper*100
exp = input(2.2, minval=0.0)

target = input(10, minval=0.0)
stop = input(-3, minval=-10.0)

strategy.close_all(when=roc>=changerate and testPeriod())
strategy.close_all(when=roe>=target and testPeriod())
strategy.close_all(when=roe<=stop and testPeriod())

plotchar(crossover(close,lower) and crossunder(close,upper),color=blue, transp=0, text="cross")
plotchar(roc>=changerate,color=red, transp=0, text="roc")
plotchar(roe>=target,color=blue, transp=0, text="target")
plotchar(roe<=stop,color=green, transp=0, text="stop")

minroe = input(2, minval=0.0)

strategy.close_all(when=cross_under and roe>minroe and testPeriod())
strategy.entry("BBandLE", strategy.long, stop=source, oca_name="BollingerBands",  comment="BBandLE", when=(cross_over) and trend==1 and roc<changerate and expRoeL>exp and source>emaLong and strategy.position_size==0 and testPeriod()) //trend==1 and 
//else
strategy.close_all(when=cross_over and roe>minroe and testPeriod())
strategy.entry("BBandSE", strategy.short, stop=source, oca_name="BollingerBands",  comment="BBandSE", when=(cross_under) and trend==-1 and roc<changerate and expRoeS>exp and source<emaLong and strategy.position_size==0 and testPeriod()) //trend==-1 and 

Thêm nữa