
Se trata de una estrategia de seguimiento de tendencias de varios horizontes basada en el rango de fluctuación real promedio (ATR) y el promedio móvil del índice (EMA). La estrategia permite una captura precisa y una gestión de riesgos de las tendencias del mercado a través de la determinación de los paros y las tendencias dinámicas.
Los principios centrales de la estrategia incluyen los siguientes pasos clave:
Las principales lógicas de cálculo:
Sugerencias para el control de riesgos:
Objetivos de optimización: aumentar la estabilidad de la estrategia, reducir el retroceso y aumentar la rentabilidad
Se trata de una estrategia de seguimiento de tendencias dinámicas basada en ATR y EMA, que permite una participación en el mercado relativamente estable a través de mecanismos de suspensión de pérdidas y de tendencias flexibles. La estrategia tiene buenas características de adaptabilidad y gestión de riesgos, pero aún necesita ser optimizada y verificada continuamente.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-02 00:00:00
period: 3h
basePeriod: 3h
exchanges: [{"eid":"Futures_Binance","currency":"BNB_USDT"}]
*/
//@version=6
strategy("ducanhmaster v1", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1, slippage=3, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Inputs
a = input.int(1, title="Key Value. 'This changes the sensitivity'")
c = input.int(10, title="ATR Period")
h = input.bool(false, title="Signals from Heikin Ashi Candles")
xATR = ta.atr(c)
nLoss = a * xATR
// Compute Heikin Ashi values
heikinAshiOpen = (open + close) / 2
heikinAshiClose = (open + high + low + close) / 4
heikinAshiHigh = math.max(high, math.max(heikinAshiOpen, heikinAshiClose))
heikinAshiLow = math.min(low, math.min(heikinAshiOpen, heikinAshiClose))
src = h ? heikinAshiClose : close
// Declare xATRTrailingStop as a float variable and initialize it with 'na'
var float xATRTrailingStop = na
if (src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0))
xATRTrailingStop := math.max(nz(xATRTrailingStop[1]), src - nLoss)
else if (src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0))
xATRTrailingStop := math.min(nz(xATRTrailingStop[1]), src + nLoss)
else
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
// Declare 'pos' as an integer variable instead of leaving it undefined
var int pos = na
if (src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0))
pos := 1
else if (src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0))
pos := -1
else
pos := nz(pos[1], 0)
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
// Plot buy/sell signals on the chart
plotshape(buy, title="Buy", text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.white, size=size.tiny)
plotshape(sell, title="Sell", text='Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.white, size=size.tiny)
// Change bar color when buy/sell conditions are met
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
// Enter a Long trade when a buy signal appears and exit when a sell signal appears
if (buy)
strategy.entry("long", strategy.long)
if (sell)
strategy.close("long")