Estrategia de la proporción MA del filtro de doble tendencia premium

El autor:¿ Qué pasa?, Fecha: 2023-12-28 17:37:14
Las etiquetas:

img

Resumen general

Esta estrategia se basa en el indicador de doble promedio móvil combinado con el filtro de bandas de Bollinger y el indicador de doble filtro de tendencia. Adopta mecanismos de salida encadenados para seguir la tendencia. Esta estrategia tiene como objetivo identificar la dirección de la tendencia a medio y largo plazo a través del indicador de promedio móvil.

Estrategia lógica

  1. Calcular el promedio móvil rápido (10 días) y el promedio móvil lento (50 días), obtener su relación llamada relación de promedio móvil de precios.
  2. Convierta la media móvil de precios en percentil, que representa la fuerza relativa de la relación actual en períodos pasados.
  3. Cuando el oscilador cruza por encima del umbral de entrada de compra (10), se activa la señal larga. Cuando cruza por debajo del umbral de venta (90), se activa la señal corta para seguir la tendencia.
  4. Combina con el índice de ancho de bandas de Bollinger para filtrar la señal.
  5. Utilice el indicador de filtro de tendencia doble, tomando sólo largo cuando el precio está en el canal de tendencia alcista y corto cuando está en tendencia bajista para evitar la negociación inversa.
  6. Las estrategias de salida de la cadena se establecen, incluidas las estrategias de toma de ganancias, stop loss y salida combinada.

Ventajas

  1. El doble filtro de tendencia garantiza la fiabilidad en la identificación de la tendencia principal, evitando la negociación inversa.
  2. El indicador del índice de MA detecta mejor el cambio de tendencia que el índice de MA único.
  3. El ancho de BB localiza efectivamente los períodos de baja volatilidad para señales más confiables.
  4. El mecanismo de salida en cadena maximiza la ganancia general.

Riesgos y soluciones

  1. Más señales falsas y reversiones con tendencia poco clara durante los mercados variados.
  2. La solución es acortar los parámetros de MA adecuadamente.
  3. La solución es establecer libremente el parámetro de stop loss.

Direcciones de optimización

  1. Optimización de parámetros en períodos de MA, umbrales de oscilador, parámetros BB mediante pruebas exhaustivas para encontrar la mejor combinación.
  2. Incorporar otros indicadores que juzguen la inversión de tendencia como KD, MACD para mejorar la precisión.
  3. Entrenamiento de modelos de aprendizaje automático con datos históricos para la optimización de parámetros dinámicos.

Resumen de las actividades

Esta estrategia integra el indicador de doble MA ratio y BB para determinar la tendencia a mediano y largo plazo. Ingresa al mercado en el mejor momento después de la confirmación de la tendencia con mecanismos encadenados de obtención de ganancias. Es altamente confiable y eficiente. Se pueden lograr mejoras adicionales a través de la optimización de parámetros, la adición de indicadores de inversión de tendencia y el aprendizaje automático.


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

//@version=4
strategy("Premium MA Ratio Strategy", overlay = true)

// Input: Adjustable parameters for Premium MA Ratio
fast_length = input(10, title = "Fast MA Length")
slow_length = input(50, title = "Slow MA Length")
oscillator_threshold_buy = input(10, title = "Oscillator Buy Threshold")
oscillator_threshold_sell = input(90, title = "Oscillator Sell Threshold")

// Input: Adjustable parameters for Bollinger Bands
bb_length = input(20, title = "Bollinger Bands Length")
bb_source = input(close, title = "Bollinger Bands Source")
bb_deviation = input(2.0, title = "Bollinger Bands Deviation")
bb_width_threshold = input(30, title = "BB Width Threshold")
use_bb_filter = input(true, title = "Use BB Width Filter?")

// Input: Adjustable parameters for Trend Filter
use_trend_filter = input(true, title = "Use Trend Filter?")
trend_filter_period_1 = input(50, title = "Trend Filter Period 1")
trend_filter_period_2 = input(200, title = "Trend Filter Period 2")
use_second_trend_filter = input(true, title = "Use Second Trend Filter?")

// Input: Adjustable parameters for Exit Strategies
use_exit_strategies = input(true, title = "Use Exit Strategies?")
use_take_profit = input(true, title = "Use Take Profit?")
take_profit_ticks = input(150, title = "Take Profit in Ticks")
use_stop_loss = input(true, title = "Use Stop Loss?")
stop_loss_ticks = input(100, title = "Stop Loss in Ticks")
use_combined_exit = input(true, title = "Use Combined Exit Strategy?")
combined_exit_ticks = input(50, title = "Combined Exit Ticks")

// Input: Adjustable parameters for Time Filter
use_time_filter = input(false, title = "Use Time Filter?")
start_hour = input(8, title = "Start Hour")
end_hour = input(16, title = "End Hour")

// Calculate moving averages
fast_ma = sma(close, fast_length)
slow_ma = sma(close, slow_length)

// Calculate the premium price moving average ratio
premium_ratio = fast_ma / slow_ma * 100

// Calculate the percentile rank of the premium ratio
percentile_rank(src, length) =>
    rank = 0.0
    for i = 1 to length
        if src > src[i]
            rank := rank + 1.0
    percentile = rank / length * 100

// Calculate the percentile rank for the premium ratio using slow_length periods
premium_ratio_percentile = percentile_rank(premium_ratio, slow_length)

// Calculate the oscillator based on the percentile rank
oscillator = premium_ratio_percentile

// Dynamic coloring for the oscillator line
oscillator_color = oscillator > 50 ? color.green : color.red

// Plot the oscillator on a separate subplot as a line
hline(50, "Midline", color = color.gray)
plot(oscillator, title = "Oscillator", color = oscillator_color, linewidth = 2)

// Highlight the overbought and oversold areas
bgcolor(oscillator > oscillator_threshold_sell ? color.red : na, transp = 80)
bgcolor(oscillator < oscillator_threshold_buy ? color.green : na, transp = 80)

// Plot horizontal lines for threshold levels
hline(oscillator_threshold_buy, "Buy Threshold", color = color.green)
hline(oscillator_threshold_sell, "Sell Threshold", color = color.red)

// Calculate Bollinger Bands width
bb_upper = sma(bb_source, bb_length) + bb_deviation * stdev(bb_source, bb_length)
bb_lower = sma(bb_source, bb_length) - bb_deviation * stdev(bb_source, bb_length)
bb_width = bb_upper - bb_lower

// Calculate the percentile rank of Bollinger Bands width
bb_width_percentile = percentile_rank(bb_width, bb_length)

// Plot the Bollinger Bands width percentile line
plot(bb_width_percentile, title = "BB Width Percentile", color = color.blue, linewidth = 2)

// Calculate the trend filters
trend_filter_1 = sma(close, trend_filter_period_1)
trend_filter_2 = sma(close, trend_filter_period_2)

// Strategy logic
longCondition = crossover(premium_ratio_percentile, oscillator_threshold_buy)
shortCondition = crossunder(premium_ratio_percentile, oscillator_threshold_sell)

// Apply Bollinger Bands width filter if enabled
if (use_bb_filter)
    longCondition := longCondition and bb_width_percentile < bb_width_threshold
    shortCondition := shortCondition and bb_width_percentile < bb_width_threshold

// Apply trend filters if enabled
if (use_trend_filter)
    longCondition := longCondition and (close > trend_filter_1)
    shortCondition := shortCondition and (close < trend_filter_1)

// Apply second trend filter if enabled
if (use_trend_filter and use_second_trend_filter)
    longCondition := longCondition and (close > trend_filter_2)
    shortCondition := shortCondition and (close < trend_filter_2)

// Apply time filter if enabled
if (use_time_filter)
    longCondition := longCondition and (hour >= start_hour and hour <= end_hour)
    shortCondition := shortCondition and (hour >= start_hour and hour <= end_hour)

// Generate trading signals with exit strategies
if (use_exit_strategies)
    strategy.entry("Buy", strategy.long, when = longCondition)
    strategy.entry("Sell", strategy.short, when = shortCondition)
    
    // Define unique exit names for each order
    buy_take_profit_exit = "Buy Take Profit"
    buy_stop_loss_exit = "Buy Stop Loss"
    sell_take_profit_exit = "Sell Take Profit"
    sell_stop_loss_exit = "Sell Stop Loss"
    combined_exit = "Combined Exit"
    
    // Exit conditions for take profit
    if (use_take_profit)
        strategy.exit(buy_take_profit_exit, from_entry = "Buy", profit = take_profit_ticks)
        strategy.exit(sell_take_profit_exit, from_entry = "Sell", profit = take_profit_ticks)
    
    // Exit conditions for stop loss
    if (use_stop_loss)
        strategy.exit(buy_stop_loss_exit, from_entry = "Buy", loss = stop_loss_ticks)
        strategy.exit(sell_stop_loss_exit, from_entry = "Sell", loss = stop_loss_ticks)
    
    // Combined exit strategy
    if (use_combined_exit)
        strategy.exit(combined_exit, from_entry = "Buy", loss = combined_exit_ticks, profit = combined_exit_ticks)



Más.