Camovia Tray™

Blog · 问题解答

如何在 Pine Script 中编写止损和止盈:完整指南

Camovia Tray 团队 · 2026-09-17

你已经在 TradingView 中构建了一个策略。入场信号很扎实——可能是均线交叉,也可能是突破——回测曲线看起来也很有前景。你点击“添加到图表”,看到几笔交易出现,然后你注意到一个问题:这些交易就一直开着。或者更糟,它们在错误的时间平仓了。你没有正确地编写出场逻辑。

这是 Pine Script 中最常见的绊脚石之一。知道如何入场只是战斗的一半;管理出场——特别是编写止损和止盈——才是区分一个理论上看起来不错的策略和一个真正可以用于交易的策略的关键。让我们详细走一遍具体怎么做,以及为什么它比乍看起来更棘手。

核心:使用 strategy.exit()

用止损或止盈退出交易的基本工具是 strategy.exit() 函数。它的基本签名如下:

strategy.exit(id, from_entry, stop, limit)
  • id:这个出场订单的唯一字符串标识符。
  • from_entry:你想要退出的入场订单的 id
  • stop:触发止损订单的价格。
  • limit:触发止盈订单的价格。

最直观的方法是在入场条件之后立即放置它。例如:

if longCondition
    strategy.entry("Long", strategy.long)
    strategy.exit("Long Exit", from_entry="Long", stop=close * 0.99, limit=close * 1.02)

这能行,但有点天真。stoplimit 价格是在入场订单下达时根据 close 计算的。如果市场跳空或快速移动,这些价格可能太近——或者更糟,在出场订单甚至还没激活之前就已经被突破了。

三种方法(以及该用哪一种)

随着时间的推移,Pine Script 开发者已经收敛到几种模式。每种都有它的用武之地,但有一种对于复杂策略来说明显更优越。

方法 1:每个入场一个 strategy.exit() 这是经典方法。你下一个入场订单和一个出场订单,同时处理止损和止盈。它干净、简单,对于基础策略来说完美适用。限制是每笔交易只能有一个止盈水平和一个止损水平。

方法 2:多个 strategy.exit() 调用 一些开发者尝试使用多个 strategy.exit() 调用——一个用于止损,一个用于止盈。想法是独立管理它们。在实践中,这通常会失败或产生意外行为。为什么?因为在 Pine Script 中,每个 strategy.exit() 调用都会保留你仓位的一部分。如果你有两个出场订单,每一个都会分到你的交易的一部分。回测可能看起来像是发生了部分出场,但那不是你的本意。

方法 3:合并式出场管理器 这是最稳健的方法,特别是如果你想加入移动止损、保本止损或动态计算。与其在入场时立即下出场订单,不如用 var 变量管理出场状态,并在持仓期间每根 K 线调用一次 strategy.exit()

这是一个可用的模板:

//@version=6
strategy("Exit Manager Example", overlay=true, initial_capital=10000)

// --- Inputs ---
slPct = input.float(1.0, "Stop Loss %", step=0.1) / 100
tpPct = input.float(2.0, "Take Profit %", step=0.1) / 100

// --- State Variables ---
var float trailPeak = na
var float trailTrough = na

// --- Entry Condition (Example: Crossover of SMAs) ---
fastSMA = ta.sma(close, 9)
slowSMA = ta.sma(close, 21)
longCondition = ta.crossover(fastSMA, slowSMA)
shortCondition = ta.crossunder(fastSMA, slowSMA)

if longCondition
    strategy.entry("Long", strategy.long)

if shortCondition
    strategy.entry("Short", strategy.short)

// --- Exit Management (Runs every bar) ---
if strategy.position_size > 0
    avgPrice = strategy.position_avg_price
    
    // Fixed Stop and TP levels
    float fixedSL = avgPrice * (1.0 - slPct)  // For long
    float fixedTP = avgPrice * (1.0 + tpPct)  // For long
    
    // --- Dynamic Adjustments (Example: Trail) ---
    // If long, track the highest high since entry
    trailPeak := math.max(nz(trailPeak), high)
    float trailSL = trailPeak * (1.0 - slPct)  // Trail from peak
    
    // Choose the most protective (higher) stop
    float finalStop = na
    if not na(fixedSL)
        finalStop := fixedSL
    if not na(trailSL) and (na(finalStop) or trailSL > finalStop)
        finalStop := trailSL
    
    // Single exit call with both levels
    strategy.exit("Long Exit", from_entry="Long", 
                  stop=finalStop, limit=fixedTP)
    
else
    // Reset trail when no position is open
    trailPeak := na

// --- Short side logic follows the same pattern with min() for stops ---

这种方法确保:

  • 一个出场订单控制整个仓位。
  • 止损可以动态收紧(移动)而不会产生多个部分出场。
  • 同样的逻辑同时适用于止损和止盈,如果需要,每根 K 线都会更新。

关键规则:出场订单不是“更新”

一个常见的困惑点是把 strategy.exit() 当作一个“更新”订单的函数。它不是。在 Pine Script 中,如果你用相同的 id 再次调用 strategy.exit(),它会完全替换之前的出场订单。更重要的是,你不能只更新止损或只更新止盈。每次调用 strategy.exit() 时,你都必须指定 stoplimit 两个参数,即使只有一个发生了变化。

这就是为什么合并式管理器模式如此强大。通过每根 K 线重新计算止损和止盈水平,并用最新值调用一次 strategy.exit(),你确保出场始终是最新的——无论你是在调整移动止损、移动止盈,还是激活保本规则。

那基于百分比的出场呢?

Pine Script 也提供了辅助函数,用于将止损和止盈表示为百分比。库函数 exitPercent() 是一个包装器,让你以入场价格的百分比指定亏损和盈利。例如:

// Requires the Strategy library
// exitPercent("Exit", lossPercent=1.0, profitPercent=2.0)

然而,这种方法在启用金字塔加仓时可能不可靠,因为它内部使用 strategy.position_avg_price,这可能无法反映单个入场的价格。在大多数情况下,从 strategy.position_avg_price 或特定入场价格手动计算价格更透明、更可预测。

从回测到现实:代码与市场交汇之处

你已经编写了止损和止盈。回测看起来像一条直线向上。但现实检查是:Pine Script 是一种回测语言。它的执行模型是“每根 K 线一次”,订单基于最高价、最低价、开盘价和收盘价进行模拟。在实时市场中,事情是连续运动的。

这就是编码逻辑和市场执行之间的差距变得非常真实的地方。你可能花几个小时完善你的 Pine Script 出场逻辑,却发现在 MetaTrader 中执行这些交易需要手动干预、复制粘贴警报消息,或者 juggling 多个窗口来盯住未平仓头寸。

如果你正在积极交易在 TradingView 中构建的策略,你很可能已经感受到了这种摩擦。你不只是在编写止损——你需要在不让屏幕杂乱的情况下监控它们。你需要知道未平仓头寸当前的盈亏,而不必在平台之间来回点击。如果你运行多个策略,你需要一种方法来管理这一切,而不至于被标签页淹没。

这是一个单靠代码无法解决的工作流问题。你可以写出完美的 Pine Script 出场逻辑,但如果你仍然每五分钟就卡在检查 MT5 终端看止损是否被触发,那就有问题了。

管理逻辑与执行之间的差距

这就是连接 TradingView 和 MetaTrader 的工具开始变得重要的地方。但更重要的是,交易体验中有一个更简单的层面经常被忽视:你实际上如何观察市场。

想象一下,你已经在 Pine Script 中编写了止损和止盈。你已经回测过,你对逻辑有信心。现在你正在实盘运行它。你仍然想关注你的头寸——当前盈亏、移动止损是否在收紧、你的权益曲线如何实时变化。但你不想让整个 MT5 终端一直开着,占用屏幕空间,与图表和新闻推送争夺你的注意力。而且当你共享桌面或离开办公桌时,你绝对不希望它显示在屏幕上。

这正是 Camovia Tray 解决的用例。它把你的 MT5 或 MT4 变成一个托盘工具——你只需将鼠标悬停在系统托盘图标上就能查看实时报价,并在一个紧凑的浮动窗口中查看所有未平仓头寸。从同一个界面,你可以看到当前未平仓交易、它们的入场价格、当前盈亏,并通过几次点击平掉任何头寸。重点是,你的交易数据留在你的机器上,而不是飘在云端或暴露在你宁愿保持私密的屏幕上。

所以,当你的 Pine Script 处理何时出场的自动化逻辑时,Camovia Tray 处理人的层面:确保你实际上能够看到和管理正在发生的事情,而不打断你的流程或你的隐私。

把所有内容串起来

在 Pine Script 中编写止损和止盈是一项基本技能。合并式出场管理器模式让你拥有完全控制权,处理移动止损等动态调整,并遵守必须在单次 strategy.exit() 调用中指定两个水平的规则。避免多个出场订单把你的仓位切成碎片的陷阱。

但记住:Pine Script 是理论。执行是实践。一旦你的策略上线,你需要一种理智的方式来监控它。如果你曾经发现自己要在 TradingView 和 MetaTrader 之间来回切换,在拥挤的终端中眯着眼看头寸详情,你可能会发现真正的生产力提升不在于编写更好的代码——而在于更好地管理工作空间。

毕竟,如果无法清晰地看到你的头寸并在关键时刻采取行动,世界上最好的止损逻辑也帮不了你。

MT4/MT5 托盘极速助手

无感盯盘,秒级平仓——悬停看行情,托盘内一键平仓。

下载 Camovia Tray

常见问题

能监控哪些信息?

行情与未平仓持仓:品种、方向、开仓时间、当前盈亏等,悬浮窗订单页一目了然,点击订单即可平仓。

支持哪些语言?

中英双语,网站与客户端均可切换。

如何下载?

从 Microsoft Store 下载安装。官网下载页有入口。

如何反馈问题或联系你们?

发送邮件至 [email protected]

热门品种交易时段速查

开盘收盘时间、周末休市与实时开闭市状态: