
Chiến lược đo đạc phá vỡ cao thấp là một chiến lược theo dõi xu hướng sử dụng các mức cao và thấp trong lịch sử của cổ phiếu để xác định liệu giá có phá vỡ các mức cao thấp này hay không. Nó tạo ra tín hiệu mua bằng cách tính toán giá cao nhất và giá thấp nhất trong một chu kỳ nhất định, khi giá trong chu kỳ hiện tại vượt quá giá cao nhất trong một chu kỳ nhất định gần đây; khi giá giảm xuống dưới giá thấp nhất trong một chu kỳ nhất định gần đây, tạo ra bán.
Lập luận 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 trong một chu kỳ nhất định ((50 đường K mặc định). Khi tính toán giá cao nhất và giá thấp nhất, bạn có thể chọn sử dụng giá đóng cửa hoặc giá cao nhất và giá thấp nhất (( sử dụng giá cao nhất và giá thấp nhất mặc định).
Khi tạo ra tín hiệu mua, chiến lược sẽ mua ở mức giá đó và thiết lập giá dừng lỗ và giá dừng bán. Khi giá chạm mức giá dừng lỗ, chiến lược sẽ dừng lỗ và rút ra; khi giá chạm mức giá dừng bán, chiến lược sẽ dừng và rút ra.
Chiến lược này có một số lợi thế:
Chiến lược này cũng có một số rủi ro:
Để kiểm soát những rủi ro này, có thể tối ưu hóa theo các cách sau:
Chiến lược này có thể được tối ưu hóa từ các khía cạnh sau:
Tối ưu hóa tham số. Các tham số tối ưu có thể được tìm thấy bằng cách thử nghiệm các kết hợp tham số khác nhau một cách có hệ thống hơn.
Kết hợp với các chỉ số khác để lọc tín hiệu. Ví dụ, có thể kết hợp với chỉ số trung bình di chuyển, chỉ khi giá vượt qua mức giá cao nhất và vượt qua trung bình di chuyển ngắn hạn trên trung bình di chuyển dài hạn, tín hiệu mua sẽ được tạo ra.
Cân nhắc tần suất biến động của giá cổ phiếu. Ví dụ, có thể kết hợp với chỉ số ATR, khi biến động giá cổ phiếu tăng lên, mức độ phá vỡ được nới lỏng thích hợp.
Phân biệt thị trường xu hướng và thị trường chấn động. Trong giai đoạn xu hướng rõ ràng, hãy nới lỏng tham số một cách thích hợp để theo dõi xu hướng; Trong thị trường chấn động, hãy thắt chặt tham số một cách thích hợp.
Tăng cơ chế quản lý vị trí. Ví dụ: ngừng mở vị trí khi thua lỗ đạt đến một tỷ lệ nhất định.
Nói chung, chiến lược đo lường lại phá vỡ cao thấp là một chiến lược theo dõi xu hướng đơn giản và thực tế. Nó quyết định tín hiệu giao dịch bằng cách đánh giá liệu giá có phá vỡ mức cao nhất và thấp nhất trong một chu kỳ nhất định hay không. Chiến lược này có những lợi thế như đơn giản, theo dõi xu hướng, có thể tối ưu hóa tham số, đồng thời có rủi ro tạo ra giao dịch quá mức và không thể xử lý thị trường xung đột. Chúng ta có thể tối ưu hóa chiến lược này từ nhiều khía cạnh như tối ưu hóa tham số, lọc chỉ số và quản lý vị trí để hiệu quả của nó được nâng cao hơn nữa.
/*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)