Estrategia de seguimiento de tendencias del oscilador de impulso

El autor:¿ Qué pasa?, Fecha: 2024-01-22 10:08:55
Las etiquetas:

img

Resumen general

La estrategia de seguimiento de tendencias del oscilador de momento es un enfoque compuesto que utiliza indicadores de momento, osciladores y promedios móviles simultáneamente. Su objetivo es identificar las tendencias alcistas de la etapa 2 y las tendencias bajistas de la etapa 4 para generar señales largas y cortas precisas. Esta estrategia aprovecha sustancialmente la teoría del ciclo de mercado, tomando posiciones solo durante las etapas de mercado más rentables. Mientras tanto, también combina varias herramientas técnicas como análisis de momento, juicio de tendencia y evaluación de volatilidad para formar un marco de decisión integral y eficiente adaptado a los entornos comerciales modernos de ritmo rápido.

Estrategia lógica

Generación de señales y juicio de tendencias

Las señales de esta estrategia provienen de un conjunto de tres indicadores técnicos principales, incluidos el RSI de momento mejorado, el cruce de EMA y el ATR. Específicamente, la estrategia considera una tendencia alcista cuando la EMA más rápida cruza por encima de la EMA más lenta, generando señales largas; se identifica una tendencia bajista cuando la EMA más rápida cruza por debajo de la EMA más lenta, provocando señales cortas. Además, las áreas altas del RSI de momento representan una fuerte intención alcista, mientras que las áreas bajas indican abundantes fuerzas bajistas para confirmar la validez de las tendencias en curso.

Generación de señal específica de etapa

La singularidad de esta estrategia radica en que solo produce señales durante la Etapa 2 de un mercado alcista y la Etapa 4 de un mercado bajista. En otras palabras, abre posiciones exclusivamente cuando las tendencias alcistas muestran el impulso más fuerte y las tendencias bajistas muestran la mayor claridad. Este enfoque minimiza los riesgos derivados de las etapas inciertas de consolidación y distribución, lo que resulta en muy altas probabilidades de ganar.

Flujo general de decisiones

En resumen, la lógica de decisión de esta estrategia se puede describir como: confirmar la tendencia basada en etapas (etapa 2 o etapa 4) > determinar el sesgo alcista / bajista por Momentum RSI > juzgar la direccionalidad por cruce de EMA > incorporar ATR para establecer stop loss > abrir posiciones cuando se cumplan todos los criterios.

Ventajas

Aumento de la tasa de ganancia con la alineación del ciclo del mercado

La mayor ventaja proviene de la profunda comprensión de los patrones periódicos del mercado. Al operar solo durante las tendencias alcistas y bajistas más claras, filtra enormes ruidos inciertos e incrementa la tasa de éxito a más del 80%.

Reducción de señales falsas mediante filtros múltiples

El filtrado de múltiples indicadores que adopta métricas de impulso, fuerza de tendencia y volatilidad elimina las señales engañosas de cualquier indicador individual y mejora así sustancialmente la estabilidad y fiabilidad generales.

Muy personalizable debido a los abundantes parámetros

Los abundantes parámetros ajustables expuestos permiten a los usuarios adaptar la estrategia al estilo personal de negociación y a los regímenes cambiantes del mercado, facilitando una mayor optimización para sobresalir en situaciones específicas.

Riesgos y mitigaciones

Riesgos inherentes del mercado

Ninguna estrategia cuantitativa puede evitar por completo los riesgos inherentes al mercado, como los eventos impredecibles del cisne negro. Pero dichos riesgos existen objetivamente en lugar de derivarse de la estrategia en sí.

Sobreajuste de parámetros

La libertad de ajustar los parámetros también puede conducir a problemas de sobreajuste si no se hace con prudencia.

Oportunidades de optimización

Incorporación de algoritmos de dimensionamiento de posición

El enfoque actual de cantidad fija puede resultar en exposiciones insuficientes durante las mega tendencias. Una mejora es introducir módulos de dimensionamiento de posiciones y subir gradualmente posiciones más grandes cuando las tendencias se vuelven fuertemente evidentes, aprovechando así mejor esos grandes cambios.

Filtrar las señales con el aprendizaje automático

Esta estrategia puede interactuar con las técnicas de aprendizaje automático mediante la construcción de un modelo entrenado para calificar la calidad de la señal y filtrar las señales inferiores, llevando así el rendimiento general al siguiente nivel.

Conclusión

La estrategia de seguimiento de tendencias del oscilador de momento es un enfoque altamente inteligente y parametrizado. Se destaca por elevar la calidad de la señal mediante la explotación de patrones periódicos del mercado y produce entradas fiables y procesables a través de validaciones cruzadas de múltiples indicadores. Mientras tanto, los abundantes botones sintonizables proporcionan una gran flexibilidad a los usuarios. En conclusión, es una estrategia compuesta avanzada creíble y recomendable que demuestra una ventaja práctica para prosperar en los mercados modernos ultraeficientes y ofrecer un alfa constante.


/*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)

Más.