EMA 金叉 + ATR 追踪止损策略
EMA 金叉进场,ATR 动态止损,可选只做多,自带回测参数
效果示意图 · AI 根据源码绘制
//@version=6
strategy("EMA金叉死叉追踪止损策略", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.1)
// ==================== 参数设置 ====================
emaFastLen = input.int(9, "快速EMA周期", minval=1, tooltip="较短周期的EMA,对价格变化更敏感")
emaSlowLen = input.int(21, "慢速EMA周期", minval=1, tooltip="较长周期的EMA,代表趋势方向")
atrLen = input.int(14, "ATR周期", minval=1, tooltip="用于计算波动性的周期")
atrMult = input.float(2.0, "ATR止损倍数", minval=0.1, step=0.1, tooltip="止损距离 = ATR × 此倍数,推荐1.5-3.0")
riskReward = input.float(2.0, "风险回报比", minval=0.1, step=0.1, tooltip="止盈距离是止损距离的倍数,推荐2.0-3.0")
longOnly = input.bool(false, "仅做多", tooltip="开启后只做多单,不做空单")
riskPercent = input.float(1.0, "每单风险百分比", minval=0.1, maxval=100, step=0.1, tooltip="每笔交易风险占账户权益的百分比,推荐1%-2%")
// ==================== 计算指标 ====================
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
atr = ta.atr(atrLen)
// ==================== 交易信号 ====================
longCondition = ta.crossover(emaFast, emaSlow)
shortCondition = ta.crossunder(emaFast, emaSlow)
// ==================== 持仓状态跟踪 ====================
var float entryPrice = na // 入场价
var float stopLoss = na // 当前止损价
var float takeProfit = na // 止盈价
var int positionType = 0 // 1=多头, -1=空头, 0=无持仓
// 检测当前持仓
bool inLong = strategy.position_size > 0
bool inShort = strategy.position_size < 0
bool inPosition = inLong or inShort
// ==================== 开仓逻辑 ====================
// 多头开仓
if longCondition and not inPosition
entryPrice := close
stopLoss := entryPrice - atr * atrMult
takeProfit := entryPrice + (entryPrice - stopLoss) * riskReward
// 计算仓位:风险金额 / 每手风险金额
riskAmount = strategy.equity * riskPercent / 100
riskPerShare = entryPrice - stopLoss
// 防止除以零
if riskPerShare > 0
qty = riskAmount / riskPerShare
strategy.entry("多单", strategy.long, qty=qty)
positionType := 1
label.new(bar_index, low, "买入\n" + str.tostring(entryPrice, "#.##"),
color=color.new(color.green, 0),
textcolor=color.white,
style=label.style_label_up,
size=size.small)
// 空头开仓
if shortCondition and not inPosition and not longOnly
entryPrice := close
stopLoss := entryPrice + atr * atrMult
takeProfit := entryPrice - (stopLoss - entryPrice) * riskReward
// 计算仓位
riskAmount = strategy.equity * riskPercent / 100
riskPerShare = stopLoss - entryPrice
if riskPerShare > 0
qty = riskAmount / riskPerShare
strategy.entry("空单", strategy.short, qty=qty)
positionType := -1
label.new(bar_index, high, "卖出\n" + str.tostring(entryPrice, "#.##"),
color=color.new(color.red, 0),
textcolor=color.white,
style=label.style_label_down,
size=size.small)
// ==================== 追踪止损逻辑 ====================
// 多头追踪止损:止损只能上移不能下移
if inLong and positionType == 1
newStopLoss = close - atr * atrMult
if not na(stopLoss) and newStopLoss > stopLoss
stopLoss := newStopLoss
strategy.exit("多单止损止盈", "多单", stop=stopLoss, limit=takeProfit)
// 空头追踪止损:止损只能下移不能上移
if inShort and positionType == -1
newStopLoss = close + atr * atrMult
if not na(stopLoss) and newStopLoss < stopLoss
stopLoss := newStopLoss
strategy.exit("空单止损止盈", "空单", stop=stopLoss, limit=takeProfit)
// 平仓后重置状态
if not inPosition and positionType != 0
positionType := 0
entryPrice := na
stopLoss := na
takeProfit := na
// ==================== 绘图 ====================
// 绘制均线
plot(emaFast, "快速EMA", color=color.new(color.aqua, 0), linewidth=2)
plot(emaSlow, "慢速EMA", color=color.new(color.orange, 0), linewidth=2)
// 绘制当前止损线
plot(inPosition ? stopLoss : na, "追踪止损",
color=color.new(color.red, 20),
style=plot.style_linebr,
linewidth=2)
// 绘制止盈线
plot(inPosition ? takeProfit : na, "止盈位",
color=color.new(color.green, 20),
style=plot.style_linebr,
linewidth=2)
// 背景色:多头持仓浅绿,空头持仓浅红
bgcolor(inLong ? color.new(color.green, 95) : inShort ? color.new(color.red, 95) : na)作品说明
思路说明
这是一个基于 EMA 金叉死叉的趋势跟踪策略。快线上穿慢线时做多,下穿时做空。止损用 ATR 的倍数动态设置,随着价格向有利方向移动,止损会自动跟进(追踪止损),但永远不会往不利方向回退。止盈根据风险回报比自动计算。仓位大小根据账户权益和单笔风险百分比动态调整,确保每笔交易的风险可控。
使用说明
安装方法
- 打开 TradingView,进入任意图表
- 点击底部"Pine 编辑器"
- 复制上述完整代码粘贴进去
- 点击"添加到图表"
参数调整
- 快速EMA周期(默认9):越小越灵敏,信号越多但假信号也多;推荐 5-12
- 慢速EMA周期(默认21):越大趋势越平滑,推荐 20-50
- ATR周期(默认14):计算波动性的窗口,通常保持 14
- ATR止损倍数(默认2.0):倍数越大止损越宽松,不易被扫,但单次亏损更大;震荡市场用 1.5-2.0,趋势市场可用 2.5-3.0
- 风险回报比(默认2.0):止盈是止损的倍数,2.0 表示盈亏比 1:2;激进可用 1.5,保守可用 3.0
- 仅做多:牛市或不想做空时勾选
- 每单风险百分比(默认1%):单笔交易最大亏损占账户的比例,新手建议 0.5%-1%,熟练后可用 1%-2%
信号识别
- 图表上水色线是快速EMA,橙色线是慢速EMA
- 出现绿色"买入"标签代表做多开仓,红色"卖出"标签代表做空开仓
- 红色虚线是当前追踪止损位,会随价格向有利方向移动但不会回撤
- 绿色虚线是止盈位
- 背景浅绿色表示持有多单,浅红色表示持有空单
注意事项
- 这是趋势跟踪策略,适合有明确趋势的市场,震荡行情会频繁止损
- 追踪止损会自动保护利润,不需要手动平仓
- 回测时注意佣金和滑点设置是否符合实际
- 仓位根据风险百分比自动计算,确保每笔亏损可控
- 建议先在模拟盘测试,熟悉策略特性后再用于实盘
- 可结合更大周期(如日线、周线)的趋势方向过滤信号,提高胜率
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个基于 EMA 均线金叉死叉的趋势跟踪策略,用 Pine Script v6 写成,可直接在 TradingView 上回测和实盘跟单。快线上穿慢线时做多,下穿时做空,止损用 ATR 的倍数动态设置,会随价格向有利方向移动但永远不往回退(追踪止损),止盈根据你设的风险回报比自动算好。仓位大小也是自动算的,按你账户权益和愿意承担的单笔风险百分比来,确保每笔亏损可控。
逻辑原理
策略用两条 EMA 均线判断方向:快速 EMA(默认 9 周期)对价格反应灵敏,慢速 EMA(默认 21 周期)代表大趋势。当快线从下往上穿过慢线,判断为上涨趋势开始,开多单;快线从上往下穿慢线,判断下跌趋势开始,开空单(可以关掉只做多)。
开仓后,止损位置是入场价减去(做多)或加上(做空)ATR 的倍数。ATR 是平均真实波幅,反映市场波动大小,用它来设止损比固定点数合理。每根 K 线收盘后,策略会重新算一次止损:做多时,如果当前价减去 ATR×倍数 算出的新止损比旧止损高,就把止损往上提;做空时反过来,新止损比旧止损低才往下调。这样止损只会跟着利润走,不会回撤,保护已有盈利。
止盈位是入场时就算好的:止损距离乘以风险回报比。比如止损是 10 美元,风险回报比设 2.0,止盈就是 20 美元。仓位计算公式是:(账户权益 × 单笔风险百分比)÷ 每手风险金额,每手风险金额就是入场价和止损价的差。这样不管账户多大,每笔交易的风险都是固定百分比,亏了也不会伤筋动骨。
参数说明
- 快速EMA周期(9):算快线用的 K 线根数,越小越灵敏但假信号也多,推荐 5-12。
- 慢速EMA周期(21):算慢线用的 K 线根数,越大趋势越平滑,推荐 20-50。
- ATR周期(14):计算波动性的窗口,通常保持 14 就行。
- ATR止损倍数(2.0):止损距离是 ATR 的几倍,越大止损越宽松不易被扫但单次亏更多,震荡市场用 1.5-2.0,趋势市场可以放宽到 2.5-3.0。
- 风险回报比(2.0):止盈距离是止损距离的倍数,2.0 就是盈亏比 1:2,激进可以 1.5,保守可以 3.0。
- 仅做多(false):勾上后只做多单不做空单,牛市或不想做空时用。
- 每单风险百分比(1.0):单笔交易最大亏损占账户的比例,新手建议 0.5%-1%,熟练了可以 1%-2%。
怎么用
打开 TradingView 任意图表,点底部"Pine 编辑器",把源码全部复制粘贴进去,点"添加到图表"。图上会出现水色和橙色两条 EMA 线,买入卖出的时候会打标签,红色虚线是当前止损,绿色虚线是止盈位,持仓时背景会变浅绿(多单)或浅红(空单)。
参数在策略设置里调,点图表上的策略名称就能打开面板。回测的时候注意把手续费和滑点设成你实际交易的数,默认是 0.1% 手续费。想实盘跟单的话,TradingView 支持对接部分券商和交易所,在策略设置的"自动交易"里配置。
建议先在日线或 4 小时线上测,周期太小信号太多容易被手续费吃掉利润。
适用场景
这是标准的趋势跟踪策略,适合有明确单边行情的市场。股指、外汇主要货币对、黄金原油、主流加密货币的日线或 4 小时线都可以试。行情走出一波单边上涨或下跌的时候,追踪止损能吃到趋势中段的大部分利润。
不适合震荡市。横盘整理或者区间来回拉锯的时候,均线会频繁金叉死叉,每次进去没走几步就被止损,连续亏小钱。也不适合周期太小的超短线,1 分钟 5 分钟线上均线完全是噪音,而且滑点和手续费占比太高。
如果你交易的品种波动特别大(比如小币种、个股),ATR 倍数可以适当放大到 2.5 或 3.0,不然容易被正常波动扫出来。波动小的品种(比如 EURUSD)可以收紧到 1.5-2.0。
风险提示
EMA 均线是滞后指标,金叉死叉出现的时候趋势往往已经走了一段,你是在追涨杀跌,吃不到最开头的那段。如果趋势走得不远就反转,很可能刚进场就被止损。震荡市里会被反复打脸,连续止损是常态。
追踪止损虽然能保护利润,但也可能让你在大波动里过早离场。比如多单已经盈利 30%,一根大阴线回调,止损被打掉,结果价格第二天又创新高,你就只能眼睁睁看着。这是追踪止损的代价,想要保护利润就得接受可能提前下车。
仓位自动计算虽然控制了单笔风险,但连续亏损还是会让账户回撤。如果遇到连续 5-10 次止损(震荡市很常见),账户还是会缩水 5-10%。所以不要在明显的震荡区间里硬开策略,最好结合更大周期(日线、周线)的方向过滤,只做顺大趋势的单。
代码里没有处理滑点和重新报价的逻辑,回测结果会比实盘好看。实盘时尤其是止损单,可能拿不到你设的价位。手续费也要算准,0.1% 往返就是 0.2%,一个月交易 20 次就是 4% 的成本。
常见问题
- 这个策略会重绘吗?
- 不会。EMA 和 ATR 都是确认指标,K 线收盘后数值就固定了,不会因为后续价格变化而改变历史信号。追踪止损也是每根 K 线收盘时更新,不会回头修改。
- 可以用在加密货币 24 小时市场吗?
- 可以。策略没有时间段限制,任何市场任何品种都能跑。但 24 小时市场波动更频繁,建议用 4 小时或日线周期,并且把 ATR 倍数适当放大到 2.5-3.0,避免被正常波动扫出来。
- 默认参数适合什么周期?
- 默认参数(9 和 21 周期 EMA,2.0 倍 ATR 止损)比较适合日线和 4 小时线。如果用 1 小时或更短周期,建议把快慢 EMA 周期都缩短(比如 5 和 13),但要注意信号会变多,手续费占比也会上升。
- 为什么回测盈利但实盘亏损?
- 最常见的原因是滑点和手续费。回测默认成交价是理想价格,实盘会有滑点,尤其止损单容易滑点更大。另外如果你在震荡市里开着策略,会被连续止损,回测可能恰好避开了那段时间。建议先用模拟盘跟一个月,看实际成交情况。
- 可以同时用在多个品种上吗?
- 可以,但每个品种的波动特性不同,参数需要分别调整。黄金、原油波动大,ATR 倍数可以放宽;外汇主要货币对波动小,可以收紧。不要所有品种都用同一套参数,否则有些品种会频繁止损,有些品种止损又太宽。
EMA Crossover Strategy with ATR Trailing Stop for TradingView
A trend-following strategy that enters on EMA crossovers and uses ATR-based trailing stops to protect profits. Position sizing is automatically calculated based on account risk percentage, with optional long-only mode and built-in backtesting parameters.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。