Little Bird Trading

Pine Script 指标与策略:区别及各自适用场景

6分钟阅读 · 更新于

在TradingView上,指标和策略在 Pine 编辑器里看起来几乎一样。指标在你的图表上绘图。策略模拟交易,并报告它们本来会赚多少。把两者混为一谈,是一个在历史上看起来很棒的脚本在实盘中令人失望的最常见原因。本指南介绍会改变你结果的区别,以及第三种脚本类型,即库。

指标、策略和库:各自的用途

  • 指标(indicator()):计算并绘图。用于价位、用plotshape()绘制的信号、仪表盘、市场偏向,以及用alertcondition()构建的提醒。
  • 策略(strategy()):指标能绘制的一切,加上通过strategy.entry、strategy.exit和strategy.close进行的模拟订单。TradingView运行这些订单,并用交易统计数据填充 Strategy Tester。
  • 库(library()):一组你发布、然后导入到其他脚本中的可复用函数。库永远不会被单独添加到图表上。

一个脚本只声明这三者之一,所以一个脚本不能既是指标又是策略。一种常见的搭配是:用一个库存放共享逻辑,用一个指标负责图表和提醒,用一个策略负责测试。

一行说清区别

Pine 脚本的第一行就声明了它是哪一种。以indicator()开头的脚本只能计算和绘图:线条、颜色、标签、填充。它没有持仓、成交价或利润的概念。以strategy()开头的脚本增加了一个订单模拟引擎:它可以调用strategy.entry和strategy.exit之类的函数,TradingView会对历史K线运行这些订单,生成Strategy Tester报告:净利润、最大回撤、胜率、盈利因子,以及模拟交易的清单。

所以区别在于:指标描述条件;策略断言这些条件本来会赚多少。第二种说法比第一种重得多,因为一旦你模拟订单,就继承了一整套关于这些订单何时以及按什么价格成交的假设。

回测引擎在哪里悄悄作出假设

策略的资金曲线,只和它底下的成交假设一样可信。四个默认设置造成了大部分损害:

  • 按K线收盘评估。默认情况下,测试器在K线收盘时评估你的逻辑。如果某个条件引用了该K线自己的最高价、最低价或收盘价,历史“成交”可能用了实盘交易在K线完成之前不可能拥有的信息。
  • 下一根K线开盘价成交。在模拟中,基于信号下的市价单按下一根K线的开盘价成交。在快速开盘时,这个印出的价格可能与你实际成交的位置相差好几个最小变动价位或点数。
  • 零摩擦。如果在strategy()调用中commission和slippage保持为零,每笔模拟交易都是免费的,而每笔真实交易都要付佣金和滑点。
  • 样本量。测试器会乐于报告一条建立在十二笔交易上的漂亮曲线。十二次盈利是披着优势外衣的噪音。

完整示例

假设一个策略在ES期货上,40笔交易显示+US$4200,成本保持为零。加上约US$5的往返佣金(零售期货佣金因经纪商而差异很大,所以请用你自己的),再加上每边一个最小变动价位的滑点。在ES上,一个最小变动价位是0.25点,价值US$12.50,所以单向各一个最小变动价位是US$25。每笔交易大约有US$30的摩擦成本,40笔交易合计约US$1200,把标题上的 +US$4200拉低到约US$3000。而这还是客气的说法:如果入场集中在波动剧烈的开盘,实际滑点比一个最小变动价位更宽,差距会更大。同样逻辑的指标版本里,这些摩擦一个都不会出现,因为指标从一开始就不声称有任何成交。关于如何区分真正的优势和拟合出来的优势,请看如何识别过拟合的交易系统。

信号:指标中用 plotshape,策略中用订单

指标用plotshape()或plotchar()标记信号,即在条件为真的K线上画一个三角形或标签。什么都不会被买入,所以指标没有交易统计。策略用strategy.entry()把同一个条件变成订单,Strategy Tester 随后报告净利润、胜率、回撤和完整的交易清单。要衡量信号的准确度,就把条件移到策略中,加入现实的成本,然后阅读交易清单。

测试信号:收盘与K线内部

默认情况下,策略每根K线在收盘时计算一次,市价单在下一根K线的开盘价成交。有三个设置会改变这一点:

  • process_orders_on_close = true让订单在信号K线的收盘价成交。
  • calc_on_every_tick = true在每个实时跳动上重新计算。历史数据只有已完成的K线,所以实盘和历史结果可能不同。
  • use_bar_magnifier = true在止损和目标都位于同一根K线内时,使用更低时间周期的数据来判断该K线中哪个价格先出现。

在K线收盘时确认的信号,使回测和实盘结果最为接近。

K线内部的信号仍有其位置。一个必须在价格穿过某个价位的瞬间行动的突破策略,可以在实盘中使用calc_on_every_tick,前提是你先在模拟账户上对实盘版本做前瞻测试,因为回测无法显示信号在K线内部的表现。对于指标,提醒也适用同样的区分:“每根K线收盘时一次”等待已确认的K线,“每根K线一次”则在条件在K线内部第一次变为真时触发,即使该K线之后收在相反方向。Pine Script 常见问题对提醒设置有更详细的介绍。

哪种脚本类型能在 Pine Screener 中使用?

Pine Screener 运行的是指标。要筛选某个策略的设置,把条件放进一个指标中,并绘制你想用来过滤的数值。

重绘究竟是什么意思

“重绘”被用来指责任何事后显示的值与实时不同的脚本,但这个标签常常被误用。诚实的检验只是一个问题:同样的决定,能否在同一时刻、用同样的信息、在实盘中做出?只有在K线收盘时才确认的信号,只是要求你等到收盘。真正有误导性的情况,是在仍在形成的K线上绘制、K线结束后又跳动的信号,或者带着前瞻拉取的更高时间周期数据。在已确认的K线上评估逻辑,能让你的回测和你的实盘体验彼此诚实,无论你构建的是指标还是策略。

这如何对应交易计划

交易计划有意绕开了重绘问题,把固定的、预先规划好的价位交到你手里。每日价位,即ES、SPY、NQ和QQQ的价位,是在前一次收盘后计算出来的,在交易时段内不会移动。没有什么可重绘的:每个价位在美东时间9:30之前设定,并保持不动。绘制这些线的MyLinedChart,其工作方式类似指标。它绘制价位,不模拟任何东西,所以不带有上述任何成交或佣金的假设。如果某个已发布价位与你自己的策略所告诉你的不一致,这种不一致就是信息,答案往往是等待。

用你自己的价位构建策略

大多数策略围绕交易者已经手工画出的价格进行交易:支撑、阻力、枢轴。MyLinedChart把你图表上的每条线、价位、备注和指标导出为JSON、CSV或XLSX。把这个文件交给 ChatGPT、Claude 或你自己的代码,请它写一个按这些精确价格交易的 Pine Script 策略。策略如何入场和出场,由你和你的 AI 决定。

相信任何一种脚本类型之前的简短检查清单

  • 弄清你手上的是哪一种:indicator()只绘图;strategy()模拟订单并生成 Strategy Tester 报告。
  • 对于策略,在读任何一个利润数字之前,先为你实际交易的品种设置现实的commission和slippage。
  • 在已收盘的K线上确认逻辑,让历史和实盘共享同一个决策时刻。
  • 用足够多的交易笔数来评判结果。
  • 把背景叠加层(如已发布的价位)与执行决定权分开,图表提供信息;做决定的是你写下的规则。

这样使用,指标是一面透镜,策略是一个假设。在相信它们之前,两者都要用真实成交来测试。

相关阅读

来源

仅供教育参考,不构成投资建议。

仅供教育参考,不构成投资建议。