PineEA / 策略无需编译 39 8

EMA 金叉 + ATR 追踪止损策略

XAUOF 官方·1 天前发布

EMA 金叉进场,ATR 动态止损,可选只做多,自带回测参数

EMA 金叉 + ATR 追踪止损策略

效果示意图 · AI 根据源码绘制

ema_crossover_trailing_stop_strategy.pine113
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//@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 的倍数动态设置,随着价格向有利方向移动,止损会自动跟进(追踪止损),但永远不会往不利方向回退。止盈根据风险回报比自动计算。仓位大小根据账户权益和单笔风险百分比动态调整,确保每笔交易的风险可控。

使用说明

安装方法

  1. 打开 TradingView,进入任意图表
  2. 点击底部"Pine 编辑器"
  3. 复制上述完整代码粘贴进去
  4. 点击"添加到图表"

参数调整

  • 快速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
  • 出现绿色"买入"标签代表做多开仓,红色"卖出"标签代表做空开仓
  • 红色虚线是当前追踪止损位,会随价格向有利方向移动但不会回撤
  • 绿色虚线是止盈位
  • 背景浅绿色表示持有多单,浅红色表示持有空单

注意事项

  1. 这是趋势跟踪策略,适合有明确趋势的市场,震荡行情会频繁止损
  2. 追踪止损会自动保护利润,不需要手动平仓
  3. 回测时注意佣金和滑点设置是否符合实际
  4. 仓位根据风险百分比自动计算,确保每笔亏损可控
  5. 建议先在模拟盘测试,熟悉策略特性后再用于实盘
  6. 可结合更大周期(如日线、周线)的趋势方向过滤信号,提高胜率

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.

评论

后可以留言,比如反馈用着怎么样、想加什么功能。

还没有人评论,来抢个沙发。