Chiến lược khớp trung bình động kép dựa trên các băng Bollinger

Tác giả:ChaoZhang, Ngày: 2023-11-24 15:32:57
Tags:

img

Tổng quan

Chiến lược khớp trung bình động kép dựa trên Bollinger Bands là một chiến lược theo xu hướng chạy với giá và khối lượng trên thị trường. Nó sử dụng sự chéo chéo của Bollinger Bands và trung bình động như các tín hiệu giao dịch để thực hiện một chiến lược định lượng có thể tự động xác định xu hướng thị trường và giao dịch với các quy tắc dừng lợi nhuận và dừng lỗ.

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

Chiến lược này chủ yếu dựa trên các tín hiệu chéo của chỉ số Bollinger Bands và chỉ số trung bình động cho giao dịch. Cụ thể, nó sử dụng đường ray giữa, đường ray trên của Bollinger Bands và 7 đường trung bình động với độ dài từ 5 đến 200 ngày cùng một lúc. Nó tạo ra tín hiệu mua khi giá vượt qua đường ray giữa và dưới của Bollinger Bands từ dưới lên trên; nó tạo ra tín hiệu bán khi giá vượt qua đường ray trên của Bollinger Bands từ trên lên để đạt được xu hướng sau.

Ngoài ra, chiến lược cũng giới thiệu chỉ số moveToFract để đánh giá các vị trí dài và ngắn. Chỉ số này xác định xu hướng thị trường hiện tại là tăng hay giảm bằng cách tính toán thứ tự sắp xếp các đường trung bình động ngắn hạn và dài hạn, do đó tránh tạo ra các tín hiệu sai trong các thị trường giới hạn phạm vi. Cuối cùng, kết hợp với các quy tắc dừng lợi nhuận và dừng lỗ có thể cấu hình, nó tạo thành một xu hướng hoàn chỉnh hơn sau chiến lược giao dịch.

Phân tích lợi thế

  1. Cấu hình linh hoạt có thể tùy chỉnh các kết hợp tham số phù hợp với môi trường thị trường khác nhau
  2. Kết hợp hai chỉ số khác nhau như bộ lọc có thể giảm tín hiệu sai
  3. Chỉ số đánh giá xu hướng có thể tránh các hoạt động đảo ngược trong thị trường biến động
  4. Theo dõi thiết lập dừng lỗ tối đa hóa lợi nhuận

Phân tích rủi ro

  1. Các thông số nên được điều chỉnh thích hợp để phù hợp với các chu kỳ của các khung thời gian khác nhau để tránh giao dịch quá mức
  2. Theo dõi dừng lỗ có thể mở rộng tổn thất trong một sự suy giảm nhanh chóng
  3. Phải đảm bảo đủ tiền, nếu không không có khả năng chịu được rủi ro mất mát liên tục

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

  1. Thêm hình chữ thập vàng và hình chữ thập chết để tối ưu hóa hơn nữa
  2. Các loại khác nhau có các thông số khác nhau, xem xét máy học cho các thông số tối ưu
  3. Kết hợp với chỉ số biến động để xác định biến động xu hướng và tăng cường kiểm soát rủi ro

Kết luận

Nói chung, đây là một chiến lược theo xu hướng rất thực tế. Nó sử dụng crossover chỉ số để ra quyết định, và cũng kết hợp một mô-đun đánh giá xu hướng để lọc hiệu quả các tín hiệu sai. Sau khi cấu hình stop profit và stop loss, nó có thể hoàn toàn theo xu hướng giao dịch và có lợi nhuận tốt. Bằng cách điều chỉnh các kết hợp tham số và thêm nhiều bộ lọc, chiến lược này có thể được tối ưu hóa hơn nữa để thích nghi với nhiều môi trường thị trường hơn, và có nhiều cơ hội để cải thiện và triển vọng ứng dụng.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)

BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)

atrLength = input(22)
atrMult = input(6)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
    
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)

trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)

buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)

strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )




Thêm nữa