
La estrategia es un sistema de confirmación de transacciones de múltiples señales que combina la teoría de la reversión de la tendencia de Granville con el indicador MACD. La idea central de la estrategia es juzgar las reversiones de tendencia potenciales a través de la relación entre el precio y la línea media, y usar la verificación de múltiples señales del indicador MACD para asegurar la fiabilidad de las transacciones. Este método no solo permite identificar eficazmente el inicio de la tendencia, sino que también reduce el riesgo de señales falsas a través de mecanismos de confirmación múltiples.
El proceso de ejecución de la estrategia se divide en cuatro pasos clave:
La configuración de stop loss utiliza un método de ajuste dinámico basado en la amplitud de la línea K invertida, que establece el stop loss en el punto más bajo de la línea K invertida, y el stop loss en 1.618 veces la amplitud de la línea K invertida, lo que cumple con el principio de extensión de Fibonacci.
La estrategia combina la teoría clásica del análisis técnico y los métodos modernos de negociación cuantitativa para construir un sistema de negociación relativamente completo. El mecanismo de confirmación de múltiples señales ofrece una mejor fiabilidad de la negociación, y el método de gestión de riesgos dinámico también hace que la estrategia sea una buena adaptabilidad. A pesar de algunos problemas de atraso, la estrategia sigue teniendo un buen valor práctico y potencial de desarrollo a través de la optimización continua y el ajuste de los parámetros.
/*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")