Estrategia de aumento continuo de la cruz dorada con doble clic en la media móvil


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

Estrategia de aumento continuo de la cruz dorada con doble clic en la media móvil

Descripción general

Esta es una estrategia de negociación que utiliza la forma de la horquilla de oro de la media móvil, en combinación con la línea de tendencia que continúa creciendo. Cuando la línea rápida rompe la línea lenta desde la dirección inferior, se forma una señal de horquilla. Si la tendencia después de la horquilla continúa hacia arriba, se puede hacer más posiciones en esta etapa.

Principio de estrategia

La estrategia se basa principalmente en la forma de la horca de oro de las medias móviles para determinar el momento de entrada. En concreto, se define una media móvil rápida MA1 y una media móvil lenta MA2. Cuando la MA1 se rompe con la MA2 desde abajo, es una señal de hacer más.

Para evitar las falsas señales causadas por el tenedor de oro a corto plazo, la estrategia incluye un juicio de desvalorización de ángulo, es decir, la señal de compra se activa solo cuando el ángulo de MA2 es mayor que el desvalorización establecida. Esto puede filtrar algunos aumentos a corto plazo no tendenciales.

La estrategia establece una línea de stop loss y una línea de stop loss a la vez. La línea de stop loss se utiliza para evitar pérdidas causadas por una brusca inversión del mercado, y la línea de stop loss se utiliza para bloquear la salida de ganancias. Se establece específicamente como un determinado rango porcentual del precio de entrada.

Cuando el precio sube hasta el punto de parada, la estrategia elige la parada y abandona. Al mismo tiempo, si el precio sube más fuerte en esta ronda, la estrategia vuelve a hacer la operación inversa de descubierto.

Análisis de las ventajas

Se trata de una estrategia de seguimiento de tendencias más sencilla e intuitiva que tiene las siguientes ventajas:

  1. El uso de combinaciones de promedios móviles para filtrar el ruido del mercado y bloquear la dirección de la tendencia
  2. Los valores de los ángulos pueden evitar ser engañados por las oscilaciones a corto plazo.
  3. La operación bidireccional puede ser rentable en situaciones de crisis
  4. Establecer paradas de pérdidas y controlar el riesgo

Análisis de riesgos

La estrategia también tiene algunos riesgos a tener en cuenta:

  1. Los promedios móviles están rezagados y pueden haber perdido el punto de inflexión
  2. A pesar de los paros, existe una probabilidad de que se superen en un mercado que cambia rápidamente
  3. Los riesgos de las transacciones bilaterales se han duplicado y la mala selección de puntos de venta puede causar pérdidas.
  4. Los parámetros mal configurados, como la selección de un promedio móvil, pueden afectar el rendimiento de la estrategia

Dirección de optimización

Se puede optimizar aún más la estrategia en los siguientes aspectos:

  1. Aumento de indicadores de tendencia, como el MACD, las bandas de Brin y otros, para mejorar la precisión de la ubicación
  2. Parámetros de ciclo para la optimización dinámica de medias móviles con métodos como el aprendizaje automático
  3. Optimización de la configuración de la parada de pérdidas, como la adopción de la parada de seguimiento de pérdidas
  4. Aumentar el control del volumen de transacciones para evitar pérdidas excesivas
  5. Indicadores como el índice de segmento determinan la intensidad de la tendencia de esta ronda y el ajuste dinámico de la fuerza de apertura de posición inversa

Resumir

En general, es una estrategia de seguimiento de tendencias sencilla y práctica. Tiene ciertas ventajas, pero también requiere atención al riesgo. Se pueden obtener mejores ganancias estables mediante la optimización de parámetros adicionales, la selección de indicadores, la configuración de paradas de pérdidas, etc. Pero ninguna estrategia puede evitar completamente el riesgo sistemático del mercado.

Código Fuente de la Estrategia
/*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 [email protected]
//@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")