Estrategia de seguimiento de tendencias con oscilador de momentum


Fecha de creación: 2024-01-22 10:08:55 Última modificación: 2024-01-22 10:08:55
Copiar: 1 Número de Visitas: 602
1
Seguir
1617
Seguidores

Estrategia de seguimiento de tendencias con oscilador de momentum

Descripción general

La estrategia de seguimiento de tendencias del oscilador dinámico es una estrategia compleja que utiliza al mismo tiempo el indicador dinámico, el oscilador y el promedio móvil. Se dedica a identificar la tendencia alcista de la Etapa 2 y la tendencia bajista de la Etapa 4, generando señales de venta y pérdida precisas en ambas etapas.

Principio de estrategia

Generación de señales y juicio de tendencias

Las señales de esta estrategia se derivan principalmente de un juicio integral de los tres principales indicadores técnicos, que incluyen el RSI de la dinámica de la versión mejorada, el cruce de la línea media de la EMA y el rango de fluctuación real del ATR. En concreto, la estrategia considera una tendencia alcista al atravesar el EMA de largo plazo en el EMA a corto plazo y forma una señal de plurivalencia; mientras que el EMA de corto plazo en el EMA a largo plazo indica una tendencia descendente y genera una señal de brecha. Además, las áreas altas del indicador RSI de la dinámica indican una fuerte energía de múltiples cabezas, mientras que las áreas bajas representan una energía de pleno cabecera, que se puede usar para confirmar la efectividad de la tendencia actual.

Generación de señales por fases

La peculiaridad de esta estrategia es que sólo produce señales en las fases 2 y 4 de un mercado alcista. Es decir, sólo se coloca en los períodos de tendencia alcista más fuerte y tendencia bajista más clara.

El proceso de toma de decisiones en su conjunto

En resumen, la lógica de decisión de la estrategia se puede resumir como: confirmación de tendencias por etapas (Etapa 2 o Etapa 4) Determinar la intención de la dinámica del RSI en el horizonte Determinar la orientación de la línea de equilibrio EMA Establecer un alto y baja adecuado en combinación con ATR Abrir una posición cuando se cumplen todas las condiciones.

Ventajas estratégicas

Aprovechar el ciclo del mercado para aumentar la ganancia

La mayor ventaja de la estrategia reside en su profundo conocimiento de las características periódicas del mercado. Al negociar solo en las fases de alza y caída más claras, puede filtrar una gran cantidad de ruido incierto, lo que aumenta la probabilidad de éxito a más del 80%.

Filtración de múltiples indicadores para reducir las señales falsas

Esta estrategia utiliza varios indicadores para la verificación cruzada, como el dinamismo, la tendencia y la volatilidad. Esto evita las señales engañosas que puede generar cualquier indicador individual, lo que aumenta considerablemente la estabilidad y la confiabilidad de la estrategia en general.

Ricos en parámetros y altamente personalizables

La estrategia ofrece una gran cantidad de parámetros ajustables, y el usuario puede personalizarla en gran medida según su estilo personal y el entorno del mercado, optimizando la estrategia al máximo nivel, lo que también aumenta la adaptabilidad de la estrategia.

Riesgos y soluciones

Riesgo objetivo de mercado

Ninguna estrategia cuantitativa puede evitar completamente los riesgos del mercado en sí, como los grandes eventos de cisnes negros que no se pueden predecir. Pero este es un riesgo que existe en el mercado objetivo, no es una cuestión de estrategia en sí misma, que requiere que el comerciante mantenga la mente despierta, controle razonablemente la posición y use el apalancamiento.

Riesgos de la optimización de parámetros

Debido a que los parámetros de la estrategia se pueden ajustar libremente, los ajustes inadecuados pueden conducir a la aparición de un fenómeno de sobreajuste. Esto requiere una prevención rigurosa a través de la retroalimentación, asegurándose de que cualquier ajuste de parámetros haya sido suficientemente comprobado y pueda adaptarse a las condiciones más amplias del mercado, evitando limitarse a un período histórico específico.

Dirección de optimización

Aumentar la capacidad de gestión de la cantidad de posiciones

Las estrategias actuales se basan en el establecimiento de posiciones con cantidades fijas, lo que puede conducir a posiciones demasiado ligeras en situaciones de grandes tendencias. Por lo tanto, una dirección que se puede optimizar es la adición de un módulo de administración de posiciones, que puede aumentar gradualmente las posiciones cuando la tendencia es lo suficientemente clara, para obtener un mejor efecto en situaciones de grandes tendencias.

Combinado con el aprendizaje automático para filtrar señales

Esta estrategia se puede combinar con el aprendizaje automático para crear un modelo bien entrenado que se utilice para calificar la calidad de la señal y filtrar algunas señales de menor calidad, lo que mejora aún más el rendimiento general de la estrategia. Esta es una dirección importante para la optimización de la estrategia.

Resumir

La estrategia de seguimiento de tendencias de los agitadores dinámicos es una estrategia altamente inteligente y parametrizada. Utiliza con éxito las leyes periódicas del mercado para mejorar la calidad de la señal y genera señales de entrada en el mercado de alta fiabilidad mediante una verificación cruzada de múltiples indicadores. Al mismo tiempo, la gran cantidad de parámetros ajustables brinda gran flexibilidad a los usuarios. En resumen, es una estrategia compleja de alto nivel que merece la confianza y la recomendación.

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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JS_TechTrading

//@version=5
strategy('The Flash-Strategy (Momentum-RSI, EMA-crossover, ATR)', shorttitle='The Flash-Strategy (Momentum-RSI, EMA-crossover, ATR)', overlay=true,initial_capital = 1000)
//// author -  JS-TechTrading

// MOM Rsi indicator 
group_mom_rsi = "Rsi Of Momentum "
len = input.int(10, minval=1, title="Length Mom-Rsi", group =group_mom_rsi ,tooltip = 'This ind calculate Rsi value of Momentum we use this ind to determine power of trend')
src2 = close
mom = src2 - src2[len]
rsi_mom = ta.rsi(mom, len)
mom_rsi_val = input.int(60, minval=1, title="Mom-Rsi Limit Val", group =group_mom_rsi, tooltip = "When our Mom-Rsi value more then this we open LONG or Short, with help of this indicator we we determine the status of the trend")

// Super Trend Ind
group_supertrend = "SuperTrend indicator"
atrPeriod = input(10, "ATR Length SuperTrend", group = group_supertrend)
factor = input.float(3.0, "Factor SuperTrend", step = 0.01, group = group_supertrend)

[supertrend, direction] = ta.supertrend(factor, atrPeriod)

// Ema Indicator
group_most = "Ema indicator"
src = input(close, 'Source Ema Ind',group = group_most)
AP2 = input.int(defval=12, title='Length Ema Ind', minval=1,group = group_most)
Trail1 = ta.ema(src, AP2) //Ema func
AF2 = input.float(defval=1, title='Percent Ema Ind', minval=0.1,group = group_most) / 100
SL2 = Trail1 * AF2  // Stoploss Ema
Trail2 = 0.0
iff_1 = Trail1 > nz(Trail2[1], 0) ? Trail1 - SL2 : Trail1 + SL2
iff_2 = Trail1 < nz(Trail2[1], 0) and Trail1[1] < nz(Trail2[1], 0) ? math.min(nz(Trail2[1], 0), Trail1 + SL2) : iff_1
Trail2 := Trail1 > nz(Trail2[1], 0) and Trail1[1] > nz(Trail2[1], 0) ? math.max(nz(Trail2[1], 0), Trail1 - SL2) : iff_2

//EMA50/150/200
group_50_150_200="EMA50/150/200"
show_emas=input.bool(defval = true, title = "SHOW EMAS", group = group_50_150_200)
ema50= ta.ema(src, 50)
ema150 = ta.ema(src, 150)
ema200 = ta.ema(src, 200)
ema50_color=input.color(defval = color.purple, title = "EMA50 COLOR",group = group_50_150_200)
ema50_linewidth=input.int(defval = 2, title = "EMA50 LINEWIDTH", group = group_50_150_200)
ema150_color=input.color(defval = color.blue, title = "EMA150 COLOR", group = group_50_150_200)
ema150_linewidth=input.int(defval = 2, title = "EMA150 LINEWIDTH", group = group_50_150_200)
ema200_color=input.color(defval = color.black, title = "EMA200 COLOR", group = group_50_150_200)
ema200_linewidth=input.int(defval = 2, title = "EMA200 LINEWIDTH", group = group_50_150_200)
plot(show_emas ? ema50 : na, color = ema50_color, linewidth = ema50_linewidth)
plot(show_emas ? ema150 : na, color=ema150_color, linewidth = ema150_linewidth)
plot(show_emas ? ema200 : na, color = ema200_color, linewidth = ema200_linewidth)

//Bull = ta.barssince(Trail1 > Trail2 and close > Trail2 and low > Trail2) < ta.barssince(Trail2 > Trail1 and close < Trail2 and high < Trail2)

//TS1 = plot(Trail1, 'ExMov', style=plot.style_line, color=Trail1 > Trail2 ? color.rgb(33, 149, 243, 100) : color.rgb(255, 235, 59, 100), linewidth=2)
//TS2 = plot(Trail2, 'ema', style=plot.style_line, color=Trail1 > Trail2 ? color.rgb(76, 175, 79, 30) : color.rgb(255, 82, 82, 30), linewidth=2)
//fill(TS1, TS2, Bull  ? color.green : color.red, transp=90)


// Strategy Sett
group_strategy = "Settings of Strategy"
Start_Time = input(defval=timestamp('01 January 2000 13:30 +0000'), title='Start Time of BackTest', group =group_strategy)
End_Time = input(defval=timestamp('30 April 2030 19:30 +0000'), title='End Time of BackTest', group =group_strategy)
dollar = input.float(title='Dollar Cost Per Position* ', defval=50000, group =group_strategy)
trade_direction = input.string(title='Trade_direction', group =group_strategy, options=['LONG', 'SHORT', 'BOTH'], defval='BOTH')
v1 = input(true, title="Version 1 - Uses SL/TP Dynamically ", group =group_strategy ,tooltip = 'With this settings our stoploss price increase or decrease with price to get better PNL score')

v2 = input(false, title="Version 2 -  Uses SL/TP Statically", group =group_strategy)
v2stoploss_input = input.float(5, title='Static Stop.Loss % Val', minval=0.01, group =group_strategy)/100
v2takeprofit_input = input.float(10, title='Static Take.Prof % Val', minval=0.01, group =group_strategy)/100

v2stoploss_level_long = strategy.position_avg_price * (1 - v2stoploss_input)
v2takeprofit_level_long = strategy.position_avg_price * (1 + v2takeprofit_input)

v2stoploss_level_short = strategy.position_avg_price * (1 + v2stoploss_input)
v2takeprofit_level_short = strategy.position_avg_price * (1 - v2takeprofit_input)

group_line = "Line Settings"
show_sl_tp = input.bool(title='  Show StopLoss - TakeProf Lines',inline = "1", defval=true, group =group_line)
show_trend_line = input.bool(title='  Show Trend Line',inline = '3' ,defval=true, group =group_line)
stoploss_colour = input.color(title='StopLoss Line Colour',inline = '2' ,defval=color.rgb(255, 255, 0), group =group_line)
up_trend_line_colour = input.color(title='Up Trend line Colour',inline = '4' ,defval=color.rgb(0, 255, 0, 30), group =group_line)
down_trend_line_colour = input.color(title='Down Trend line Colour',inline = '4' ,defval=color.rgb(255, 0, 0, 30), group =group_line)

//plot(supertrend ,color = strategy.position_size > 0 and show_sl_tp ? color.rgb(255, 0, 0) :show_sl_tp ? color.rgb(0, 255, 0) : na , style = plot.style_steplinebr,linewidth = 2)
// plot(supertrend ,color = show_sl_tp and v1 ? stoploss_colour : na , style = plot.style_steplinebr,linewidth = 2)

// plot(v2stoploss_level_long ,color = strategy.position_size > 0 and show_sl_tp and v2 ? stoploss_colour : na , style = plot.style_steplinebr,linewidth = 2)
// plot(v2stoploss_level_short ,color = strategy.position_size < 0 and show_sl_tp and v2 ? stoploss_colour : na , style = plot.style_steplinebr,linewidth = 2)
// plot(v2takeprofit_level_long  ,color = strategy.position_size > 0 and show_sl_tp and v2 ? up_trend_line_colour : na , style = plot.style_steplinebr,linewidth = 2)
// plot(v2takeprofit_level_short ,color = strategy.position_size < 0 and show_sl_tp and v2 ? up_trend_line_colour : na , style = plot.style_steplinebr,linewidth = 2)


TS2 = plot(Trail2, 'Ema Strategy', style=plot.style_line, color=show_trend_line and Trail1 < Trail2 ? down_trend_line_colour : show_trend_line ? up_trend_line_colour  : na, linewidth=2)

// bgcolor(buy_signal ? color.rgb(0, 230, 119, 80) : na)
// bgcolor(sell_signal ? color.rgb(255, 82, 82, 80) : na)

Time_interval = true
buy_signal = Trail1 > Trail2 and direction < 0 and rsi_mom > mom_rsi_val and Time_interval
sell_signal =Trail1 < Trail2 and direction > 0 and rsi_mom > mom_rsi_val and Time_interval


// Strategy entries 
stop_long = (close < supertrend and v1) or (v2 and strategy.position_size > 0)
stop_short = (close > supertrend and v1) or (v2 and strategy.position_size < 0)
long_cond = ((close > ema150 ) and (ema50 > ema150) and (ema150 > ema200))
short_cond = ((close < ema150) and (ema50 < ema150) and (ema150 < ema200))
if (not stop_long) and (not short_cond) and long_cond and strategy.opentrades == 0 and (trade_direction == 'LONG' or trade_direction == 'BOTH') and buy_signal
    strategy.entry('Long_0', strategy.long, qty=dollar / close)

if (not stop_short) and (not long_cond) and short_cond and strategy.opentrades == 0 and (trade_direction == 'SHORT' or trade_direction == 'BOTH') and sell_signal
    strategy.entry('Short_0', strategy.short, qty=dollar / close)


if close < supertrend and v1
    strategy.exit('Long_Close',from_entry = "Long_0", stop=supertrend, qty_percent=100)
if  v2 and strategy.position_size > 0
    strategy.exit('Long_Close',from_entry = "Long_0", stop=v2stoploss_level_long,limit= v2takeprofit_level_long  , qty_percent=100)
    
if close > supertrend and v1
    strategy.exit('Short_Close',from_entry = "Short_0", stop=supertrend, qty_percent=100)
if  v2 and strategy.position_size < 0
    strategy.exit('Short_Close',from_entry = "Short_0", stop=v2stoploss_level_short,limit= v2takeprofit_level_short ,qty_percent=100)