
Chiến lược này là một hệ thống xác nhận giao dịch đa tín hiệu kết hợp lý thuyết đảo ngược xu hướng Granville với MACD. Ý tưởng cốt lõi của chiến lược là đánh giá sự đảo ngược xu hướng tiềm ẩn bằng mối quan hệ của giá với đường trung bình và sử dụng xác nhận đa tín hiệu của MACD để đảm bảo độ tin cậy của giao dịch. Phương pháp này không chỉ có thể xác định hiệu quả điểm bắt đầu của xu hướng mà còn giảm nguy cơ tín hiệu giả thông qua cơ chế xác nhận đa.
Quá trình thực hiện chiến lược được chia thành bốn bước quan trọng:
Cài đặt dừng lỗ sử dụng phương pháp điều chỉnh động dựa trên tần số K-đường quay ngược, đặt dừng lỗ ở điểm thấp nhất của K-đường quay ngược, đặt dừng là 1.618 lần tần số K-đường quay ngược, phù hợp với nguyên tắc mở rộng Fibonacci.
Chiến lược này kết hợp lý thuyết phân tích kỹ thuật cổ điển và phương pháp giao dịch định lượng hiện đại để xây dựng một hệ thống giao dịch tương đối hoàn chỉnh. Cơ chế xác nhận đa tín hiệu cung cấp độ tin cậy giao dịch tốt hơn, phương pháp quản lý rủi ro động cũng làm cho chiến lược có khả năng thích ứng tốt. Mặc dù có một số vấn đề về sự chậm trễ, chiến lược vẫn có giá trị thực tế và tiềm năng phát triển tốt thông qua việc tối ưu hóa liên tục và điều chỉnh tham số.
/*backtest
start: 2024-02-21 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Granville + MACD Strategy", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// ■ Parameter Settings
emaPeriod = input.int(20, "EMA Period for Granville", minval=1)
fastLen = input.int(12, "MACD Fast Period", minval=1)
slowLen = input.int(26, "MACD Slow Period", minval=1)
signalLen = input.int(9, "MACD Signal Period", minval=1)
// ■ Calculate EMA (for Granville reversal detection)
ema_val = ta.ema(close, emaPeriod)
// ■ Granville Reversal Detection (e.g., price crosses above EMA from below)
granvilleReversal = ta.crossover(close, ema_val)
// ■ Calculate MACD
[macdLine, signalLine, _] = ta.macd(close, fastLen, slowLen, signalLen)
// ■ State management variables (to manage state transitions)
var bool granvilleDone = false // Reversal bar confirmed flag
var float granvilleLow = na // Low of the reversal bar (used for SL)
var float granvilleRange = na // Range of the reversal bar (used for TP calculation)
var bool macdGC_done = false // First MACD Golden Cross confirmed
var int goldenCrossBar = na // Bar index of the first MACD Golden Cross
var float initialMacdHigh = na // MACD value at the Golden Cross (used for break detection)
var bool breakoutDone = false // MACD line breaks the initial Golden Cross MACD value
// ■ (1) Granville Reversal Detection
if granvilleReversal
granvilleDone := true
granvilleLow := low // Low of the reversal bar (SL)
granvilleRange := high - low // Range of the reversal bar (used for TP calculation)
// Reset MACD-related states
macdGC_done := false
breakoutDone := false
initialMacdHigh := na
goldenCrossBar := na
// ■ (2) MACD Golden Cross (first signal) detection
if granvilleDone and (not macdGC_done) and ta.crossover(macdLine, signalLine)
macdGC_done := true
goldenCrossBar := bar_index
initialMacdHigh:= macdLine
// ■ (3) Check if MACD line breaks the initial MACD value at the Golden Cross
if macdGC_done and (not breakoutDone) and (macdLine > initialMacdHigh)
breakoutDone := true
// ■ (4) When MACD retests and crosses above the signal line again, it's the entry timing
// ※ Check for a crossover after the first Golden Cross bar
entryCondition = granvilleDone and macdGC_done and breakoutDone and (bar_index > goldenCrossBar) and ta.crossover(macdLine, signalLine)
// ■ TP and SL settings at entry
if entryCondition
entryPrice = close
tpPrice = entryPrice + granvilleRange * 1.618
slPrice = granvilleLow
strategy.entry("Long", strategy.long)
strategy.exit("Exit Long", from_entry="Long", stop=slPrice, limit=tpPrice)
// Reset states after entry (for the next entry)
granvilleDone := false
macdGC_done := false
breakoutDone := false
initialMacdHigh := na
goldenCrossBar := na
// ■ Plotting (for reference)
// Display the EMA on the price chart (with fixed title)
plot(ema_val, color=color.orange, title="EMA (20)")
// Plot MACD and Signal in a separate window (with fixed titles)
plot(macdLine, color=color.blue, title="MACD")
plot(signalLine, color=color.red, title="Signal")