Octa-EMA y la estrategia de negociación cuantitativa en la nube de Ichimoku

El autor:¿ Qué pasa?, fecha: 2023-12-11 14:52:05
Las etiquetas:

img

Resumen general

Esta estrategia utiliza 8 promedios móviles exponenciales (EMA) de diferentes períodos y la nube de Ichimoku como las principales señales de negociación, que pueden ejecutarse de manera efectiva en plazos de hora, 4 horas o diarios.

Principios de estrategia

Los principios fundamentales de esta estrategia se basan en las dos partes siguientes:

  1. 8 Promedios móviles exponenciales (Octa-EMA)

    Esta estrategia utiliza 8 EMA con diferentes períodos, específicamente 5 días, 11 días, 15 días, 18 días, 21 días, 24 días, 28 días y 34 días. Estos 8 EMA se denominan Octa-EMA. Cuando las EMA de período más corto están por encima de las EMA de período más largo, indica una tendencia alcista, y viceversa para una tendencia bajista.

  2. Nube de Ichimoku

    La nube de Ichimoku contiene la línea de conversión, la línea base, el lapso de retraso y los tramos principales A / B. La nube juzga principalmente la dirección de la tendencia y proporciona soporte / resistencia. Cuando el precio está por encima de la nube, indica una tendencia alcista, y cuando está por debajo de la nube, indica una tendencia bajista.

Las señales de negociación para esta estrategia provienen de la combinación de los dos componentes anteriores. Una señal de compra se genera cuando los 8 EMA están en un arreglo de tendencia alcista (EMA más corta por encima de la EMA más larga) y el precio está por encima de la nube de Ichimoku. Una señal de venta se genera cuando el arreglo de EMA gira a una tendencia bajista (EMA más corta cruzando por debajo de la EMA más larga).

Análisis de ventajas

Las principales ventajas de esta estrategia son las siguientes:

  1. Reduce las señales falsas a través del filtro de indicadores dobles
  2. La nube de Ichimoku juzga la dirección de la tendencia, evitando el comercio contra tendencia
  3. 8 cruces de la EMA se combinan para determinar las tendencias con mayor precisión
  4. Se puede ejecutar en varios marcos de tiempo
  5. Gran espacio de ajuste de parámetros, puede personalizar para diferentes productos

Análisis de riesgos

Esta estrategia también tiene algunos riesgos:

  1. Puede generar más señales de venta falsas durante los mercados de rango
  2. Las condiciones de compra estrictas pueden hacer perder algunas oportunidades de compra
  3. Puede fallar cuando las tendencias a corto y medio plazo entran en conflicto
  4. La regulación de los parámetros de EMA puede causar retraso en la señal

Para hacer frente a estos riesgos, se pueden ajustar parámetros u optimizar las condiciones de entrada para reducir el riesgo.

Direcciones de optimización

Esta estrategia puede optimizarse en varios aspectos:

  1. Ajustar los parámetros de la EMA para encontrar los períodos óptimos
  2. Añadir indicadores que determinen la tendencia para garantizar un juicio preciso de la tendencia
  3. Incorporar indicadores adicionales como MACD, KDJ para mejorar el tiempo de entrada
  4. Se aplican las siguientes condiciones:
  5. Parámetros de ensayo en diferentes productos para encontrar el mejor ajuste
  6. Utilice el aprendizaje automático para optimizar automáticamente los parámetros

Conclusión

En general, la estrategia de la nube de Octa-EMA y Ichimoku es un sistema de seguimiento de tendencias relativamente estable y confiable. Utiliza cruces de EMA para determinar tendencias e Ichimoku para filtrar señales, proporcionando bajas señales falsas cuando se optimiza. Esta estrategia se puede aplicar ampliamente en índices, divisas, metales, etc. en múltiples marcos de tiempo. Al incorporar indicadores de stop loss / take profit y confirmación, la tasa de ganancia y la rentabilidad se pueden mejorar aún más.


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//Fukuiz

strategy(title='Fukuiz Octa-EMA + Ichimoku', shorttitle='Fuku octa strategy', overlay=true, process_orders_on_close=true, 
     default_qty_type= strategy.cash , default_qty_value=1000, currency=currency.USD, initial_capital=10000 ,commission_type = strategy.commission.percent,commission_value=0.25)


//OCTA EMA ##################################################


// Functions
f_emaRibbon(_src, _e1, _e2, _e3, _e4, _e5, _e6, _e7, _e8) =>
    _ema1 = ta.ema(_src, _e1)
    _ema2 = ta.ema(_src, _e2)
    _ema3 = ta.ema(_src, _e3)
    _ema4 = ta.ema(_src, _e4)
    _ema5 = ta.ema(_src, _e5)
    _ema6 = ta.ema(_src, _e6)
    _ema7 = ta.ema(_src, _e7)
    _ema8 = ta.ema(_src, _e8)
    [_ema1, _ema2, _ema3, _ema4, _ema5, _ema6, _ema7, _ema8]

showRibbon = input(true, 'Show Ribbon (EMA)')
ema1Len = input(5, title='EMA 1 Length')
ema2Len = input(11, title='EMA 2 Length')
ema3Len = input(15, title='EMA 3 Length')
ema4Len = input(18, title='EMA 4 Length')
ema5Len = input(21, title='EMA 5 Length')
ema6Len = input(24, title='EMA 6 Length')
ema7Len = input(28, title='EMA 7 Length')
ema8Len = input(34, title='EMA 8 Length')

[ema1, ema2, ema3, ema4, ema5, ema6, ema7, ema8] = f_emaRibbon(close, ema1Len, ema2Len, ema3Len, ema4Len, ema5Len, ema6Len, ema7Len, ema8Len)

//Plot

ribbonDir = ema8 < ema2
p1 = plot(ema1, color=showRibbon ? ribbonDir ? #1573d4 : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 1')
p2 = plot(ema2, color=showRibbon ? ribbonDir ? #3096ff : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 2')
plot(ema3, color=showRibbon ? ribbonDir ? #57abff : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 3')
plot(ema4, color=showRibbon ? ribbonDir ? #85c2ff : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 4')
plot(ema5, color=showRibbon ? ribbonDir ? #9bcdff : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 5')
plot(ema6, color=showRibbon ? ribbonDir ? #b3d9ff : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 6')
plot(ema7, color=showRibbon ? ribbonDir ? #c9e5ff : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 7')
p8 = plot(ema8, color=showRibbon ? ribbonDir ? #dfecfb : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 8')
fill(p1, p2, color.new(#1573d4, 85))
fill(p2, p8, color.new(#1573d4, 85))

//ichimoku##################################################

//color
colorblue = #3300CC
colorred = #993300
colorwhite = #FFFFFF
colorgreen = #CCCC33
colorpink = #CC6699
colorpurple = #6633FF

//switch
switch1 = input(false, title='Chikou')
switch2 = input(false, title='Tenkan')
switch3 = input(false, title='Kijun')

middleDonchian(Length) =>
    lower = ta.lowest(Length)
    upper = ta.highest(Length)
    math.avg(upper, lower)

//Functions
conversionPeriods = input.int(9, minval=1)
basePeriods = input.int(26, minval=1)
laggingSpan2Periods = input.int(52, minval=1)
displacement = input.int(26, minval=1)
Tenkan = middleDonchian(conversionPeriods)
Kijun = middleDonchian(basePeriods)
xChikou = close
SenkouA = middleDonchian(laggingSpan2Periods)
SenkouB = (Tenkan[basePeriods] + Kijun[basePeriods]) / 2

//Plot
A = plot(SenkouA[displacement], color=color.new(colorpurple, 0), title='SenkouA')
B = plot(SenkouB, color=color.new(colorgreen, 0), title='SenkouB')
plot(switch1 ? xChikou : na, color=color.new(colorpink, 0), title='Chikou', offset=-displacement)
plot(switch2 ? Tenkan : na, color=color.new(colorred, 0), title='Tenkan')
plot(switch3 ? Kijun : na, color=color.new(colorblue, 0), title='Kijun')
fill(A, B, color=color.new(colorgreen, 90), title='Ichimoku Cloud')

//Buy and Sell signals
fukuiz = math.avg(ema2, ema8)
white = ema2 > ema8
gray = ema2 < ema8
buycond = white and white[1] == 0
sellcond = gray and gray[1] == 0
bullish = ta.barssince(buycond) < ta.barssince(sellcond)
bearish = ta.barssince(sellcond) < ta.barssince(buycond)
buy = bearish[1] and buycond and fukuiz > SenkouA[displacement] and fukuiz > SenkouB
sell = bullish[1] and sellcond and fukuiz > SenkouA[displacement] and fukuiz > SenkouB
sell2=ema2 < ema8
buy2 = white and fukuiz > SenkouA[displacement] and fukuiz > SenkouB

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//Back test

startYear = input.int(defval=2017, title='Start Year', minval=2000, maxval=3000)
startMonth = input.int(defval=1, title='Start Month', minval=1, maxval=12)
startDay = input.int(defval=1, title='Start Day', minval=1, maxval=31)
endYear = input.int(defval=2023, title='End Year', minval=2000 ,maxval=3000)
endMonth = input.int(defval=12, title='End Month', minval=1, maxval=12)
endDay = input.int(defval=31, title='End Day', minval=1, maxval=31)

start = timestamp(startYear, startMonth, startDay, 00, 00)
end = timestamp(endYear, endMonth, endDay, 23, 59)
period() => time >= start and time <= end ? true : false

if buy2 
    strategy.entry(id='long', direction=strategy.long, when=period(), comment='BUY')

if sell2
    strategy.close(id='long', when=period(), comment='SELL')





Más.