Pine Script® 策略是一种专门用于模拟交易的脚本,能够在历史和实时数据条上进行回测和前瞻测试。策略脚本不仅具备指标脚本的多种功能,还能模拟挂单、改单和撤单操作,并生成详细的策略表现分析报告。
策略脚本基础入门
在 Pine Script 中,当脚本使用 strategy() 函数作为声明语句时,即可调用 strategy.* 命名空间下的各类函数和变量,用于模拟交易订单并获取关键策略信息。所有相关数据和模拟结果都会显示在专门的“策略测试器”标签页中。
简单策略示例
以下是一个基础的双均线交叉策略示例。当快速移动平均线上穿慢速移动平均线时,策略会下达“买入”市价单建立多头头寸;当快速移动平均线下穿慢速移动平均线时,则下达“卖出”市价单建立空头头寸:
//@version=6
strategy("简单策略演示", overlay = true, margin_long = 100, margin_short = 100)
// 设置基础长度参数
int lengthInput = input.int(14, "基础长度", 2)
// 计算两条不同周期的移动平均线
float fastMA = ta.sma(close, lengthInput)
float slowMA = ta.sma(close, lengthInput * 2)
// 当快速均线上穿慢速均线时建立多头头寸
if ta.crossover(fastMA, slowMA)
strategy.entry("buy", strategy.long)
// 当快速均线下穿慢速均线时建立空头头寸
if ta.crossunder(fastMA, slowMA)
strategy.entry("sell", strategy.short)
// 绘制移动平均线
plot(fastMA, "快速均线", color.aqua)
plot(slowMA, "慢速均线", color.orange)代码解析:
strategy()函数声明将脚本定义为名为“简单策略演示”的策略,并在主图表区域显示可视化效果margin_long和margin_short参数设定策略需要100%的保证金才能进行多空交易strategy.entry()函数用于创建入场订单并反转持仓方向
策略应用与测试流程
要将策略应用于图表进行测试,用户可以从“指标、指标与策略”菜单中选择内置或已发布的策略,也可以在 Pine 编辑器中编写自定义策略,然后点击右上角的“添加到图表”选项。
策略脚本会在主图表区域显示交易标记,并在“策略测试器”标签页中展示模拟性能结果。
策略测试器深度解析
策略测试器可视化展示策略脚本的假设性能并显示其属性。要使用测试器,只需将使用 strategy() 函数声明的脚本添加到图表,然后打开“策略测试器”标签页。如果图表上有多个策略,可以在左上角选择要分析的特定策略。
选定脚本在图表数据上执行后,策略测试器会在以下四个标签页中填充相关信息:
概览标签页
概览标签页提供策略在一系列模拟交易中的快速性能概览。该标签页显示关键性能指标和包含三个有用图表的图表:
- 权益曲线:可视化显示已平仓交易的模拟权益变化
- 回撤柱状图:显示策略权益从峰值下跌的幅度
- 买入持有权益曲线:展示在整个测试范围内单一多头头寸的权益增长
图表使用两个独立的垂直刻度:权益曲线和买入持有权益曲线使用左侧刻度,回撤图使用右侧刻度。用户可以通过底部的选项切换图表显示,并选择绝对值或百分比刻度。
性能摘要标签页
性能摘要标签页以分列形式深入展示策略的关键性能指标。“全部”列显示所有模拟交易的整体表现,“多头”和“空头”列分别显示对应方向的交易指标。这种视图提供了对策略整体和方向性交易表现的更详细洞察。
交易列表标签页
交易列表标签页按时间顺序列出策略的所有模拟交易。每个列表项显示交易的关键信息,包括入场和出场订单的日期时间、订单名称、订单价格以及合约/股份/手数/单位数量。此外,每个项目还显示交易的盈亏情况以及策略的累计利润、运行上涨和回撤数据。
列表默认按降序排列,最新交易显示在顶部。用户可以通过点击列表上方的“交易编号”按钮反转排序顺序。
属性标签页
属性标签页提供策略配置和执行数据集的详细信息,分为四个可折叠部分:
- 日期范围:显示有模拟交易的日期范围和整体可用的回测范围
- 品种信息:显示图表的品种、时间框架、类型、点值、货币和最小变动价位
- 策略输入:列出策略“设置/输入”标签页中所有可用输入的名称和值
- 策略属性:提供策略属性的概览,包括初始资金、账户货币、订单大小、保证金、加仓、佣金、滑点等设置
经纪商模拟器机制
TradingView 使用经纪商模拟器在运行策略脚本时模拟交易。与现实世界交易不同,模拟器默认仅使用可用图表数据来填充策略订单。因此,它在历史数据条收盘后执行订单。同样,它最早可以在新价格跳动后填充实时数据条上的订单。
由于经纪商模拟器默认只使用图表价格数据,它在填充订单时会对条内价格变动做出假设。模拟器分析图表条的开盘价、最高价、最低价和收盘价,使用以下逻辑推断条内活动:
- 如果条的开盘价更接近最高价而非最低价,模拟器假设市场价格按此顺序移动:开盘 → 最高 → 最低 → 收盘
- 如果条的开盘价更接近最低价而非最高价,模拟器假设市场价格按此顺序移动:开盘 → 最低 → 最高 → 收盘
- 模拟器假设每个图表条内的条间不存在缺口,这意味着它认为条的高低范围内的任何值都是订单执行的有效价格
- 当填充基于价格的订单时(除市价单外的所有订单),模拟器假设前一条收盘价与当前条开盘价之间的缺口内不存在条间
条放大镜功能
Premium 及以上等级计划的用户可以通过启用条放大镜回测模式来覆盖经纪商模拟器对条内价格的默认假设。在此模式下,模拟器使用更低时间框架的数据来获取条内价格行为的更精细信息,从而实现更精确的订单填充模拟。
要启用条放大镜模式,请在 strategy() 声明语句中包含 use_bar_magnifier = true,或在策略的“设置/属性”标签页的“填充订单”部分选择“使用条放大镜”选项。
订单类型全解析
Pine Script 策略可以模拟不同类型的订单以适应特定的交易系统需求。主要订单类型包括市价单、限价单、止损单和止损限价单。
市价单
市价单是最简单的订单类型,大多数订单放置命令默认生成市价单。市价单是指示尽可能快地以当前市场价格买入或卖出标的物的指令。因此,经纪商模拟器总是在下一个可用跳动点上执行市价单。
限价单
限价单是指示以特定价格或更优价格(对多头订单为低于指定价格,对空头订单为高于指定价格)买入或卖出标的物的指令,不受时间限制。要在策略脚本中模拟限价单,请向适用订单放置命令的 limit 参数传递价格值。
当市场价格达到限价单的值或朝有利方向越过该值时,经纪商模拟器以该值或更优价格填充订单。当策略以比当前市场价格更差的值(对多头订单为更高,对空头订单为更低)生成限价单时,模拟器会立即填充订单而不等待市场价格达到该值。
止损单和止损限价单
止损单是指示当市场价格达到特定价格或更差的值(对多头订单为高于指定价格,对空头订单为低于指定价格)时激活新的市价单或限价单的指令。
当策略以比当前市场价格更好的值生成止损单时,它会立即激活后续订单而不等待市场价格达到该值。
当 strategy.entry() 或 strategy.order() 调用同时包含 stop 和 limit 参数时,它会创建止损限价单。与基础止损单不同,止损限价单在当前价格处于止损水平或更差值时不会触发市价单,而是创建后续的限价单以在指定的限价水平填充。
订单管理与取消机制
strategy.* 命名空间包含以下五个模拟订单放置的函数(称为订单放置命令):
strategy.entry()strategy.order()strategy.exit()strategy.close()strategy.close_all()
此外,命名空间还包括以下两个取消挂单的函数(称为订单取消命令):
strategy.cancel()strategy.cancel_all()
仓位规模管理
Pine Script 策略提供两种控制订单大小的方法:
- 设置订单的默认固定数量类型和值。程序员可以通过在
strategy()声明语句中包含default_qty_type和default_qty_value参数来指定这些属性的默认值 - 在
strategy.entry()或strategy.order()调用中包含非 na 的qty参数。当对这两个命令的调用指定了非 na 的qty值时,该调用将忽略策略的默认数量类型和值,而是下指定数量的合约/股份/手数/单位订单
平仓机制
默认情况下,策略使用先进先出(FIFO)方法平仓,这意味着任何平仓订单都从第一个未平仓交易开始平仓或减仓,即使平仓命令指定了不同未平仓交易的入场ID。要覆盖此默认行为,请在 strategy() 声明语句中包含 close_entries_rule = "ANY"。
常见问题
策略回测是否准确可靠?
策略回测基于历史数据模拟,结果仅供参考。实际市场条件可能与历史数据存在差异,包括流动性、滑点和市场深度等因素。建议结合多种市场环境进行测试,并理解所有策略都有亏损风险。
如何提高策略性能?
提高策略性能可以从以下几个方面入手:优化参数设置、添加过滤条件、合理设置止损止盈、考虑交易成本和滑点。同时可以使用条放大镜功能获得更精确的回测结果,但需要注意这可能增加计算复杂度。
策略在实际交易中表现为何与回测不同?
实际交易与回测结果差异可能源于多个因素:市场条件变化、流动性差异、实际滑点高于预期、数据质量差异以及心理因素影响。建议先进行模拟交易验证,再逐步投入实盘资金。
Pine Script 策略支持哪些订单类型?
Pine Script 支持市价单、限价单、止损单和止损限价单等主要订单类型。此外还提供追踪止损、部分平仓和多级出场等高级功能,可以满足复杂策略的需求。
如何控制策略的仓位规模?
可以通过两种方式控制仓位规模:一是设置默认的固定数量类型和值,二是在订单命令中直接指定数量大小。策略还支持基于现金、百分比等多种仓位管理方式,方便实现风险控制。
策略执行中的订单优先级是怎样的?
策略订单的执行遵循时间优先级和价格优先级原则。对于限价单和止损单,价格越优的订单越优先执行;对于相同价格的订单,先下的订单优先执行。但实际执行还会受到市场流动性和其他因素影响。