Sistema de comercio inteligente con toma de ganancias dinámica y seguimiento de tendencias que combina la media móvil dual y el MACD

MA MACD SMA EMA TP SL PIPS
Fecha de creación: 2024-12-13 11:23:00 Última modificación: 2024-12-13 11:23:00
Copiar: 0 Número de Visitas: 434
1
Seguir
1617
Seguidores

Sistema de comercio inteligente con toma de ganancias dinámica y seguimiento de tendencias que combina la media móvil dual y el MACD

Descripción general

La estrategia es un sistema de seguimiento de tendencias que combina dos medias móviles y un indicador MACD. Utiliza medias móviles de 50 y 200 para determinar la dirección de la tendencia, mientras que utiliza el indicador MACD para capturar momentos de entrada específicos. La estrategia adopta un mecanismo de stop-loss dinámico y mejora la calidad de las operaciones mediante múltiples condiciones de filtración.

Principio de estrategia

La lógica central de la estrategia se basa en los siguientes elementos clave:

  1. Determinación de la tendencia: se utiliza la relación de posición de la línea media de 50 y la línea media de 200 para determinar la tendencia general. La línea media rápida se determina como una tendencia alcista cuando está por encima de la línea media lenta, y viceversa como una tendencia descendente.
  2. Señales de entrada: después de confirmar la dirección de la tendencia, se utiliza la cruz de los indicadores MACD para activar una señal de entrada específica. En una tendencia ascendente, la línea MACD hace más entrada cuando atraviesa la línea de señal; en una tendencia descendente, la línea MACD baja cuando atraviesa la línea de señal y hace una entrada en blanco.
  3. Filtración de operaciones: Se introduce un mecanismo de filtración múltiple, como el mínimo intervalo de operaciones, la intensidad de la tendencia y la desvalorización del MACD, para evitar el exceso de operaciones en un entorno de mercado muy volátil.
  4. Control de riesgo: Se utiliza un mecanismo de stop loss y un control de frenado ajustable con un número fijo de puntos, combinado con una línea de media móvil y una señal de retroceso del MACD como condición de salida dinámica.

Ventajas estratégicas

  1. El seguimiento de tendencias se combina con la dinámica: mediante la combinación de las medias móviles y el indicador MACD, se puede comprender la gran tendencia y determinar con precisión el momento de entrada.
  2. Una buena gestión de riesgos: la configuración de múltiples mecanismos de suspensión de pérdidas, incluyendo suspensión de pérdidas fijas y suspensión de pérdidas dinámicas provocadas por indicadores técnicos.
  3. Ajuste de parámetros flexible: los parámetros clave, como el número de puntos de parada de pérdidas, el ciclo de la línea media, etc., se pueden ajustar de manera flexible según las condiciones del mercado.
  4. Mecanismo de filtración inteligente: reduce las señales falsas y mejora la calidad de las transacciones mediante múltiples condiciones de filtración.
  5. Estadísticas de rendimiento completas: incluye funciones de estadísticas de transacciones detalladas, incluyendo el cálculo en tiempo real de indicadores clave como la tasa de ganancias y pérdidas promedio.

Riesgo estratégico

  1. Riesgo de mercado de la oscilación: Las falsas señales pueden ser frecuentes en los mercados de oscilación horizontal, por lo que se recomienda agregar indicadores de confirmación de tendencia.
  2. Riesgo de deslizamiento: las operaciones de corto plazo son susceptibles a deslizamientos, por lo que se recomienda una tolerancia adecuada de los parámetros de pérdidas.
  3. Sensibilidad a los parámetros: el rendimiento de la estrategia es sensible a los parámetros establecidos y requiere una optimización adecuada de los parámetros.
  4. Dependencia del entorno del mercado: las estrategias funcionan mejor en mercados con tendencias fuertes, pero su eficacia puede ser inestable en otros entornos del mercado.

Dirección de optimización de la estrategia

  1. Optimización dinámica de los paros: se puede ajustar la amplitud de los paros en función de la dinámica de los indicadores ATR, para que se adapte mejor a la volatilidad del mercado.
  2. Optimización de la hora de entrada: se pueden agregar indicadores auxiliares como el RSI para confirmar la hora de entrada y mejorar la precisión de la operación.
  3. Optimización de la gestión de posiciones: Introducción de un sistema de gestión de posiciones dinámico basado en la volatilidad para un mejor control del riesgo.
  4. Identificación de entornos de mercado: agregar módulos de identificación de entornos de mercado para usar diferentes combinaciones de parámetros en diferentes condiciones de mercado.

Resumir

Es una estrategia de seguimiento de tendencias de diseño razonable y lógico. Combinando indicadores técnicos clásicos con métodos modernos de gestión de riesgos, la estrategia se centra en el control de los riesgos al tiempo que capta las tendencias. A pesar de que hay algunos lugares que necesitan optimización, en general es una estrategia de negociación de valor práctico.

Código Fuente de la Estrategia
/*backtest
start: 2024-11-12 00:00:00
end: 2024-12-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © WolfofAlgo

//@version=5
strategy("Trend Following Scalping Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=200)

// Input Parameters
stopLossPips = input.float(5.0, "Stop Loss in Pips", minval=1.0)
takeProfitPips = input.float(10.0, "Take Profit in Pips", minval=1.0)
useFixedTakeProfit = input.bool(true, "Use Fixed Take Profit")

// Moving Average Parameters
fastMA = input.int(50, "Fast MA Period")
slowMA = input.int(200, "Slow MA Period")

// MACD Parameters
macdFastLength = input.int(12, "MACD Fast Length")
macdSlowLength = input.int(26, "MACD Slow Length")
macdSignalLength = input.int(9, "MACD Signal Length")

// Trade Filter Parameters (Adjusted to be less strict)
minBarsBetweenTrades = input.int(5, "Minimum Bars Between Trades", minval=1)
trendStrengthPeriod = input.int(10, "Trend Strength Period")
minTrendStrength = input.float(0.4, "Minimum Trend Strength", minval=0.1, maxval=1.0)
macdThreshold = input.float(0.00005, "MACD Threshold", minval=0.0)

// Variables for trade management
var int barsLastTrade = 0
barsLastTrade := nz(barsLastTrade[1]) + 1

// Calculate Moving Averages
ma50 = ta.sma(close, fastMA)
ma200 = ta.sma(close, slowMA)

// Calculate MACD
[macdLine, signalLine, _] = ta.macd(close, macdFastLength, macdSlowLength, macdSignalLength)

// Calculate trend strength (simplified)
trendDirection = ta.ema(close, trendStrengthPeriod) > ta.ema(close, trendStrengthPeriod * 2)
isUptrend = close > ma50 and ma50 > ma200
isDowntrend = close < ma50 and ma50 < ma200

// Calculate pip value
pointsPerPip = syminfo.mintick * 10

// Entry Conditions with Less Strict Filters
macdCrossUp = ta.crossover(macdLine, signalLine) and math.abs(macdLine - signalLine) > macdThreshold
macdCrossDown = ta.crossunder(macdLine, signalLine) and math.abs(macdLine - signalLine) > macdThreshold

// Long and Short Conditions
longCondition = close > ma50 and macdCrossUp and barsLastTrade >= minBarsBetweenTrades and isUptrend
shortCondition = close < ma50 and macdCrossDown and barsLastTrade >= minBarsBetweenTrades and isDowntrend

// Exit Conditions (made more lenient)
exitLongCondition = macdCrossDown or close < ma50
exitShortCondition = macdCrossUp or close > ma50

// Reset bars counter on new trade
if (longCondition or shortCondition)
    barsLastTrade := 0

// Calculate stop loss and take profit levels
longStopPrice = strategy.position_avg_price - (stopLossPips * pointsPerPip)
longTakeProfitPrice = strategy.position_avg_price + (takeProfitPips * pointsPerPip)
shortStopPrice = strategy.position_avg_price + (stopLossPips * pointsPerPip)
shortTakeProfitPrice = strategy.position_avg_price - (takeProfitPips * pointsPerPip)

// Plot Moving Averages
plot(ma50, "50 MA", color=color.blue)
plot(ma200, "200 MA", color=color.red)

// Plot Entry Signals
plotshape(longCondition, "Long Signal", shape.triangleup, location.belowbar, color.green, size=size.small)
plotshape(shortCondition, "Short Signal", shape.triangledown, location.abovebar, color.red, size=size.small)

// Strategy Entry Rules
if (longCondition and strategy.position_size == 0)
    strategy.entry("Long", strategy.long)

if (shortCondition and strategy.position_size == 0)
    strategy.entry("Short", strategy.short)

// Strategy Exit Rules
if (strategy.position_size > 0 and exitLongCondition)
    strategy.close("Long")

if (strategy.position_size < 0 and exitShortCondition)
    strategy.close("Short")

// Stop Loss and Take Profit Management
if (strategy.position_size > 0)
    strategy.exit("Long TP/SL", "Long", stop=longStopPrice, limit=useFixedTakeProfit ? longTakeProfitPrice : na)

if (strategy.position_size < 0)
    strategy.exit("Short TP/SL", "Short", stop=shortStopPrice, limit=useFixedTakeProfit ? shortTakeProfitPrice : na)

// Performance Metrics
var float totalTrades = 0
var float winningTrades = 0
var float totalProfitPips = 0
var float totalLossPips = 0

if (strategy.closedtrades > 0)
    totalTrades := strategy.closedtrades
    winningTrades := strategy.wintrades
    totalProfitPips := strategy.grossprofit / pointsPerPip
    totalLossPips := math.abs(strategy.grossloss) / pointsPerPip

// Display Stats
var label statsLabel = na
label.delete(statsLabel[1])

// Create performance stats text
var string stats = ""
if (strategy.closedtrades > 0)
    winRate = (winningTrades / math.max(totalTrades, 1)) * 100
    avgWin = totalProfitPips / math.max(winningTrades, 1)
    avgLoss = totalLossPips / math.max(totalTrades - winningTrades, 1)
    plRatio = avgWin / math.max(avgLoss, 1)
    
    stats := "Win Rate: " + str.tostring(winRate, "#.##") + "%\n" +
             "Avg Win: " + str.tostring(avgWin, "#.##") + " pips\n" +
             "Avg Loss: " + str.tostring(avgLoss, "#.##") + " pips\n" +
             "P/L Ratio: " + str.tostring(plRatio, "#.##") + "\n" +
             "Total Trades: " + str.tostring(totalTrades, "#")

statsLabel := label.new(x=bar_index, y=high, text=stats, style=label.style_label_down, color=color.new(color.blue, 80))