
La estrategia de movimiento a través de la media es una estrategia de negociación de acciones que utiliza una señal de cruce de la media combinada con un indicador de movimiento. La estrategia utiliza una combinación de indicadores técnicos múltiples como el índice de movimiento medio (EMA), el promedio móvil simple (SMA), el índice de dispersión de la media móvil (MACD) y el índice de fuerza relativa modificado (StockRSI) para formar una señal de compra, siempre que se confirme que la tendencia a largo plazo es ascendente.
La estrategia se compone principalmente de las siguientes partes:
EMA/SMA cruzado en línea media: Establece una línea rápida EMA de 9 ciclos y una línea lenta SMA de 21 ciclos, que genera una señal de compra cuando la línea rápida atraviesa la línea lenta.
Indicadores del MACD: El indicador MACD incluye líneas MACD, líneas de señal y columnas MACD. Como confirmación adicional, cuando las columnas son positivas y están sincronizadas con las señales de compra generadas por EMA/SMA.
Indicador del índice RSI de las acciones: StockRSI es una versión mejorada del indicador RSI. La línea de indicador produce una señal de compra cuando está por encima de la línea OVERBOUGHT ((80) o por debajo de la línea OVERSOLD ((20).
El cinturón de BrynLa banda media de Brin es el SMA de 20 días y la banda de banda es la diferencia entre los dos estándares anteriores. Se requiere que la señal de negociación se produzca cuando el precio está dentro de la banda de Brin.
Detención de pérdidas y paradasEl precio de la suspensión y el precio de la suspensión se basan en el ATR de los últimos 14 días.
La estrategia requiere que al menos 2 de los indicadores mencionados anteriormente emitan señales de compra al mismo tiempo y que el precio de las acciones esté dentro de la zona de Brin y la tendencia a largo plazo sea ascendente para que se produzca la señal de compra final. Cuando el indicador MACD se invierte hacia abajo, el StockRSI entra en la zona de sobrecompra y genera una señal de venta.
La estrategia combina las ventajas de la cruz de medias, el índice de movimiento y el índice de fluctuación, con las siguientes ventajas principales:
Los resultados son excelentes.: Indicadores múltiples y también indicadores maduros, con mejores resultados estratégicos que los indicadores de la bolsa y el único indicador.
Parámetros optimizadosLos principales parámetros, como el ciclo EMA y el canal de la banda de Brin, se han optimizado para mejorar la estabilidad del sistema.
Detención automática de pérdidasLa banda de Brin y el ATR pueden ajustar los puntos de parada en tiempo real, lo que ayuda a controlar el riesgo.
La implementación no es muy difícilEl código es más sencillo, los indicadores son más fáciles de obtener y la operación real no es tan difícil.
A pesar del buen desempeño de la estrategia, los principales riesgos son los siguientes:
El indicador está dando una señal errónea.Cuando el mercado se mueve de forma anormal o los indicadores fallan, puede haber una señal errónea. En este caso, se debe combinar con la tendencia a largo plazo.
Parámetros incorrectos: La configuración inadecuada de los parámetros puede causar transacciones demasiado frecuentes o falta de sensibilidad. Se debe ajustar según las diferentes variedades y el entorno del mercado.
Demasiado pequeño o demasiado grandeEl límite de pérdidas es demasiado pequeño y el límite de pérdidas es demasiado grande. Se debe equilibrar el límite de pérdidas y el límite de pérdidas.
En relación con los riesgos mencionados, se pueden tomar las siguientes medidas:
Intervención y modificación: En caso de excepciones, se puede confirmar manualmente la señal, modificar los parámetros o suspender la política.
Ajuste de los parámetros de optimizaciónEl uso de métodos más científicos y objetivos como los algoritmos genéticos para optimizar los parámetros.
Detención de pérdidas combinada con el ajuste de la volatilidad: Puede ajustar automáticamente el stop loss en función de la volatilidad, como 1 a 3 veces el ATR.
La estrategia puede ser mejorada en los siguientes aspectos:
Aumentar la estabilidad de los mecanismos de suspensión de pérdidas: Se puede agregar un trazado de stop loss o una media móvil de índice para el stop loss.
En combinación con el volumen de filtraciónEn la actualidad, el número de personas que se encuentran en el mercado de la droga es de más de un millón.
Parámetros de ajuste dinámico: Se puede optimizar automáticamente el ciclo de la línea media, el ancho del canal, etc., según el entorno del mercado.
Introducción a los algoritmos de aprendizaje automático: Optimización dinámica de los parámetros realizados con algoritmos como RNN, LSTM.
La estrategia de la línea uniforme de movimiento de la ruptura de la ventaja de la aplicación integral de indicadores técnicos, en el caso de la combinación de largas y cortas carreras, se obtiene un buen rendimiento. La estrategia de control de pérdidas está en su lugar, la implementación no es muy difícil. El siguiente paso será mejorar aún más el mecanismo de pérdidas, y el uso de métodos más inteligentes para la optimización de parámetros y filtración de señales, con el objetivo de obtener una ganancia adicional más estable.
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true)
// Volatility
volatility = ta.atr(14)
// EMA/MA Crossover
fast_length = 9
slow_length = 21
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.sma(close, slow_length)
crossover_signal = ta.crossover(fast_ma, slow_ma)
// MACD
[macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9)
macd_signal = crossover_signal and (macdHistogram > 0)
// Bollinger Bands
source = close
basis = ta.sma(source, 20)
upper = basis + 2 * ta.stdev(source, 20)
lower = basis - 2 * ta.stdev(source, 20)
// Fractal-based Support and Resistance levels
isFractalHigh = high[2] < high[1] and high[1] > high[0]
isFractalLow = low[2] > low[1] and low[1] < low[0]
resistance = ta.valuewhen(isFractalHigh, high[1], 0)
support = ta.valuewhen(isFractalLow, low[1], 0)
// StockRSI
length = 14
K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length))
D = ta.sma(K, 3)
overbought = 80
oversold = 20
stockrsi_signal = ((K < D) and (K < oversold)) or ((K > D) and (K > overbought))
// Buy and sell conditions
mandatory_buy_conditions = (crossover_signal ? 1 : 0) + (macd_signal ? 1 : 0) + (stockrsi_signal ? 1 : 0)
// Long-term Trend Check
long_term_ma = ta.sma(close, 200)
long_term_bullish = close > long_term_ma
long_term_bearish = close < long_term_ma
// Plot the long-term MA for visual clarity
plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1)
// Simplified Buy and Sell conditions
buy_condition = long_term_bullish and (mandatory_buy_conditions >= 2) and (close > lower) and (close < upper)
sell_condition = (macdHistogram < 0) and (K > D) and (K > overbought)
// Potential SL and TP based on volatility
potential_SL = close - volatility
potential_TP = close + 2 * volatility
plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr)
plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr)
// ... (rest of your code above)
// State variable to track if we're in a position, a counter for trades, and a delayed counter for plotting
var bool inPosition = false
var tradeCounter = 0
var tradeCounterDelayed = 0 // Declaration of the variable
// Buy logic: Check if tradeCounter is 0 and the buy condition is met
if tradeCounter == 0 and buy_condition
strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP)
inPosition := true
tradeCounter := tradeCounter + 1
// Sell logic: Check if tradeCounter is 1, the sell condition is met, and we are in a position
if tradeCounter == 1 and inPosition and sell_condition
strategy.close("BUY")
inPosition := false
tradeCounter := tradeCounter - 1
// Update the delayed trade counter:
tradeCounterDelayed := tradeCounter
// Plotting
bgcolor(buy_condition ? color.new(color.green, 90) : sell_condition ? color.new(color.red, 90) : na)
plotshape(series=buy_condition and tradeCounterDelayed == 0, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small)
plotshape(series=sell_condition and tradeCounterDelayed == 1, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small)
// ... (rest of your code if any)