
A estratégia é um sistema de negociação complexo baseado no ATR que rastreia de forma dinâmica o stop loss e o cruzamento da linha de equilíbrio, combinando múltiplos indicadores técnicos para filtragem de transações e controle de risco. A estratégia funciona em um período de 15 minutos, determinando sinais de negociação por meio de indicadores multidimensionais, como a linha de equilíbrio EMA, a volatilidade ATR, o indicador RSI e o volume de transação, e gerencia o risco de perda usando um método de rastreamento dinâmico.
A lógica central da estratégia inclui os seguintes componentes-chave:
A estratégia de construir um sistema de negociação relativamente completo através da aplicação integrada de vários indicadores técnicos e meios de controle de risco. A principal característica da estratégia é a adoção de stop loss de rastreamento ATR dinâmico para se adaptar à volatilidade do mercado, ao mesmo tempo em que utiliza filtragem de múltiplos indicadores e cruzamento de linhas uniformes para confirmar os sinais de negociação.
/*backtest
start: 2024-02-19 00:00:00
end: 2025-02-16 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title='UT Bot Strategy with 100 EMA Filter, Trailing Stop and EMA Cross Exit', overlay=true)
// Inputs
a = input(1, title='Key Value. \'This changes the sensitivity\'')
c = input(10, title='ATR Period')
h = input(false, title='Signals from Heikin Ashi Candles')
// Higher timeframe trend filter (1-hour)
higherTimeframeEMA = request.security(syminfo.tickerid, "60", ta.ema(close, 100)) // 1-hour EMA
xATR = ta.atr(c)
// Adjusting ATR multiplier for Gold on 15-minute timeframe
atrMultiplier = 3
nLoss = atrMultiplier * xATR // ATR-based loss calculation
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close
// Trailing Stop Calculation
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2
pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
// Define 100 EMA
ema100 = ta.ema(src, 100)
plot(ema100, title="100 EMA", color=color.black, linewidth=2)
// Define 15 EMA and 17 EMA for exit conditions
ema15 = ta.ema(src, 15)
ema17 = ta.ema(src, 17)
plot(ema15, title="15 EMA", color=color.blue, linewidth=1)
plot(ema17, title="17 EMA", color=color.purple, linewidth=1)
// Define Entry Conditions
longCondition = src > ema100 and src > xATRTrailingStop and close > higherTimeframeEMA and ta.crossover(ta.ema(src, 1), xATRTrailingStop)
shortCondition = src < ema100 and src < xATRTrailingStop and close < higherTimeframeEMA and ta.crossover(xATRTrailingStop, ta.ema(src, 1))
// RSI Filter
rsi = ta.rsi(close, 14)
longCondition := longCondition and rsi > 30 and rsi < 70 // Ensure RSI is not in extreme conditions
shortCondition := shortCondition and rsi > 30 and rsi < 70
// Volume Filter
volumeMA = ta.sma(volume, 20)
longCondition := longCondition and volume > volumeMA
shortCondition := shortCondition and volume > volumeMA
// ** Trailing Stop Setup **
trailOffset = nLoss // The trailing stop distance is based on ATR, which is already calculated
trailPriceLong = close - trailOffset // The trailing stop for long trades is below the entry price
trailPriceShort = close + trailOffset // The trailing stop for short trades is above the entry price
// Define Take Profit (TP) condition
takeProfitMultiplier = 2 // This sets the take profit at 2x the ATR from the entry
takeProfitLong = close + takeProfitMultiplier * nLoss
takeProfitShort = close - takeProfitMultiplier * nLoss
// Strategy Entries
if (longCondition)
strategy.entry('long', strategy.long)
if (shortCondition)
strategy.entry('short', strategy.short)
// Exit conditions for 15 and 17 EMA cross (must be consecutive on two bars)
exitLong = ta.crossover(ema15, ema17) and ta.crossover(ema15[1], ema17[1]) // Exit long if both the current and previous bars have 15 EMA crossing above 17 EMA
exitShort = ta.crossunder(ema15, ema17) and ta.crossunder(ema15[1], ema17[1]) // Exit short if both the current and previous bars have 15 EMA crossing below 17 EMA
// Apply trailing stop and take profit along with EMA cross exit
strategy.exit("Exit Long", "long", trail_price=trailPriceLong, trail_offset=trailOffset, limit=takeProfitLong) // Long exit with trailing stop and TP
strategy.exit("Exit Short", "short", trail_price=trailPriceShort, trail_offset=trailOffset, limit=takeProfitShort) // Short exit with trailing stop and TP
// Close positions when 15 and 17 EMAs cross consecutively
strategy.close("long", when=exitLong)
strategy.close("short", when=exitShort)
// Alert condition for trade closure
longExitAlert = exitLong // Only trigger alert for long if both consecutive bars show crossover
shortExitAlert = exitShort // Only trigger alert for short if both consecutive bars show crossunder
alertcondition(longExitAlert, title="Close Long Trade", message="Long trade closed. 15 EMA crossed above 17 EMA on two consecutive bars.")
alertcondition(shortExitAlert, title="Close Short Trade", message="Short trade closed. 15 EMA crossed below 17 EMA on two consecutive bars.")