
La estrategia es un sistema de seguimiento de tendencias y inversiones basado en líneas medias compuestas. Identifica las oportunidades de negociación mediante la combinación de promedios móviles de diferentes períodos, combinados con la reacción de los precios a las líneas medias. El núcleo de la estrategia es determinar el momento de negociación observando la relación entre los precios y las líneas medias y la reacción de los precios cuando se retroceden a una determinada desvalorización.
La estrategia utiliza una combinación de varios tipos de medias móviles (EMA, TEMA, DEMA, WMA, SMA) para construir una línea de medias compleja a través de dos períodos diferentes (default 20 y 30) de medias ponderadas o aritméticas. Cuando los precios están por encima de la línea de medias se considera una tendencia alcista y por debajo de la línea de medias se considera una tendencia bajista.
Se trata de una estrategia que combina el seguimiento de tendencias y el concepto de negociación inversa para capturar oportunidades de negociación mediante la combinación de la línea media y el mecanismo de reacción de los precios. La estrategia tiene como ventaja central su flexibilidad y su capacidad para filtrar señales falsas, pero también requiere atención a la optimización de los parámetros en diferentes entornos de mercado.
/*backtest
start: 2024-10-01 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Ultrajante MA Reaction Strategy", overlay=true, initial_capital=10000,
default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// ===== Custom Functions for DEMA and TEMA =====
dema(src, length) =>
ema1 = ta.ema(src, length)
ema2 = ta.ema(ema1, length)
2 * ema1 - ema2
tema(src, length) =>
ema1 = ta.ema(src, length)
ema2 = ta.ema(ema1, length)
ema3 = ta.ema(ema2, length)
3 * ema1 - 3 * ema2 + ema3
// ===== Configuration Parameters =====
// MA Type Selection
maType = input.string(title="MA Type", defval="EMA", options=["SMA", "EMA", "WMA", "DEMA", "TEMA"])
// Parameters for composite periods
periodA = input.int(title="Period A", defval=20, minval=1)
periodB = input.int(title="Period B", defval=30, minval=1)
compMethod = input.string(title="Composite Method", defval="Average", options=["Average", "Weighted"])
// Reaction percentage (e.g., 0.5 means 0.5%)
reactionPerc = input.float(title="Reaction %", defval=0.5, step=0.1)
// ===== Composite Period Calculation =====
compPeriod = compMethod == "Average" ? math.round((periodA + periodB) / 2) : math.round((periodA * 0.6 + periodB * 0.4))
// ===== Moving Average Calculation based on selected type =====
ma = switch maType
"SMA" => ta.sma(close, compPeriod)
"EMA" => ta.ema(close, compPeriod)
"WMA" => ta.wma(close, compPeriod)
"DEMA" => dema(close, compPeriod)
"TEMA" => tema(close, compPeriod)
=> ta.ema(close, compPeriod) // Default value
plot(ma, color=color.blue, title="MA")
// ===== Trend Definition =====
trendUp = close > ma
trendDown = close < ma
// ===== Reaction Threshold Calculation =====
// In uptrend: expect the price to retrace to or below a value close to the MA
upThreshold = ma * (1 - reactionPerc / 100)
// In downtrend: expect the price to retrace to or above a value close to the MA
downThreshold = ma * (1 + reactionPerc / 100)
// ===== Quick Reaction Detection =====
// For uptrend: reaction is detected if the low is less than or equal to the threshold and the close recovers and stays above the MA
upReaction = trendUp and (low <= upThreshold) and (close > ma)
// For downtrend: reaction is detected if the high is greater than or equal to the threshold and the close stays below the MA
downReaction = trendDown and (high >= downThreshold) and (close < ma)
// ===== Trade Execution =====
if upReaction
// Close short position if exists and open long position
strategy.close("Short", comment="Close Short due to Bullish Reaction")
strategy.entry("Long", strategy.long, comment="Long Entry due to Bullish Reaction in Uptrend")
if downReaction
// Close long position if exists and open short position
strategy.close("Long", comment="Close Long due to Bearish Reaction")
strategy.entry("Short", strategy.short, comment="Short Entry due to Bearish Reaction in Downtrend")
// ===== Visualization of Reactions on the Chart =====
plotshape(upReaction, title="Bullish Reaction", style=shape.arrowup, location=location.belowbar, color=color.green, size=size.small, text="Long")
plotshape(downReaction, title="Bearish Reaction", style=shape.arrowdown, location=location.abovebar, color=color.red, size=size.small, text="Short")