Estrategia de negociación de medias móviles de avance dinámico


Fecha de creación: 2023-11-13 10:27:54 Última modificación: 2023-11-13 10:27:54
Copiar: 0 Número de Visitas: 644
1
Seguir
1617
Seguidores

Estrategia de negociación de medias móviles de avance dinámico

Descripción general

La idea principal de esta estrategia es la construcción de múltiples líneas medias utilizando el indicador Ratio OCHL Averager de diferentes períodos, generando señales de compra y venta en función de la forma cruzada de las líneas medias. Es capaz de capturar dinámicamente las tendencias de los precios y es adecuado para el comercio a corto plazo.

Principio de estrategia

La estrategia utiliza dos indicadores Ratio OCHL Averager de diferentes períodos, respectivamente como línea rápida y línea lenta. La fórmula para calcular el indicador Ratio OCHL Averager es la siguiente:

b = abs(close-open)/(high - low) 
c = min(max(b, 0), 1)
Ratio OCHL Averager = c*close + (1-c)*前一日Ratio OCHL Averager

Donde b es la proporción que representa la fluctuación de los precios del día, y c es el valor de b después de su tratamiento estandarizado. El indicador Ratio OCHL Averager integra los cuatro precios de apertura, cierre, máximo y mínimo para construir una línea media.

La estrategia establece un ciclo de línea rápida corto y un ciclo de línea lenta largo. Cuando la línea rápida atraviesa la línea lenta, genera una señal de compra, y viceversa, cuando la línea rápida atraviesa la línea lenta, genera una señal de venta.

Ventajas estratégicas

  1. El indicador Ratio OCHL Averager puede suavizar los datos de precios, filtrar el ruido del mercado y hacer que las señales de negociación sean más confiables.

  2. La intersección de dos líneas equiláteras en combinación con diferentes períodos para determinar la dirección de la tendencia, puede determinar mejor el comienzo de una nueva tendencia.

  3. Se pueden ajustar los parámetros de ciclo de las líneas rápidas y lentas para adaptarse a diferentes entornos de mercado.

  4. La estrategia es simple, intuitiva y fácil de entender.

  5. Se puede configurar con flexibilidad los parámetros de stop loss y controlar el riesgo.

Riesgo estratégico

  1. Las estrategias de cruce de línea media pueden generar más señales falsas y requieren filtración en combinación con otros indicadores técnicos.

  2. Se requiere una selección razonable de los parámetros de ciclo de las líneas rápidas y lentas. La selección incorrecta de los parámetros puede afectar la eficacia de la estrategia.

  3. La estrategia de cruce de dos líneas uniformes es una estrategia de seguimiento de tendencias, no es adecuada para situaciones de crisis, y debe usarse en situaciones de tendencias.

  4. Los puntos de parada deben ajustarse adecuadamente para reducir el riesgo de pérdidas, y los puntos de parada deben establecerse de manera razonable.

Dirección de optimización

  1. Se puede considerar la posibilidad de filtrar la señal en combinación con indicadores de potencia, etc., para mejorar la calidad de la señal. Por ejemplo, MACD, KDJ, etc.

  2. Se pueden probar diferentes combinaciones de parámetros de ciclo rápido y lento para encontrar el parámetro óptimo.

  3. Se puede optimizar el punto de parada de pérdidas en función de los resultados de la retroalimentación para encontrar la configuración óptima.

  4. Se pueden considerar parámetros de ajuste dinámico en un entorno de mercado específico, como el aumento de los parámetros de ciclo en una gran oscilación de la bolsa.

Resumir

La estrategia general es clara y fácil de entender, y la dirección de la tendencia se determina mediante el cruce de la línea media rápida y lenta. Es una estrategia de seguimiento dinámico adecuada para el comercio a corto y medio plazo.

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

//@version=4
strategy(title="[XC] Adaptive Strategy V3 - Ratio OCHL Averager no repaint",shorttitle="R_OHCL", overlay=true, currency=currency.EUR,initial_capital=10000,
     default_qty_value=100, default_qty_type=strategy.percent_of_equity , calc_on_every_tick=false, calc_on_order_fills=true)


//                  ╔═ SETTINGS                  ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

strategy_1     = input ( defval=true   , type=input.bool    , title="STRATEGY 1? —>"      )
Recursive      = input(false)
RES201         = "Min",RES202= "D",RES203 = "W",RES204 = "M"

//++ Resolution 1 ++
inp_resolution1 = input(600, minval=1, title="Resolution Line 1")
restype1        = input ( defval="Min"  , type=input.string , title= "Resolution Line 1" , options=[ "Min","D","W","M"])
multiplier1     = restype1 == "Min" ? "" : restype1 == "D" ? "D" : restype1 == "W" ? "W" : "M"
resolution1     = tostring(inp_resolution1)+ multiplier1

//++ Resolution 2 ++
inp_resolution2 = input(1440, minval=1, title="Resolution Line 2")
restype2        = input ( defval="Min"  , type=input.string , title= "Resolution Line 2" , options=["Min","D","W","M"])
multiplier2     = restype2 == "Min" ? "" : restype2 == "D" ? "D" : restype2 == "W" ? "W" : "M"
resolution2     = tostring(inp_resolution2)+ multiplier2

StopLoss        = input(defval = 500 , title = "Stop Loss", minval = 0)
TakeProfit      = input(defval = 2500 , title = "Take Profit", minval = 0)
// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = TakeProfit  >= 1 ? TakeProfit  : na
useStopLoss     = StopLoss    >= 1 ? StopLoss    : na


//                  ╔═ BACKTEST RANGE            ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
line_breakBTR  = input ( defval = true   , type=input.bool   , title="BACKTEST RANGE —"      ) 
FromYear       = input ( defval = 2019, title = "From Year", minval = 2017)
FromMonth      = input ( defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay        = input ( defval = 2, title = "From Day", minval = 1, maxval = 31)
//FromHour     = input ( defval = 1, title = "From Hour", minval = 1, maxval = 24)
ToYear         = input ( defval = 9999, title = "To Year", minval = 2017)
//ToHour       = input ( defval = 0, title = "From Hour", minval = 0, maxval = 24)
ToMonth        = input ( defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay          = input ( defval = 1, title = "To Day", minval = 1, maxval = 31)

// === FUNCTION EXAMPLE ===
start     = timestamp(syminfo.timezone, FromYear, FromMonth, FromDay, 0, 00)  // backtest start window
finish    = timestamp(syminfo.timezone, ToYear  , ToMonth  , ToDay  , 0, 59)  // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

//                  ╔═ INDICATOR                 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

// "Ratio OCHL Averager" -> alexgrover / tradingview.com/script/RGAtOI6h-Ratio-OCHL-Averager-An-Alternative-to-VWAP/

rochla( res,Recursive)=>
    //Recursive = false
    H =  security(syminfo.tickerid,res,high[1],gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    L =  security(syminfo.tickerid,res,low[1] ,gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    d = 0.
    //----
    a = Recursive ? nz(d[1],open) : open
    b = abs(close-a)/(H - L)
    c = b > 1 ? 1 : b
    d := c*close+(1-c)*nz(d[1],close)



strat1_line1=rochla(resolution1,Recursive)
strat1_line2=rochla(resolution2,Recursive)

plot(strat1_line1, title="Ratio OCHL Averager 1", color=#DAA520,linewidth=2,transp=0)
plot(strat1_line2, title="Ratio OCHL Averager 2", color=#B22222,linewidth=2,transp=0)



//                  ╔═ STRATEGY 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

trading_strat1_line1 = strategy_1 == 1    ? strat1_line1   : na
trading_strat1_line2 = strategy_1 == 1    ? strat1_line2   : na

longCross  = crossunder (trading_strat1_line2, trading_strat1_line1) ? true : false
shortCross = crossover  (trading_strat1_line2, trading_strat1_line1) ? true : false

plot( longCross  ? trading_strat1_line1 : na , title = "Long"  , color=color.aqua, style=plot.style_circles, linewidth=5, offset= 0)
plot( shortCross ? trading_strat1_line2 : na , title = "Short" , color=color.red , style=plot.style_circles, linewidth=5, offset= 0)



//                  ╔═ Backtest 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░


strategy.exit("close",loss = useStopLoss, profit = useTakeProfit)

if longCross  and window() and strategy_1 == 1 
    strategy.entry("Go Long", strategy.long)
if shortCross and window() and strategy_1 == 1 
    strategy.entry("Go Short", strategy.short)

//end