Estrategia avanzada con volumen y precio de retroceso de ganancia múltiple

El autor:¿ Qué pasa?, Fecha: 2023-12-12 15:39:19
Las etiquetas:

img

Resumen general

Esta estrategia combina el cruce de promedio móvil, el índice de fuerza relativa (RSI) y el volumen de operaciones amplificado significativamente para tomar posiciones largas / cortas después de detectar un cierto porcentaje de retroceso en el precio en picos de alto volumen.

Principios

El cruce de promedios móviles rápidos y lentos proporciona señales tempranas de cambio de dirección de la tendencia. El indicador RSI evalúa las condiciones de sobrecompra / sobreventa para evitar estos escenarios para señales de entrada más robustas. Un aumento significativo sobre el volumen promedio señala un movimiento de precio potencial que llama la atención del mercado. Estos picos de volumen refuerzan la fuerza de las señales de entrada. Después del aumento de volumen y el aumento de precios, las órdenes de entrada se activan cuando el precio y el volumen se han retractado un porcentaje especificado, lo que indica una corrección o reversión potencial. Se utilizan tres órdenes de TP escalonadas para obtener ganancias. Cada nivel de TP cierra una parte de la posición al alcanzar el objetivo de ganancia predeterminado.

Los mismos principios se aplican a las señales de entrada y salida cortas.

Análisis de ventajas

Las principales ventajas de esta estrategia:

  1. El cruce de los MAs rápidos/lentos combinados con el RSI forman fuertes señales de entrada, evitando áreas de sobrecompra/sobreventa para aumentar las probabilidades de ganar.

  2. Los picos de volumen aseguran que las grandes oscilaciones de precios se capturen para el establecimiento de posiciones, fortaleciendo la fuerza de la señal.

  3. El mecanismo de retroceso precio/volumen mejora la precisión del momento de entrada para capturar oportunidades de reversión o alza.

  4. Los TP de tres niveles utilizan la tendencia al alza de los precios para obtener ganancias basadas en la tolerancia al riesgo.

  5. La suspensión opcional permite una mayor flexibilidad para preservar el capital, manteniendo al mismo tiempo la posibilidad de obtener mayores beneficios en función de la volatilidad del mercado.

  6. Aplicable tanto a operaciones largas como cortas, las ganancias pueden realizarse en mercados de tendencia alcista o bajista, mejorando la utilidad.

Análisis de riesgos

A pesar de un diseño cuidadoso, el comercio de cualquier producto financiero conlleva riesgos.

  1. Los cruces de MA no siempre determinan con precisión la tendencia.

  2. La configuración inadecuada del período del RSI puede llevar a no evitar las áreas de sobrecompra/sobreventa.

  3. Los picos de volumen no necesariamente coinciden perfectamente con los cambios significativos de precios.

  4. La reducción excesiva o inadecuada del precio/volumen afecta al momento de la entrada, factor que también debe ajustarse en función del mercado.

  5. Los niveles de toma de ganancias preestablecidos no pueden garantizar la ejecución completa de las órdenes TP. Un cambio repentino del mercado puede causar deslizamiento.

  6. Un stop loss de seguimiento demasiado amplio puede provocar una salida prematura de las posiciones y perder mayores beneficios.

Estos riesgos requieren optimización del código, ajuste de parámetros y rigurosas pruebas de retroceso para garantizar la confiabilidad de la estrategia.

Direcciones de optimización

Otras mejoras:

  1. Añadir otros indicadores como bandas de Bollinger o KD para ayudar a las decisiones de entrada, mejorando la precisión.

  2. Incorporar modelos de aprendizaje automático como LSTM para establecer MAs dinámicas que adapten automáticamente los parámetros a las últimas condiciones del mercado, mejorando la captura de tendencias.

  3. Incorporar un stop loss dinámico / toma de ganancias basado en la volatilidad del mercado para ajustar automáticamente los niveles en consecuencia.

  4. Utilice el análisis de cointegración para elegir de manera óptima el factor de retroceso por movimiento de precios en todo el mercado frente a las correlaciones de acciones individuales, obteniendo el momento óptimo de entrada.

  5. Emplear modelos multifactorial con análisis de sentimiento, minería de reglas de asociación, etc. para seleccionar acciones con las correlaciones más altas de cambio de precio / volumen para implementar una estrategia para un tremendo aumento del rendimiento.

Conclusión

Esta es una excelente estrategia para los traders de mediano a corto plazo después de la mejora. Con funciones cada vez más robustas e inteligentes basadas en la optimización, tiene grandes méritos prácticos para el comercio en vivo mientras se esfuerza por ofrecer rendimientos superiores a los del mercado con riesgos firmemente controlados. Como una estrategia cuantitativa progresivamente avanzada, ejemplifica un comercio estable y prudente.


/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Advanced Strategy with Volume and Price Retracement and Multi-Take Profit (USDT)", overlay=true)

// Parametreler
fastLength = input(12, minval=1, title="Fast Moving Average")
slowLength = input(26, minval=1, title="Slow Moving Average")
rsiPeriod = input(14, minval=1, title="RSI Period")
volLength = input(20, minval=1, title="Volume MA Length")
volMultiplier = input(2.0, title="Volume Spike Multiplier")
trailOffset = input(1, title="Trailing Offset (%)")
usdtPerTrade = input(50000, title="USDT per Trade")
retraceFactor = input(0.8, title="Retracement Factor for Entry")
takeProfit1 = input(1, title="Take Profit 1 (%)")
takeProfit2 = input(2, title="Take Profit 2 (%)")
takeProfit3 = input(3, title="Take Profit 3 (%)")
trailForTP = input(true, title="Use Trailing Stop for Take Profits")

// Hesaplamalar
fastMA = sma(close, fastLength)
slowMA = sma(close, slowLength)
rsi = rsi(close, rsiPeriod)
volMA = sma(volume, volLength)
volumeSpike = volume > volMA * volMultiplier

// Durum Değişkenleri ve Saklanan Değerler
var float spikeVolume = na
var float spikePrice = na
var int direction = 0

// Alım/Satım Sinyalleri
longCondition = crossover(fastMA, slowMA) and rsi < 70
shortCondition = crossunder(fastMA, slowMA) and rsi > 30

// Hacim Spike ve Fiyat Hareketinin Saklanması
if (longCondition and volumeSpike)
    spikeVolume := volume
    spikePrice := close
    direction := 1
else if (shortCondition and volumeSpike)
    spikeVolume := volume
    spikePrice := close
    direction := -1

// Retracement Kontrolü ve Giriş Emirleri
if (direction == 1 and volume < spikeVolume * retraceFactor and close < spikePrice * (1 - trailOffset / 100))
    strategy.entry("Long", strategy.long, qty=usdtPerTrade / close)
    spikeVolume := na
    direction := 0
else if (direction == -1 and volume < spikeVolume * retraceFactor and close > spikePrice * (1 + trailOffset / 100))
    strategy.entry("Short", strategy.short, qty=usdtPerTrade / close)
    spikeVolume := na
    direction := 0

// Take Profit Emirleri
if strategy.position_size > 0
    strategy.exit("TP1", "Long", limit=strategy.position_avg_price * (1 + takeProfit1 / 100), qty_percent=33, trail_offset=trailForTP ? atr(14) / 2 : na)
    strategy.exit("TP2", "Long", limit=strategy.position_avg_price * (1 + takeProfit2 / 100), qty_percent=33, trail_offset=trailForTP ? atr(14) : na)
    strategy.exit("TP3", "Long", limit=strategy.position_avg_price * (1 + takeProfit3 / 100), qty_percent=34, trail_offset=trailForTP ? atr(14) * 1.5 : na)

if strategy.position_size < 0
    strategy.exit("TP1", "Short", limit=strategy.position_avg_price * (1 - takeProfit1 / 100), qty_percent=33, trail_offset=trailForTP ? atr(14) / 2 : na)
    strategy.exit("TP2", "Short", limit=strategy.position_avg_price * (1 - takeProfit2 / 100), qty_percent=33, trail_offset=trailForTP ? atr(14) : na)
    strategy.exit("TP3", "Short", limit=strategy.position_avg_price * (1 - takeProfit3 / 100), qty_percent=34, trail_offset=trailForTP ? atr(14) * 1.5 : na)

// Pozisyon çıkışları
strategy.close("Long", when=shortCondition)
strategy.close("Short", when=longCondition)


Más.