该策略是一个基于多重均线交叉的趋势跟踪系统,结合了SMA和EMA指标来捕捉市场趋势。策略通过自定义周期的简单移动平均线(SMA)和两条指数移动平均线(EMA)的配合使用,构建了一个完整的趋势跟踪交易系统。同时集成了动态止损和利润目标管理机制,有效地控制风险和锁定收益。
策略主要基于三条均线的动态关系进行交易决策。系统通过监测价格与SMA的相对位置,以及快速EMA与慢速EMA的交叉来确定趋势方向。入场信号分为两种触发方式:其一是价格位于SMA之上(之下)且快速EMA上穿(下穿)慢速EMA;其二是价格突破SMA且前期价格持续保持在SMA上方(下方)。策略采用动态止损机制,初始止损基于EMA位置或固定百分比,随着盈利增加会相应调整止损位置。
该策略通过多重均线的配合使用构建了一个完整的趋势跟踪系统,在入场、出场和风险管理等方面都有详细的规则设计。策略的优势在于能够有效识别和跟踪趋势,同时通过动态止损机制来保护利润。虽然存在一些固有的风险,但通过提出的优化方向可以进一步提升策略的稳定性和适应性。策略整体设计合理,具有较好的实用价值和优化空间。
/*backtest
start: 2025-02-17 17:00:00
end: 2025-02-20 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/
//@version=5
strategy("交易策略(自定义EMA/SMA参数)", overlay=true, initial_capital=100000, currency=currency.EUR, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// 输入参数:可调的 SMA 和 EMA 周期
smaLength = input.int(120, "SMA Length", minval=1, step=1)
emaFastPeriod = input.int(13, "EMA Fast Period", minval=1, step=1)
emaSlowPeriod = input.int(21, "EMA Slow Period", minval=1, step=1)
// 计算均线
smaVal = ta.sma(close, smaLength)
emaFast = ta.ema(close, emaFastPeriod)
emaSlow = ta.ema(close, emaSlowPeriod)
// 绘制均线
plot(smaVal, color=color.orange, title="SMA")
plot(emaFast, color=color.blue, title="EMA Fast")
plot(emaSlow, color=color.red, title="EMA Slow")
// 入场条件 - 做多
// 条件1:收盘价高于SMA 且 EMA Fast 向上穿越 EMA Slow
longTrigger1 = (close > smaVal) and ta.crossover(emaFast, emaSlow)
// 条件2:收盘价上穿SMA 且前5根K线的最低价均高于各自的SMA
longTrigger2 = ta.crossover(close, smaVal) and (low[1] > smaVal[1] and low[2] > smaVal[2] and low[3] > smaVal[3] and low[4] > smaVal[4] and low[5] > smaVal[5])
longCondition = longTrigger1 or longTrigger2
// 入场条件 - 做空
// 条件1:收盘价低于SMA 且 EMA Fast 向下穿越 EMA Slow
shortTrigger1 = (close < smaVal) and ta.crossunder(emaFast, emaSlow)
// 条件2:收盘价下穿SMA 且前5根K线的最高价均低于各自的SMA
shortTrigger2 = ta.crossunder(close, smaVal) and (high[1] < smaVal[1] and high[2] < smaVal[2] and high[3] < smaVal[3] and high[4] < smaVal[4] and high[5] < smaVal[5])
shortCondition = shortTrigger1 or shortTrigger2
// 定义变量记录入场时的价格与EMA Fast值,用于计算止损
var float entryPriceLong = na
var float entryEMA_Fast_Long = na
var float entryPriceShort = na
var float entryEMA_Fast_Short = na
// 入场与初始止盈止损设置 - 做多
// 止损取“开仓时的EMA Fast价格”与“0.2%止损”中较大者;止盈为止损的5倍
if (longCondition and strategy.position_size == 0)
entryPriceLong := close
entryEMA_Fast_Long := emaFast
strategy.entry("Long", strategy.long)
stopPercLong = math.max(0.002, (entryPriceLong - entryEMA_Fast_Long) / entryPriceLong)
stopLong = entryPriceLong * (1 - stopPercLong)
tpLong = entryPriceLong * (1 + 5 * stopPercLong)
strategy.exit("LongExit", "Long", stop=stopLong, limit=tpLong)
// 入场与初始止盈止损设置 - 做空
// 止损取“开仓时的EMA Fast价格”与“0.2%止损”中较大者;止盈为止损的5倍
if (shortCondition and strategy.position_size == 0)
entryPriceShort := close
entryEMA_Fast_Short := emaFast
strategy.entry("Short", strategy.short)
stopPercShort = math.max(0.002, (entryEMA_Fast_Short - entryPriceShort) / entryPriceShort)
stopShort = entryPriceShort * (1 + stopPercShort)
tpShort = entryPriceShort * (1 - 5 * stopPercShort)
strategy.exit("ShortExit", "Short", stop=stopShort, limit=tpShort)
// 移动止损逻辑
// 当持仓盈利达到0.8%时更新止损和止盈,保持止盈为止损的5倍
var float longHighest = na
if (strategy.position_size > 0)
longHighest := na(longHighest) ? high : math.max(longHighest, high)
if (high >= entryPriceLong * 1.008)
newLongStop = longHighest * (1 - 0.003)
newPerc = (entryPriceLong - newLongStop) / entryPriceLong
newLongTP = entryPriceLong * (1 + 5 * newPerc)
strategy.exit("LongExit", "Long", stop=newLongStop, limit=newLongTP)
else
longHighest := na
var float shortLowest = na
if (strategy.position_size < 0)
shortLowest := na(shortLowest) ? low : math.min(shortLowest, low)
if (low <= entryPriceShort * 0.992)
newShortStop = shortLowest * (1 + 0.003)
newPercShort = (newShortStop - entryPriceShort) / entryPriceShort
newShortTP = entryPriceShort * (1 - 5 * newPercShort)
strategy.exit("ShortExit", "Short", stop=newShortStop, limit=newShortTP)
else
shortLowest := na
// 额外平仓条件
// 如果持多仓时EMA Fast下穿EMA Slow,则立即平多
if (strategy.position_size > 0 and ta.crossunder(emaFast, emaSlow))
strategy.close("Long", comment="EMA下穿平多")
// 如果持空仓时EMA Fast上穿EMA Slow,则立即平空
if (strategy.position_size < 0 and ta.crossover(emaFast, emaSlow))
strategy.close("Short", comment="EMA上穿平空")