
La estrategia de doble cruce de indicadores de media móvil rápida es una estrategia de seguimiento de tendencias que utiliza una media móvil rápida y una media móvil lenta cruzada para formar una señal de compra y venta. La estrategia combina múltiples indicadores como el MACD, el RSI y otros para determinar la dirección de la tendencia, y tiene una mayor capacidad de seguimiento de tendencias.
La estrategia se basa en los siguientes indicadores:
Las medias móviles rápidas y las medias móviles lentas: las líneas rápidas y lentas son señales de compra y las líneas lentas y lentas son señales de venta.
MACD: Cuando la línea MACD está por encima de la línea Signal y el valor mínimo de la MACD sube, la señal es múltiple.
RSI: RSI superior a 50 es una señal de más de un cabeza, y inferior a 50 es una señal de cabeza vacía.
Oscilador de medición (AO): cuando la línea 0 de la AO es una señal de compra, la línea 0 de la AO es una señal de venta.
Tres promedios móviles a nivel de línea de sol: el promedio móvil de ciclo más largo es una señal de compra.
La estrategia integra varios períodos de tiempo y varios indicadores para formar una lógica de decisión de compra y venta. Se generan órdenes de compra cuando se producen señales de compra de varios indicadores al mismo tiempo, y se generan órdenes de venta cuando se producen señales de venta de varios indicadores al mismo tiempo, lo que permite el seguimiento de la tendencia.
La estrategia tiene las siguientes ventajas:
La combinación de varios indicadores de juicio, evita las señales falsas y mejora la precisión de juicio.
La combinación de varios períodos de tiempo permite identificar la dirección de las tendencias a un nivel mayor.
Los parámetros del indicador se han optimizado, Parameters tuning, con una mejor tasa de rendimiento.
El uso de stop loss móvil para controlar el riesgo y evitar que las pérdidas se extiendan.
El seguimiento automático de las tendencias funciona sin intervención humana, lo que reduce los costos de operación.
La estrategia también tiene ciertos riesgos:
En situaciones convulsivas, se pueden generar más señales de negociación no válidas. Se puede reducir la señal no válida optimizando los parámetros del indicador.
Los eventos repentinos pueden provocar una retirada rápida. Se puede configurar un stop loss móvil para controlar la pérdida.
Las reglas de determinación de señales multiespaciales son complejas, y la optimización de los parámetros requiere un gran número de datos históricos.
La configuración inadecuada de la parada de seguimiento puede causar una parada prematura. Se requiere una prueba repetida para determinar los parámetros óptimos.
La estrategia se puede optimizar en las siguientes direcciones:
Prueba más combinaciones de indicadores en busca de señales de negociación más estables y precisas, como el indicador de volatilidad, el indicador OBV, etc.
Optimización de los parámetros indicadores, reducción de las transacciones no válidas. Aplicación de aprendizaje automático y algoritmos genéticos para buscar parámetros óptimos.
Aumentar la tecnología de integración de modelos para integrar más estrategias independientes de los resultados de los modelos de evaluación.
Entrar en las frecuencias altas y salir en las frecuencias bajas reduce el riesgo de ser engañados.
Aumentar el módulo de control de viento cuantitativo, controlar estrictamente la proporción de pérdida única, la proporción máxima de retirada, etc.
La estrategia de doble indicador de cruce de la media móvil rápida y la estrategia de múltiples espacios forman una señal de negociación mediante el cruce de la media móvil rápida y la media móvil lenta, y en combinación con varios indicadores para determinar la dirección de la tendencia, como MACD, RSI, etc., para lograr un seguimiento de la tendencia automático. La estrategia tiene un gran espacio de optimización y se espera que obtenga mejores resultados de la estrategia mediante la introducción de más indicadores, ajuste de parámetros y integración de modelos.
/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy('SteffVans', shorttitle='SteffVans strategy', overlay=true, process_orders_on_close = true)
// Input settings
macd_fast_length = input(12)
macd_slow_length = input(26)
macd_signal_length = input(9)
// Calculate MACD values
[macd_line, signal_line, _] = ta.macd(close, macd_fast_length, macd_slow_length, macd_signal_length)
mg = ta.lowest(signal_line, 30) >= -0
// RSI
ma(source, length, type) =>
switch type
"SMA" => ta.sma(source, length)
"Bollinger Bands" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"SMMA (RMA)" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"VWMA" => ta.vwma(source, length)
rsiLengthInput = input.int(14, minval=1)
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")
up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
RSI = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
// AO
AO = ta.sma((high + low) / 2, 5) - ta.sma((high + low) / 2, 34)
crossaosell = AO < AO[1] and AO[1] < AO[2] and AO[2] > AO[3] and ta.lowest(low,3)
// Uptrend sma
len1 = input.int(5, minval=1)
len2 = input.int(10, minval=1)
len3 = input.int(20, minval=1)
src = input(close)
out1 = ta.sma(src, len1)
out2 = ta.sma(src, len2)
out3 = ta.sma(src, len3)
// Timeframe
macdl60 = request.security(syminfo.tickerid, "60", signal_line,lookahead = barmerge.lookahead_on)
ao = request.security(syminfo.tickerid, "60", AO,lookahead = barmerge.lookahead_on)
rsi = request.security(syminfo.tickerid, "60", RSI,lookahead = barmerge.lookahead_on)
good = request.security(syminfo.tickerid, "60", mg,lookahead = barmerge.lookahead_on)
bad = request.security(syminfo.tickerid, "60", crossaosell,lookahead = barmerge.lookahead_on)
ma1 = request.security(syminfo.tickerid, "D", out1,lookahead = barmerge.lookahead_on)
ma2 = request.security(syminfo.tickerid, "D", out2, lookahead = barmerge.lookahead_on)
ma3 = request.security(syminfo.tickerid, "D", out3, lookahead = barmerge.lookahead_on)
// Kriteria BUY and SELL
uptrend1 = request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) > ma1 and ma1 > ma3 and ma2 > ma3
uptrend2 = ta.lowest(ma1,12) > ta.lowest(ma3,12) and ta.lowest(ma2,12) > ta.lowest(ma3,12)
// Triger BUY and SELL
cross1 = ao > ao[1] and ao[1] < ao[2] and ao > 0 and good and rsi >= 60 and uptrend1
cross2 = ao > 0 and ao[1] < 0 and good and rsi >=50 and uptrend1
cross3 = ao > 0 and ao[1] < 0 and not good and uptrend2 and uptrend1
cross4 = ao > ao[1] and ao[1] > ao[2] and ao[2] < ao[3] and ao[3] < ao[4] and not good and uptrend2 and uptrend1
s1 = ao < ao[1] and ao[1] < ao[2] and ao[2] < ao[3] and ao > 0 and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1
s2 = ao < 0 and ao < ao[2] and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1
// Variabel Buy dan Sell
buySignal = false
sellSignal = false
// Syarat masuk Buy
buyCondition = cross1 or cross2 or cross3 or cross4
if buyCondition
buySignal := true
// Syarat masuk Sell
sellCondition = s1 or s2
if sellCondition
sellSignal := true
// Reset sinyal jika ada sinyal berulang
if buySignal and sellSignal
sellSignal := false
if sellSignal and buySignal
buySignal := false
// Logika perdagangan
if buySignal
strategy.entry("Buy", strategy.long, comment = "BUY")
if sellSignal
strategy.close("Buy")
plotshape(cross1,title = "Stefkuy1", style = shape.labelup, location = location.belowbar, color = color.green,text = "1", textcolor = color.white,size = size.small)
plotshape(cross2,title = "Stefkuy2", style = shape.labelup, location = location.belowbar, color = color.green, text = "2", textcolor= color.white, size = size.small)
plotshape(cross3,title = "StefVan1", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "3", textcolor= color.white,size = size.small)
plotshape(cross4,title = "StefVan2", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "4", textcolor= color.white,size = size.small)