Esta estrategia es un sistema de negociación cuantitativo integral que combina el promedio móvil T3, el seguimiento de tendencias y los mecanismos de stop loss de seguimiento.
La estrategia consiste en tres componentes principales: identificación de tendencias, confirmación de señales y gestión de riesgos. En primer lugar, utiliza el promedio móvil T3 como la herramienta principal de identificación de tendencias, que reduce el retraso mientras mantiene la suavidad a través de cálculos de promedio móvil exponencial de seis veces. En segundo lugar, calcula los rangos de volatilidad de precios utilizando el indicador de tendencia del limón y filtra las señales con el indicador TDFI, generando señales comerciales solo cuando el precio rompe el rango de volatilidad y TDFI confirma. Finalmente, la estrategia emplea una combinación de trailing y paradas fijas para la gestión de riesgos, con paradas de trailing activadas después de que el precio alcanza los niveles de umbral mientras se mantienen paradas fijas como protección.
Esta es una estrategia de seguimiento de tendencias diseñada de manera integral que garantiza señales comerciales confiables y una gestión eficaz del riesgo a través de múltiples indicadores técnicos. El diseño modular de la estrategia proporciona una buena extensibilidad y potencial de optimización, lo que la hace adecuada como base para sistemas de seguimiento de tendencias a medio y largo plazo. En la aplicación práctica, se recomienda optimizar los parámetros basados en instrumentos comerciales específicos y condiciones de mercado.
/*backtest start: 2019-12-23 08:00:00 end: 2024-11-27 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Lemon Trend Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // Input parameters lookbackPeriod = input.int(14, "Lookback Period") t3Length = input.int(200, "T3 MA Length") t3Factor = input.float(0.7, "T3 Factor", minval=0, maxval=1) // 移动止损参数 trailingStopPct = input.float(1.5, "移动止损百分比", minval=0.1, step=0.1) trailingStopActivationPct = input.float(1.0, "移动止损激活百分比", minval=0.1, step=0.1) // === T3 Moving Average Function === t3(src, length, factor) => // First EMA e1 = ta.ema(src, length) // Second EMA e2 = ta.ema(e1, length) // Third EMA e3 = ta.ema(e2, length) // Fourth EMA e4 = ta.ema(e3, length) // Fifth EMA e5 = ta.ema(e4, length) // Sixth EMA e6 = ta.ema(e5, length) c1 = -factor * factor * factor c2 = 3 * factor * factor + 3 * factor * factor * factor c3 = -6 * factor * factor - 3 * factor - 3 * factor * factor * factor c4 = 1 + 3 * factor + factor * factor * factor + 3 * factor * factor t3 = c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3 // Calculate T3 MA t3ma = t3(close, t3Length, t3Factor) plot(t3ma, "T3 MA", color=color.blue) // === Lemon Trend Indicator === highLowDiff = high - low normalizedDiff = ta.sma(highLowDiff, lookbackPeriod) upperBand = ta.highest(high, lookbackPeriod) lowerBand = ta.lowest(low, lookbackPeriod) buySignal = ta.crossover(close, upperBand - normalizedDiff) sellSignal = ta.crossunder(close, lowerBand + normalizedDiff) // === TDFI Indicator === tdfiLength = input.int(14, "TDFI Length") tdfi = ta.ema(close - close[1], tdfiLength) tdfiSignal = ta.ema(tdfi, 9) // Plot signals plotshape(buySignal and tdfi > tdfiSignal and close > t3ma, "Buy Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small) plotshape(sellSignal and tdfi < tdfiSignal and close < t3ma, "Sell Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small) // === Strategy Logic === longCondition = buySignal and tdfi > tdfiSignal and close > t3ma shortCondition = sellSignal and tdfi < tdfiSignal and close < t3ma // 计算移动止损价格 var float longTrailingStop = na var float shortTrailingStop = na // 更新移动止损价格 if (strategy.position_size > 0) threshold = strategy.position_avg_price * (1 + trailingStopActivationPct / 100) if (high > threshold) stopPrice = high * (1 - trailingStopPct / 100) if (na(longTrailingStop) or stopPrice > longTrailingStop) longTrailingStop := stopPrice if (strategy.position_size < 0) threshold = strategy.position_avg_price * (1 - trailingStopActivationPct / 100) if (low < threshold) stopPrice = low * (1 + trailingStopPct / 100) if (na(shortTrailingStop) or stopPrice < shortTrailingStop) shortTrailingStop := stopPrice // Entry orders if (longCondition) strategy.entry("Long", strategy.long) longTrailingStop := na if (shortCondition) strategy.entry("Short", strategy.short) shortTrailingStop := na // Calculate stop loss and take profit levels longStopLoss = ta.lowest(low, lookbackPeriod) shortStopLoss = ta.highest(high, lookbackPeriod) // Exit conditions with fixed R:R fixedRR = input.float(1.8, "Fixed Risk:Reward Ratio") partialExitPct = input.float(50.0, "Partial Exit Percentage", minval=0, maxval=100) / 100 // 综合移动止损和固定止损 if (strategy.position_size > 0) longTakeProfit = strategy.position_avg_price + (strategy.position_avg_price - longStopLoss) * fixedRR stopPrice = na(longTrailingStop) ? longStopLoss : math.max(longStopLoss, longTrailingStop) strategy.exit("Long Exit", "Long", qty_percent=partialExitPct, stop=stopPrice, limit=longTakeProfit) if (strategy.position_size < 0) shortTakeProfit = strategy.position_avg_price - (shortStopLoss - strategy.position_avg_price) * fixedRR stopPrice = na(shortTrailingStop) ? shortStopLoss : math.min(shortStopLoss, shortTrailingStop) strategy.exit("Short Exit", "Short", qty_percent=partialExitPct, stop=stopPrice, limit=shortTakeProfit) // 绘制移动止损线 plot(strategy.position_size > 0 ? longTrailingStop : na, "Long Trailing Stop", color=color.red, style=plot.style_linebr) plot(strategy.position_size < 0 ? shortTrailingStop : na, "Short Trailing Stop", color=color.red, style=plot.style_linebr)