Chiến lược kiểm tra ngược High Low Breaker

Tác giả:ChaoZhang, Ngày: 2023-11-27 15:37:13
Tags:

img

Tổng quan

Chiến lược High Low Breaker Backtest là một chiến lược theo xu hướng sử dụng các mức cao và thấp trong lịch sử của một cổ phiếu để xác định xem giá có vượt qua các phạm vi cao và thấp này hay không. Nó tính toán giá cao nhất và giá thấp nhất trong một khoảng thời gian nhất định, và tạo ra tín hiệu mua khi giá của khoảng thời gian hiện tại vượt quá giá cao nhất trong một khoảng thời gian gần đây, và bán tín hiệu khi giá vượt qua mức giá thấp nhất trong một khoảng thời gian gần đây. Là một loại chiến lược theo xu hướng, nó có thể nắm bắt một số đặc điểm xu hướng của giá cổ phiếu và có giá trị thực tế cho giao dịch trực tiếp.

Chiến lược logic

Lý thuyết cốt lõi của chiến lược này là tính toán giá cao nhất và giá thấp nhất trên một số thanh nhất định (bên định 50 thanh). Khi tính toán giá cao nhất / thấp nhất, nó cho phép sử dụng giá đóng hoặc giá cao / thấp thực tế (bên định sử dụng giá cao / thấp). Sau đó nó kiểm tra xem giá đóng hoặc giá cao của thanh hiện tại có vượt quá giá cao nhất trong khoảng thời gian gần đây không. Nếu có và nó đã vượt quá số lượng thanh tối thiểu (bên định 30 thanh) kể từ thanh giá cao nhất cuối cùng, nó tạo ra tín hiệu mua. Tương tự, nếu giá đóng hoặc giá thấp của thanh hiện tại phá giá thấp nhất trong khoảng thời gian gần đây và số lượng thanh tối thiểu kể từ khi giá thấp nhất cuối cùng vượt qua, nó tạo ra tín hiệu bán.

Khi tạo ra tín hiệu mua, chiến lược đi vào các vị trí dài ở mức giá đó, với mức giá dừng lỗ và lấy lợi nhuận được thiết lập. Nó thoát khỏi vị trí với mức dừng lỗ khi giá dừng lỗ được chạm, và thoát ra với lợi nhuận khi giá lấy lợi nhuận được chạm.

Phân tích lợi thế

Chiến lược backtest bộ ngắt cao thấp này có những lợi thế sau:

  1. Lý thuyết đơn giản và dễ hiểu / thực hiện.
  2. Nó có thể nắm bắt một số đặc điểm xu hướng của giá cổ phiếu.
  3. Các tham số có thể được tối ưu hóa để tìm kết hợp tham số tốt nhất.
  4. Xây dựng trong dừng lỗ và lấy lợi nhuận kiểm soát rủi ro.
  5. Hiển thị rất dễ dàng điều chỉnh tham số và phân tích kết quả.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Có xu hướng giao dịch nhiều lần và giao dịch quá mức.
  2. Khởi mở thường xuyên khi giá dao động.
  3. Mất cơ hội xu hướng lớn nếu các thông số không được thiết lập đúng cách.
  4. Không tính đến tần suất và mức độ biến động giá cả.
  5. Không xác nhận tín hiệu với các chỉ số khác.

Các khía cạnh sau đây có thể giúp giảm thiểu những rủi ro này:

  1. Giảm khoảng cách dừng lỗ để tăng thời gian giữ.
  2. Thêm thêm các tiêu chí nhập để tránh nhập thường xuyên.
  3. Tối ưu hóa các tham số để tìm kết hợp tối ưu.
  4. Thêm các điều kiện bộ lọc với các chỉ số khác.

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

Chiến lược này có thể được cải thiện theo những cách sau:

  1. Tối ưu hóa tham số bằng cách thử nghiệm có hệ thống hơn.
  2. Thêm các bộ lọc tín hiệu với các chỉ số khác chẳng hạn như đường trung bình động.
  3. Xem xét biến động giá bằng cách sử dụng ATR để điều chỉnh ngưỡng thoát.
  4. Phân biệt xu hướng so với thị trường dao động để điều chỉnh các thông số.
  5. Cải thiện các quy tắc kích thước vị trí, ví dụ: ngừng mở các vị trí mới sau khi mất đáng kể.

Tóm lại

Tóm lại, chiến lược High Low Breaker Backtest là một chiến lược theo xu hướng đơn giản và thực tế. Nó tạo ra các tín hiệu giao dịch dựa trên giá phá vỡ theo thời gian cao nhất / thấp nhất. Chiến lược có những lợi thế như sự đơn giản, theo xu hướng và tối ưu hóa tham số, nhưng cũng có những rủi ro như giao dịch quá mức và không thể xử lý thị trường dao động.


/*backtest
start: 2023-11-25 00:00:00
end: 2023-11-26 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("High/Low Breaker Backtest 1.0", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=700)

// Strategy Settings
takeProfitPercentageLong = input(.1, title='Take Profit Percentage Long', type=float)/100
stopLossPercentageLong = input(0.15, title='Stop Loss Percentage Long', type=float)/100
takeProfitPercentageShort = input(.1, title='Take Profit Percentage Short', type=float)/100
stopLossPercentageShort = input(0.15, title='Stop Loss Percentage Short', type=float)/100


candlesBack = input(title="Number of candles back",  defval=50)
useHighAndLows =  input(true, title="Use high and lows (uncheck to use close)", defval=true)
lastBarsBackMinimum =  input(title="Number of candles back to ignore for last high/low",  defval=30)
showHighsAndLows = input(true, title="Show high/low lines", defval=true)

getIndexOfLowestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] <= current
            index := i
            current := series[i]
    index

getIndexOfHighestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] >= current
            index := i
            current := series[i]
    index

indexOfHighestInRange = getIndexOfHighestInSeries(useHighAndLows ? high : close, candlesBack)
indexOfLowestInRange = getIndexOfLowestInSeries(useHighAndLows ? low : close, candlesBack)

max = useHighAndLows ? high[indexOfHighestInRange] : close[indexOfHighestInRange]
min = useHighAndLows ? low[indexOfLowestInRange] : close[indexOfLowestInRange]

barsSinceLastHigh = indexOfHighestInRange
barsSinceLastLow = indexOfLowestInRange

isNewHigh = (useHighAndLows ? high > max[1] : close > max[1]) and (barsSinceLastHigh[1] + 1 > lastBarsBackMinimum)
isNewLow = (useHighAndLows ? low < min[1] : close < min[1]) and (barsSinceLastLow[1] + 1 > lastBarsBackMinimum)

alertcondition(condition=isNewHigh, title="New High", message="Last High Broken")
alertcondition(condition=isNewLow, title="New Low", message="Last Low Broken")

if high > max 
    max := high
    barsSinceLastHigh := 0

if low < min
    min := low
    barsSinceLastLow := 0 

plot( showHighsAndLows ? max : na, color=red, style=line, title="High", linewidth=3)
plot( showHighsAndLows ? min : na, color=green, style=line, title="Low", linewidth=3)

// Strategy Entry/Exit Logic
goLong =isNewHigh
longStopLevel = strategy.position_avg_price * (1 - stopLossPercentageLong)
longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercentageLong)

goShort = isNewLow
shortStopLevel = strategy.position_avg_price * (1 + stopLossPercentageShort)
shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercentageShort)

strategy.entry("Long", strategy.long, when=goLong)
strategy.exit("Long Exit", "Long", stop=longStopLevel, limit=longTakeProfitLevel)

strategy.entry("Short", strategy.short, when=goShort)
strategy.exit("Short Exit", "Short", stop=shortStopLevel, limit=shortTakeProfitLevel)
        
plot(goShort ? shortStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goShort ? shortTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)
plot(goLong ? longStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goLong ? longTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)


Thêm nữa