
Chiến lược này là một hệ thống giao dịch định lượng dựa trên hai mô hình nến cổ điển: mô hình búa và mô hình người treo cổ. Chiến lược này hoạt động bằng cách xác định các mô hình đảo ngược này trên thị trường để dự đoán các điểm đảo chiều tiềm năng trong hành động giá. Hệ thống kết hợp nhiều chỉ báo kỹ thuật để xác nhận tính hợp lệ của tín hiệu, bao gồm mối quan hệ tỷ lệ giữa thân đường K và bóng, hướng xu hướng và các yếu tố khác, để nắm bắt chính xác các điểm đảo chiều của thị trường.
Logic cốt lõi của chiến lược này là xác định hai mô hình nến chính theo cách có lập trình:
Chiến lược này định lượng các mô hình này bằng cách thiết lập các thông số nghiêm ngặt, bao gồm:
Chiến lược này hiện thực hóa ứng dụng có hệ thống của lý thuyết phân tích kỹ thuật cổ điển thông qua các phương pháp định lượng và có giá trị thực tiễn mạnh mẽ. Bằng cách tối ưu hóa các thông số và cải thiện cơ chế kiểm soát rủi ro, chiến lược có thể duy trì hiệu suất ổn định trong các môi trường thị trường khác nhau. Thiết kế mô-đun của chiến lược cũng cung cấp nền tảng tốt cho quá trình tối ưu hóa sau này.
/*backtest
start: 2024-12-10 00:00:00
end: 2025-01-08 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
//@version=6
strategy("Hammer and Hanging Man Strategy", overlay=true)
// Input parameters
length = input.int(5, title="Minimum Candle Body Length (Multiplier)", minval=1)
shadowRatio = input.float(1, title="Lower Shadow to Candle Height Ratio", minval=1.0)
holdPeriods = input.int(26, title="Hold Periods (Bars)", minval=1) // Holding period in bars
// Function to calculate the absolute value
absValue(x) =>
x >= 0 ? x : -x
// Function to check if it is a Hammer
isHammer() =>
bodyLength = absValue(close - open)
candleHeight = high - low
lowerShadow = math.min(open, close) - low
upperShadow = high - math.max(open, close)
smallBody = bodyLength <= candleHeight / length
longLowerShadow = lowerShadow >= bodyLength * shadowRatio
shortUpperShadow = upperShadow <= bodyLength
smallBody and longLowerShadow and shortUpperShadow and close > open
// Function to check if it is a Hanging Man
isHangingMan() =>
bodyLength = absValue(close - open)
candleHeight = high - low
lowerShadow = math.min(open, close) - low
upperShadow = high - math.max(open, close)
smallBody = bodyLength <= candleHeight / length
longLowerShadow = lowerShadow >= bodyLength * shadowRatio
shortUpperShadow = upperShadow <= bodyLength
smallBody and longLowerShadow and shortUpperShadow and close < open
// Detect the candles
hammer = isHammer()
hangingMan = isHangingMan()
// Trading logic: Long on Hammer, Short on Hanging Man
if hammer
strategy.entry("Long", strategy.long) // Long entry on Hammer
if hangingMan
strategy.entry("Short", strategy.short) // Short entry on Hanging Man
// Exit after X bars
if strategy.position_size > 0 and bar_index - strategy.opentrades.entry_bar_index(0) >= holdPeriods
strategy.close("Long")
if strategy.position_size < 0 and bar_index - strategy.opentrades.entry_bar_index(0) >= holdPeriods
strategy.close("Short")
// Visualization of signals
plotshape(hammer, title="Hammer", location=location.belowbar, color=color.green, style=shape.labelup, text="Hammer")
plotshape(hangingMan, title="Hanging Man", location=location.abovebar, color=color.red, style=shape.labeldown, text="Hanging Man")