该策略通过计算ATR指标作为止损线,当价格上穿EMA时产生买入信号,当价格下穿EMA时产生卖出信号,并使用动态止损来管理风险。
该策略的核心逻辑是:
计算ATR指标作为止损线,ATR值用来计算止损距离nLoss
根据Heikin Ashi蜡烛选项h来决定价格源,默认使用收盘价close,如果选择了Heikin Ashi则使用该蜡烛的收盘价
定义xATRTrailingStop作为动态跟踪止损线,根据价格与前一根K线的止损线比较,来确定当前K线的止损线
定义仓位pos,当价格上穿止损线时设置为1(做多),当价格下穿止损线时设置为-1(做空),否则为0(空仓)
计算一根K线的EMA均线值,定义指标上穿(买入信号)和下穿(卖出信号)
在买入和卖出信号发生时,设置交易入场和出场
使用barcolor函数根据仓位标记K线的颜色
使用plotshape在买入和卖出时标记信号
该策略通过ATR动态止损来管理风险,在趋势出现时能够及时入场,在止损线触发时及时止损。
该策略具有以下优势:
使用ATR动态止损,可以根据市场波动程度来调整止损距离,在保证止损的同时也避免过于激进的止损被价格短期波动触发
采用EMA产生交易信号,可以过滤掉部分假突破带来的不必要交易
允许选择Heikin Ashi蜡烛作为价格源,可以过滤噪音以识别趋势
仓位管理清晰,做多做空仓位明确,避免追踪止损产生的交易频繁
通过画线、标记和染色直观显示交易信号和止损情况
策略逻辑简单清晰,容易理解和修改
可自定义ATR周期和ATR止损倍数,适应不同市场环境
综上,该策略整合趋势跟踪和动态止损技术,可以有效识别趋势并管理风险,适用于跟踪中长线趋势的交易。
该策略也存在一定风险:
EMA均线产生交易信号可能滞后,错过短线机会
止损距离由ATR决定,在市场震荡时容易频繁止损
未考虑成本因素,实际交易中双边手续费会影响盈利
未设置适当的头寸控制,在资金管理上有待改进
效果依赖参数优化,不同市场需要调整参数
大幅震荡市场中容易被套牢
须适时监控,及时干预或停止策略
可以通过适当优化参数,设置头寸控制,结合其它指标过滤信号等方法来减少风险。在实盘交易中要控制仓位规模,持续监控策略效果,必要时人工干预或关闭。
该策略可以从以下几个方面进行优化:
调整ATR参数,在不同市场中使止损距离更合理
测试不同均线指标,进一步过滤假信号
增加趋势判断指标,识别趋势方向后再入场
设置头寸控制,限制单向仓位数量
增加开仓条件,如交易量,收盘价远离均线等
考虑成本因素,根据手续费设置止损距离
优化买入卖出时机,结合多种信号和指标
设置部分止盈或移动止盈
添加参数优化功能,自动优化测试参数
通过综合运用多种技术指标和优化方法,可以进一步完善该策略,在更多市场中获得更稳定的效果。
该策略整合动态止损和趋势跟踪技术,具有止损有效、跟踪顺畅、易于理解和优化等优点,适用于跟踪中长线趋势模式。但也要注意控制风险,优化参数。如果用好该策略,在趋势明显的市场中,可以获得不错的效果。总体来说,该策略提供了一个简洁实用的趋势跟踪和风险管理的交易思路。
/*backtest start: 2022-10-25 00:00:00 end: 2023-10-31 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="UT Bot Strategy", overlay = true) //CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. // Inputs a = input(1, title = "Key Vaule. 'This changes the sensitivity'") c = input(10, title = "ATR Period") h = input(false, title = "Signals from Heikin Ashi Candles") xATR = atr(c) nLoss = a * xATR src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = false) : close xATRTrailingStop = 0.0 xATRTrailingStop := iff(src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), src - nLoss), iff(src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), src + nLoss), iff(src > nz(xATRTrailingStop[1], 0), src - nLoss, src + nLoss))) pos = 0 pos := iff(src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0), 1, iff(src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue ema = ema(src,1) above = crossover(ema, xATRTrailingStop) below = crossover(xATRTrailingStop, ema) buy = src > xATRTrailingStop and above sell = src < xATRTrailingStop and below barbuy = src > xATRTrailingStop barsell = src < xATRTrailingStop plotshape(buy, title = "Buy", text = 'Buy', style = shape.labelup, location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny) plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red, textcolor = color.white, transp = 0, size = size.tiny) barcolor(barbuy ? color.green : na) barcolor(barsell ? color.red : na) strategy.entry("long", true, when = buy) strategy.entry("short", false, when = sell)