Esta estrategia es una estrategia combinada que integra indicadores de impulso, indicadores de tendencia y indicadores de promedio móvil para realizar la tendencia de seguimiento y entrada/salida de ruptura.
La estrategia consiste en los siguientes indicadores:
Las líneas de EMA: utilizar EMA 25, 50, 100 y 200 para determinar la tendencia principal.
Indicador de tendencia de supertrend: Los parámetros son el Factor 3 y ATR 10 para juzgar si el precio actual está en una tendencia alcista o bajista.
Indicador de momento estocástico: %K 8 y %D 3 para determinar si el estocástico genera cruz dorada o cruz muerta. Cuando la línea %K cruza la línea %D desde abajo, es una señal de cruz dorada, y viceversa para la cruz muerta.
La estrategia de compra es: EMA muestra tendencia alcista + Supertrend muestra tendencia alcista + cruz de oro estocástica.
La estrategia de venta es: EMA muestra tendencia bajista + Supertrend muestra tendencia bajista + cruce muerto estocástico.
Esta estrategia integra indicadores de tendencia, impulso y ruptura para determinar con fiabilidad los movimientos del mercado y los puntos de negociación.
Las principales ventajas de esta estrategia son las siguientes:
La combinación de múltiples indicadores mejora la robustez y filtra de manera efectiva las fugas falsas.
Agregar un indicador de impulso puede detectar puntos de inflexión tempranos.
Los parámetros personalizables se adaptan a diferentes entornos de mercado.
Realiza una configuración de stop loss y take profit relativamente eficiente.
Funciona bien cuando se prueba en grandes intervalos de tiempo como diariamente.
También hay algunos riesgos:
La configuración incorrecta de los parámetros puede causar operaciones demasiado frecuentes o señales inestables.
Puede haber errores en el tiempo y se pueden añadir más indicadores de filtro.
El stop loss establecido en extremos estocásticos puede estar demasiado cerca.
Los datos insuficientes de las pruebas de retroceso pueden causar sesgos en el ajuste de parámetros.
La estrategia se puede optimizar de las siguientes maneras:
Prueba más conjuntos de parámetros para encontrar el óptimo. Por ejemplo, ajusta el factor de Supertrend.
Añadir más indicadores de filtro como energía o volatilidad para reducir los juicios erróneos.
En el caso de los instrumentos financieros, las pérdidas se calcularán de acuerdo con el método de cálculo de las pérdidas.
Optimizar para obtener ganancias, como detenerse para obtener más ganancias.
Ampliar el alcance, adaptarse a más productos o marcos de tiempo más largos.
La lógica de la estrategia es clara y la selección de indicadores es razonable. Realiza el seguimiento de tendencias y el comercio de ruptura de impulso con buenos resultados de pruebas de retroceso. Pero todavía hay espacio para la optimización, por ejemplo, ajuste de parámetros, adición de filtros, mejora de paradas y toma de ganancias. La optimización multidimensional puede hacer que la estrategia sea más robusta.
/*backtest start: 2023-12-05 00:00:00 end: 2023-12-06 07:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Supertrend + Stoch Strategy", overlay=true) // ---inputs--- pl = input(1.5, title="P/L", minval=0.1) lossPercentage = input(1, title="Loss Percentage", minval=1, maxval=100) atrPeriod = input(10, "ATR Length") factor = input(3, "Supertrend Factor") periodK = input(8, title="%K Length", minval=1) smoothK = input(3, title="%K Smoothing", minval=1) periodD = input(3, title="%D Smoothing", minval=1) ema1l = input(25, title="EMA 1 Length", minval=1) ema2l = input(50, title="EMA 2 Length", minval=1) ema3l = input(100, title="EMA 3 Length", minval=1) ema4l = input(200, title="EMA 4 Length", minval=1) // ---lines--- ema1 = ema(close, ema1l) ema2 = ema(close, ema2l) ema3 = ema(close, ema3l) ema4 = ema(close, ema4l) trendUpper = ema1 > ema2 and ema3 > ema4 trendLower = ema1 < ema2 and ema3 < ema4 [supertrend, direction] = supertrend(factor, atrPeriod) supertrendUpper = direction < 0 supertrendLower = direction > 0 k = sma(stoch(close, high, low, periodK), smoothK) d = sma(k, periodD) stochCrossOver = crossover(k, d) stochCrossUnder = crossunder(k, d) // ---plot--- plot(ema1, color=color.green) plot(ema2, color=color.orange) plot(ema3, color=color.blue) plot(ema4, color=color.purple) bodyMiddle = plot((open + close) / 2, display=display.none) upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(direction < 0 ? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr) fill(bodyMiddle, upTrend, color.new(color.green, 95), fillgaps=false) fill(bodyMiddle, downTrend, color.new(color.red, 95), fillgaps=false) // ---stop place compute--- edge = 0. // periodly high/low edge := stochCrossOver ? high : stochCrossUnder ? low : k > d ? max(edge[1], high) : k < d ? min(edge[1], low) : edge[1] // plot(edge) // ---trade condition--- // longCond = trendUpper and supertrendUpper and stochCrossOver // shortCond = trendLower and supertrendLower and stochCrossUnder longCond = trendUpper and supertrendUpper and stochCrossOver and strategy.position_size == 0 shortCond = trendLower and supertrendLower and stochCrossUnder and strategy.position_size == 0 // ---stop & take--- stop = 0. stop := nz(stop[1], stop) take = 0. take := nz(take[1], take) if longCond stop := edge[1] take := close + (close - stop) * pl if shortCond stop := edge[1] take := close - (stop - close) * pl // ---trade--- qty = strategy.equity / abs(stop - close) / 100 * lossPercentage strategy.entry("Buy", strategy.long, when=longCond, qty=qty) strategy.exit("Close Buy","Buy", limit=take, stop=stop) strategy.entry("Sell", strategy.short, when=shortCond, qty=qty) strategy.exit("Close Sell","Sell", limit=take, stop=stop) stopLine = plot(strategy.position_size != 0 ? stop : na, color=color.red, style=plot.style_linebr) takeLine = plot(strategy.position_size != 0 ? take : na, color=color.green, style=plot.style_linebr) entryLine = plot(strategy.position_size != 0 ? strategy.position_avg_price : na, color=color.blue, style=plot.style_linebr) fill(entryLine, stopLine, color.new(color.red, 90), fillgaps=false) fill(entryLine, takeLine, color.new(color.green, 90), fillgaps=false)