Estrategia de negociación de indicadores de doble media móvil triple exponencial

El autor:¿ Qué pasa?, Fecha: 2023-12-15 15:39:45
Las etiquetas:

img

Resumen general

Esta estrategia utiliza indicadores de media móvil doble y indicadores de media móvil triple exponencial, combinados con indicadores estocásticos, para formar una estrategia de trading de seguimiento de tendencias relativamente estable y confiable.

Principios

Esta estrategia consta principalmente de cuatro partes:

  1. Indicador de media móvil doble: Calcula las medias móviles exponenciales (EMA) de 50 y 100 períodos respectivamente.

  2. Indicador exponencial triple: Calcula los promedios móviles exponenciales de 50 períodos, 100 períodos y 200 períodos para determinar la dirección de la tendencia del mercado. Cuando 50EMA> 100EMA> 200EMA, es un mercado alcista. Cuando 50EMA < 100EMA < 200EMA, es un mercado bajista.

  3. Indicador estocástico: Cálcula los valores de K y D de 6 días del RSI para determinar las condiciones de sobrecompra y sobreventa. Cuando el valor de K cruza por encima del valor de D, está sobrevendido. Cuando cruza por debajo, está sobrecomprado.

  4. Indicadores de negociación: Sólo cuando el indicador de media móvil dual genere una señal al mismo tiempo que el mercado se ajusta al estado alcista o bajista de la media móvil exponencial triple, y el indicador estocástico no muestre sobrecompra o sobreventa, se emitirán órdenes de negociación verdaderas.

Ventajas

Esta estrategia combina las ventajas de los indicadores de promedio móvil y los indicadores estocásticos. Toma en cuenta tanto el juicio de la dirección de la tendencia como el estado de sobrecompra / sobreventa del mercado al emitir señales comerciales, filtrando así el ruido de manera más efectiva para rastrear tendencias más claras. Además, utiliza el triple promedio móvil exponencial para determinar la tendencia general, lo que hace que las señales sean más confiables.

Riesgos y contramedidas

El mayor riesgo de esta estrategia es que se basa en juicios de indicadores. Cuando el indicador da señales erróneas, puede llevar fácilmente a operaciones fallidas. Además, al usar promedios móviles de ciclo más largo para determinar la tendencia general, también se pueden perder algunas oportunidades a corto plazo. Las principales contramedidas de riesgo son las siguientes:

  1. Optimizar los parámetros de los indicadores y ajustar las combinaciones de ciclos de medias móviles dobles y medias móviles exponenciales triples para adaptarlas mejor a las características del mercado.

  2. Incorporar más indicadores para las operaciones CANCEL, terminando las operaciones en curso cuando el mercado muestra fluctuaciones drásticas.

  3. Emplear estrategias alcistas auxiliares a corto plazo para capitalizar las oportunidades a corto plazo en los mercados alcistas a largo plazo.

Direcciones de optimización

Entre los principales aspectos en los que se puede optimizar esta estrategia figuran:

  1. Ajustar los parámetros del ciclo de la media móvil dual y de la media móvil exponencial triple para optimizar la adaptación de los indicadores a las características del mercado.

  2. Aumentar el volumen, el MACD y otros juicios para evitar movimientos anormales de precios que causan señales erróneas.

  3. Es mejor confirmar las tendencias usando patrones de candlesticks para evitar señales erróneas después de retrocesos a corto plazo.

  4. Ampliarlo a más variedades como acciones, divisas y probar la adaptabilidad de la estrategia.

  5. Incorporar indicadores VIX para determinar la volatilidad general del mercado y controlar el tamaño de las posiciones.

Conclusión

Esta estrategia utiliza dos indicadores de promedio móvil para emitir señales comerciales, con tres promedios móviles exponenciales y indicadores estocásticos como complementos, construyendo así una estrategia de seguimiento de tendencias relativamente estable. Es simple, fácil de implementar, altamente adaptada a las características del mercado, ofreciendo retornos estables. Es una estrategia cuantitativa que vale la pena recomendar. A través de optimizaciones específicas, tiene el potencial de lograr resultados aún mejores.


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

//@version=5
strategy(title='5212 EMA Strategy', shorttitle='5212 EMA', overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

//**Backtest Date sof
useStartPeriodTime  = input.bool(true                       , 'Start Date & Time'   , group='Date Range'    , inline='Start Period')
startPeriodTime     = input(timestamp('16 Apr 2021')   , ''                    , group='Date Range'    , inline='Start Period')
useEndPeriodTime    = input.bool(false                      , 'End Date & Time'     , group='Date Range'    , inline='End Period')
endPeriodTime       = input(timestamp('31 Dec 2222')   , ''                    , group='Date Range'    , inline='End Period')
enableHighlight     = input.bool(false                      , 'Highlight'           , group='Date Range'    , inline='Highlight')
highlightType       = input.string('Anchors'                , ''                    , group='Date Range'    , inline='Highlight'    , options=['Anchors', 'Background'])
highlightColor      = input.color(color.white               , ''                    , group='Date Range'    , inline='Highlight')
start = useStartPeriodTime ? startPeriodTime >= time : false
end = useEndPeriodTime ? endPeriodTime <= time : false
calcPeriod = true
// var line startAnchor    = line.new(na, na, na, na, xloc.bar_time, extend.both, highlightColor, width=2)
// var line endAnchor      = line.new(na, na, na, na, xloc.bar_time, extend.both, highlightColor, width=2)
// useBgcolor = false
// if enableHighlight
//     if highlightType == 'Anchors'
//         if useStartPeriodTime
//             line.set_xy1(startAnchor, startPeriodTime, low)
//             line.set_xy2(startAnchor, startPeriodTime, high)
//         if useEndPeriodTime
//             line.set_xy1(endAnchor, calcPeriod ? time : line.get_x1(endAnchor), low)
//             line.set_xy2(endAnchor, calcPeriod ? time : line.get_x1(endAnchor), high)

//     if highlightType == 'Background'
//         useBgcolor := true
//         useBgcolor

// bgcolor(useBgcolor and calcPeriod ? color.new(highlightColor,90) : na, editable=false)
//**Backtest Date eof

src         =input(close    , 'Source'      , group='Support')
showEMA     = input(true    , 'Show EMA'    , group='Support')

//**Stochastic RSI sof
smoothK     = input.int(6   , "K"               , group='Stochastic RSI'    , minval=1)
smoothD     = input.int(6   , "D"               , group='Stochastic RSI'    , minval=1)
lengthRSI   = input.int(28  , "RSI Length"      , group='Stochastic RSI'    , minval=1)
lengthStoch = input.int(28  , "Stoch Length"    , group='Stochastic RSI'    , minval=1)

rsi1    = ta.rsi(src, lengthRSI)
k       = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d       = ta.sma(k, smoothD)
//**STochastic RSI eof

//** EMA sof
emain01     = input.int(50  , "EMAma Girang"    , group='Moving Average Exponential'    , minval=1)
emain02     = input.int(100 , "EMAma Muda"      , group='Moving Average Exponential'    , minval=1)
emain03     = input.int(200 , "EMAma Tua"       , group='Moving Average Exponential'    , minval=1)

ema01 = ta.ema(src, emain01)
ema02 = ta.ema(src, emain02)
ema03 = ta.ema(src, emain03)
plot(showEMA ? ema01 : na, 'EMAma Girang'   , color = color.new(color.orange, 0))
plot(showEMA ? ema02 : na, 'EMAma Muda'     , color = color.new(color.blue, 0))
plot(showEMA ? ema03 : na, 'EMAma Tua'      , color = color.new(color.red, 0))
//** EMA eof

//**Condition sof
emaLong     = ema01 > ema02 and ema02 > ema03 and low > ema03
emaShort    = ema01 < ema02 and ema02 < ema03 and high < ema03

longCond    = ta.crossover(k,d) and k <= 23 and emaLong
shortCond   = ta.crossunder(k,d) and k >= 77 and emaShort

longClose   = ta.crossunder(k,d) and k <= 77
shortClose  = ta.crossover(k,d) and k >= 23
longCross   = ta.crossover(ema01, ema02)
shortCross  = ta.crossunder(ema01, ema02)
//**Condition eof

//**Strategy sof
if calcPeriod and longCond
    strategy.entry('long', strategy.long, when=longCond, comment='EN Long')
strategy.close('long', when=shortClose, comment='EX Long')
strategy.close('long', when=shortCross, comment='MD Short')

if calcPeriod and shortCond
    strategy.entry('short', strategy.short, when=shortCond, comment='EN Short')
strategy.close('short', when=longClose, comment='EX Short')
strategy.close('short', when=longCross, comment='MD Long')

if calcPeriod == false and ta.crossover(ema01, ema02) or ta.crossunder(ema01, ema02)
    strategy.cancel('long')
    strategy.cancel('short')
//**Strategy eof

//**Label sof
entryText       = str.tostring(strategy.position_avg_price, '##.###')
longText    = 'Long Entry : ' + entryText 
shortText   = 'Short Entry : ' + entryText
noTrade     = 'Sleeping Mode'

LongTrade = strategy.position_size > 0
ShortTrade = strategy.position_size < 0

Tekslabel = LongTrade ? longText : ShortTrade ? shortText : noTrade

xPosition = timenow + math.round(ta.change(time)*1)
yPosition = ta.highest(1)
labelColor = LongTrade ? color.new(color.aqua, 0) : ShortTrade ? color.new(color.red, 0) : color.new(color.gray, 0)
textColor   = LongTrade ? color.new(color.black, 0) : ShortTrade ? color.new(color.white, 0) : color.new(color.white, 0)

// lab_l = label.new(
//           xPosition, yPosition, Tekslabel,
//           color=labelColor, 
//           textcolor=textColor, 
//           style =  label.style_label_left,
//           textalign=text.align_left,
//           xloc=xloc.bar_time, yloc = yloc.price)

// label.delete(lab_l[1])
//**Strategy eof


Más.