Estrategia de cruce de medias móviles en marcos temporales múltiples


Fecha de creación: 2024-02-19 15:41:29 Última modificación: 2024-02-19 15:41:29
Copiar: 0 Número de Visitas: 654
1
Seguir
1617
Seguidores

Estrategia de cruce de medias móviles en marcos temporales múltiples

Descripción general

La estrategia Multi Timeframe Moving Average Crossover es una estrategia de comercio algorítmica que utiliza señales cruzadas entre medias móviles de diferentes períodos de tiempo para determinar la dirección de la tendencia. La estrategia utiliza una combinación de indicadores de tendencia, indicadores de dinámica y indicadores de fluctuación para hacer que la señal de la estrategia sea más confiable.

Principio de estrategia

La estrategia determina la dirección de la tendencia del mercado mediante el cálculo de los indicadores CCI de diferentes períodos, luego se combina con el indicador MACD para buscar señales de horquilla dorada y, finalmente, se establece un stop loss con el indicador ATR, lo que permite una compra baja y una venta alta.

Concretamente, primero se calcula el indicador CCI de 20 ciclos para juzgar la tendencia del mercado en función de su positividad y negatividad; luego se calcula si la línea media rápida y lenta del indicador MACD se cruza para determinar si se genera una señal de compra y venta; luego se utiliza el indicador ATR para generar un mecanismo de seguimiento de la parada de pérdidas y un mayor bloqueo de ganancias; finalmente, se combina la señal de varios de los indicadores anteriores para generar la señal final de la estrategia de compra y venta.

Ventajas estratégicas

  1. Combinación de múltiples indicadores para mejorar la precisión de la señal

La estrategia utiliza una combinación de los tres indicadores CCI, MACD y ATR para evaluar la tendencia, el dinamismo y la volatilidad del mercado, lo que hace que las señales estratégicas sean más precisas y confiables.

  1. Análisis de marcos de tiempo múltiple para entender el ritmo del mercado

Utilizando el CCI de diferentes períodos para determinar la tendencia general del mercado, junto con el MACD de períodos altos para buscar nodos de compra y venta bajos y altos, se puede capturar el ritmo de tendencia más grande del mercado.

  1. Detener el seguimiento de ATR y controlar el riesgo

El stop loss generado por el indicador ATR permite establecer un nivel de pérdida razonable en función de la volatilidad del mercado, y al mismo tiempo tiene una función de seguimiento del stop loss que permite controlar el riesgo de la estrategia.

Riesgo estratégico

  1. Optimización de parámetros con espacio limitado

La mayor parte de los parámetros de la estrategia no tienen mucho espacio para ajustar, lo que limita el efecto de la estrategia.

  1. Combinación de múltiples indicadores para aumentar la carga de cálculo

La estrategia utiliza varios indicadores para realizar operaciones combinadas, lo que aumenta la carga de cálculo de la estrategia en cierta medida. En el caso de operaciones de alta frecuencia, puede producirse un problema de cartón.

  1. Las señales son frecuentes y los controles de riesgo son limitados.

Las señales de estrategia pueden ser más frecuentes, mientras que el control de riesgo depende principalmente del seguimiento de los paros de los indicadores ATR, y el control de riesgo de las situaciones extremas no es completo.

Optimización de la estrategia

  1. Mejor eficiencia en la optimización de parámetros mediante algoritmos de aprendizaje automático

Se puede probar el uso de algoritmos de optimización de hiperparámetros de aprendizaje automático, como optimización bayesiana, algoritmos genéticos, etc., para que el ajuste de parámetros sea más inteligente y eficiente.

  1. Aumentar los indicadores funcionales y la flexibilidad de las estrategias

Se puede considerar la inclusión de algunos otros indicadores funcionales, como indicadores de volatilidad, indicadores de energía cuantitativa, indicadores de emoción, etc., para mejorar la adaptabilidad y robustez de la estrategia.

  1. Reforzar los módulos de gestión de riesgos y las estrategias de control de riesgos

Se puede diseñar un principio de stop loss más científico, también se puede agregar un módulo de control de posición o de administración de fondos, para proteger mejor el riesgo de situaciones extremas y garantizar la estabilidad de la estrategia.

Resumir

La estrategia multi-marco a través de la línea de uniformidad mediante la aplicación de una combinación de los tres grandes indicadores de CCI, MACD y ATR, para lograr un juicio de tendencias más fiable y un control de riesgo más eficiente. La estrategia tiene en cuenta la tendencia, la dinámica y la volatilidad de las tres dimensiones, con una alta precisión de la señal, el ritmo del mercado y el control eficaz de los riesgos.

Código Fuente de la Estrategia
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('smplondonclinic Strategy', shorttitle='SMPLC Strategy', overlay=true, pyramiding = 0, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

direction   = input.string(title='Entry Direction', defval='Long', options=['Long', 'Short', 'Both'],group = "Strategy Entry Direction")

TPPerc = input.float(title='Take Profit (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')
SLPerc = input.float(title='Stop Loss (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')

period = input(20, 'CCI period',group = "TREND MAGIC")
coeff = input(1, 'ATR Multiplier',group = "TREND MAGIC")
AP = input(5, 'ATR Period',group = "TREND MAGIC")
ATR = ta.sma(ta.tr, AP)
srctm = close
upT = low - ATR * coeff
downT = high + ATR * coeff
MagicTrend = 0.0
MagicTrend := ta.cci(srctm, period) >= 0 ? upT < nz(MagicTrend[1]) ? nz(MagicTrend[1]) : upT : downT > nz(MagicTrend[1]) ? nz(MagicTrend[1]) : downT
color1 = ta.cci(srctm, period) >= 0 ? #0022FC : #FC0400
plot(MagicTrend, color=color1, linewidth=3)
tmb = ta.cci(srctm, period) >= 0 and close>MagicTrend
tms = ta.cci(srctm, period) <= 0 and close<MagicTrend

//MACD

res           = input.timeframe("",  "Indicator TimeFrame", group = "MACD")
fast_length   = input.int(title="Fast Length", defval=12, group = "MACD")
slow_length   = input.int(title="Slow Length", defval=26, group = "MACD")
src           = input.source(title="Source", defval=close, group = "MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9, group = "MACD")
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")

fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal

trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0


//UT Bot

srcut = close
showut = input.bool(false, 'Show UT Bot Labels', group = "UT BOT")
keyvalue = input.float(2, title='Key Vaule. \'This changes the sensitivity\'', step=.5, group = "UT BOT")
atrperiod = input(7, title='ATR Period', group = "UT BOT")
xATR = ta.atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
iff_1 = srcut > nz(xATRTrailingStop[1], 0) ? srcut - nLoss : srcut + nLoss
iff_2 = srcut < nz(xATRTrailingStop[1], 0) and srcut[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), srcut + nLoss) : iff_1
xATRTrailingStop := srcut > nz(xATRTrailingStop[1], 0) and srcut[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), srcut - nLoss) : iff_2

pos = 0
iff_3 = srcut[1] > nz(xATRTrailingStop[1], 0) and srcut < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := srcut[1] < nz(xATRTrailingStop[1], 0) and srcut > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

//plot(xATR, color=xcolor, title='Trailing Stop')
buy = ta.crossover(srcut, xATRTrailingStop)
sell = ta.crossunder(srcut, xATRTrailingStop)
barcolor = srcut > xATRTrailingStop

plotshape(showut ? buy:na, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(showut ? sell:na, title='Sell', text='Sell', style=shape.labeldown, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

//barcolor(barcolor ? color.green : color.red)

goLong = buy and tmb and cross_UP
goShort = sell and tms and cross_DN

plotshape(goLong, location=location.bottom, style=shape.triangleup, color=color.lime, size=size.small)
plotshape(goShort, location=location.top, style=shape.triangledown, color=color.red, size=size.small)

percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na)

percentAsPrice(pcnt) =>
    strategy.position_size != 0 ? (pcnt / 100.0 + 1.0) * strategy.position_avg_price : float(na)

current_position_size = math.abs(strategy.position_size)
initial_position_size = math.abs(ta.valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0))

TP = strategy.position_avg_price + percentAsPoints(TPPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)
SL = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)

var long = false
var short = false

if direction == 'Long' 
    long := goLong
    short := false

if direction == 'Short'
    short := goShort
    long := false

if direction == 'Both' 
    long := goLong
    short := goShort

if long and strategy.opentrades == 0
    strategy.entry(id='Long', direction=strategy.long)

if short and strategy.opentrades == 0
    strategy.entry(id='Short', direction=strategy.short)

if strategy.position_size > 0

    strategy.exit('TPSL', from_entry='Long', qty=initial_position_size, limit=TP, stop=SL)

if strategy.position_size < 0

    strategy.exit('TPSL2', from_entry='Short', qty=initial_position_size, limit=TP, stop=SL)