Estrategia de tendencia alcista persistente de doble media móvil cruzada

El autor:¿ Qué pasa?, Fecha: 2023-11-13 10:47:48
Las etiquetas:

img

Resumen general

Esta es una estrategia comercial que utiliza patrones de cruce promedio móvil junto con tendencia alcista persistente para entrar en operaciones. Cuando el MA rápido cruza por encima del MA lento, se genera una señal de cruce dorada. Si la tendencia alcista persiste después del cruce, se puede abrir una posición larga. Cuando el precio se eleva a los niveles de stop loss o take profit, la posición se puede cerrar para stop loss o take profit.

Estrategia lógica

La estrategia se basa principalmente en el cruce de promedio móvil para las señales de entrada. Específicamente, se definen un MA rápido (MA1) y un MA lento (MA2).

Para evitar señales falsas de cruces a corto plazo, se agrega un umbral de ángulo, de modo que una señal de compra solo se activa cuando el ángulo MA2 está por encima de un umbral establecido.

La estrategia también establece un stop loss y take profit. El stop loss evita pérdidas en caso de reversión repentina del mercado, mientras que los bloqueos de take profit en las ganancias. Se establecen como un rango porcentual del precio de entrada.

Cuando el precio sube para obtener ganancias, la estrategia cerrará largo para obtener ganancias.

Análisis de ventajas

Se trata de una estrategia de tendencia sencilla e intuitiva, con las siguientes ventajas:

  1. La combinación MA filtra el ruido del mercado y se bloquea en la dirección de la tendencia
  2. El umbral del ángulo evita ser engañado por las oscilaciones a corto plazo
  3. El comercio bidireccional permite sacar provecho de los mercados de rango limitado
  4. Control de pérdidas y ganancias

Análisis de riesgos

Hay algunos riesgos a tener en cuenta:

  1. Los MAs tienen retraso y pueden perder puntos de inflexión
  2. El stop loss no está garantizado, se puede abrir en mercados rápidos
  3. El comercio de doble filo duplica el riesgo, el momento de la entrada corta es clave
  4. El ajuste de parámetros deficiente como los períodos MA pueden afectar los resultados

Áreas de mejora

Algunas maneras de optimizar aún más la estrategia:

  1. Añadir filtros de tendencia como MACD, Bollinger para mejorar la precisión
  2. Utilice el aprendizaje automático para optimizar dinámicamente los períodos de MA
  3. Optimizar las configuraciones de stop loss y take profit, por ejemplo, los trailing stops.
  4. Añadir dimensionamiento de posiciones para limitar las pérdidas
  5. Medir la fuerza de la tendencia con ADX a la posición de reversión media del tamaño

Conclusión

En general, esta es una tendencia simple y práctica después de la estrategia. Tiene ventajas pero también riesgos. Los refinamientos adicionales como el ajuste de parámetros, indicadores óptimos, ajustes de stop loss, etc. pueden mejorarlo. Pero ninguna estrategia elimina completamente el riesgo sistémico.


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

//written by markjames12210@gmail.com
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")

Más.