获取未平仓订单的规模
当一个策略持有仓位时,我们可以使用 strategy.opentrades.size() 函数来获取某一个特定开仓订单的规模(即数量)。通过这个函数,策略就能获知其每一笔开仓交易具体有多大。
默认语法结构
该函数的定义如下:
strategy.opentrades.size(trade_num)
trade_num 是一个整数,用于指定你想查询哪一笔开仓订单的数量。这个编号采用从零开始的索引方式:第一笔开仓订单的编号是0,第二笔是1,第三笔是2,以此类推。我们可以通过 strategy.opentrades - 1 来获取最后一笔(即最新一笔)入场订单的编号,也可以利用这个总数来遍历所有开仓订单。
这个函数的返回值有两种可能。一是返回一个浮点数,代表指定开仓订单的规模,这个值的符号代表了订单的方向:当订单是多头时,其规模是一个正数(> 0);当订单是空头时,其规模是一个负数(< 0)。二是返回 na 值,这在传入的订单编号 trade_num 不正确(例如小于0,或大于等于当前开仓订单的总数 strategy.opentrades),或者策略当前没有任何持仓时会发生。
快速示例
例如,如果我们想知道第一笔开仓订单的规模,可以这样做:
// 获取持仓中第一笔入场的规模
initialEntrySize = strategy.opentrades.size(0)
如果我们想要最新一笔入场订单的规模,代码如下:
// 获取当前持仓中最后一笔入场的规模
lastEntrySize = strategy.opentrades.size(strategy.opentrades - 1)
要处理所有开仓订单的规模,我们需要遍历它们。例如,假设我们想计算所有开仓订单的平均规模。我们可以创建一个 for 循环,遍历所有订单,将它们的规模累加起来,最后再除以订单总数。代码示例如下:
// 累加所有开仓交易的订单规模
sizeSum = 0.0
for tradeNumber = 0 to strategy.opentrades - 1
sizeSum += strategy.opentrades.size(tradeNumber)
// 计算平均订单规模
avgOrderSize = math.abs(sizeSum) / strategy.opentrades
顺便一提,虽然这个例子展示了如何在循环中使用 strategy.opentrades.size(),但如果你的目的仅仅是获取平均订单规模,一个更高效的方法是直接用当前总仓位(strategy.position_size)除以开仓订单总数(strategy.opentrades):
// 计算平均订单规模的更高效方法
avgOrderSize = math.abs(strategy.position_size) / strategy.opentrades
函数的特性
strategy.opentrades.size() 返回的是一个特定订单所交易的合约、股票或单位的数量。这个规模不使用经纪商常用的手数(lots);例如,当一个外汇品种的标准手是100,000个单位时,该函数返回的是100000而不是1。做外汇的朋友尤其要注意这一点,否则计算仓位时很容易差好几个数量级。
此函数只返回当前持仓中的订单规模。一旦某个订单被平仓,其规模就无法再通过此函数访问。要查询已平仓的交易数据,你需要使用 strategy.closedtrades.size() 函数。另外,这个函数是自PineScript版本5起才可用的,在版本4及更早的版本中不存在。
示例策略
让我们通过一个完整的策略来看看如何使用开仓订单的规模。下方的脚本交易最高高点和最低低点的突破,策略总是持有多仓或空仓。
我们编写了一个标签,在图表上显示订单信息,包括开仓订单的入场价格及其规模,规模正是通过 strategy.opentrades.size() 函数获取的。
策略的完整代码如下:
//@version=5
strategy(title="开仓订单规模示例", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=50)
// 计算并绘制最高高点和最低低点
highestHigh = ta.highest(high, 20)[1]
lowestLow = ta.lowest(low, 20)[1]
plot(highestHigh, color=color.green, title="最高高点")
plot(lowestLow, color=color.red, title="最低低点")
// 当价格突破新高或新低时生成交易
if close > highestHigh
strategy.entry("Enter Long", strategy.long)
if close < lowestLow
strategy.entry("Enter Short", strategy.short)
// 当持仓规模发生变化时,在图表上显示该笔交易的规模
if strategy.position_size != strategy.position_size[1]
entrySize = strategy.opentrades.size(0)
entryPrice = strategy.opentrades.entry_price(0)
label.new(x=bar_index, y=highestHigh, color=color.black,
textcolor=color.white,
text="入场 " + str.tostring(entrySize) + " 股\n" +
"@ " + str.tostring(entryPrice))
我们首先用 strategy() 函数配置策略,设置其默认订单类型为权益百分比,每次交易50%。接着,代码计算并绘制了20周期的最高高点和最低低点。入场逻辑是在价格突破这两个水平时开仓。
最后一部分代码在图表上显示入场订单信息:
// 当持仓规模发生变化时,在图表上显示该笔交易的规模
if strategy.position_size != strategy.position_size[1]
// ...
这个 if 语句通过判断 strategy.position_size 是否发生了变化来检测是否有新的入场交易成交。
当有新交易发生时,我们用 strategy.opentrades.size(0) 获取第一笔(也是这个策略中唯一一笔)开仓订单的规模,用 strategy.opentrades.entry_price(0) 获取其价格。然后通过 label.new() 函数创建一个黑色背景、白色字体的标签来显示这些信息。
当我们在图表上运行此策略时,它会为每一笔入场交易显示其规模和价格。请注意,空头订单的规模为负数,而多头订单的规模为正数:
正如我们所见,自定义标签显示的规模与TradingView在图表上报告的规模不同。要了解其中缘由,请参阅理解图表订单规模的相关说明。
简单总结一下:strategy.opentrades.size() 函数返回某一个特定开仓订单的规模(数量)。我们通过一个订单编号来告知函数我们想要查询哪一笔订单,这个编号从0开始,代表第一笔入场单,到 strategy.opentrades - 1 结束,代表最后一笔入场单。该函数对多头订单返回一个正数,对空头订单返回一个负数。
获取未平仓订单的浮动盈亏
当一个策略持有仓位时,我们可以通过 strategy.opentrades.profit() 函数来返回某个特定持仓订单的浮动盈亏。通过这种方式,策略可以分别追踪和管理构成整个仓位的每一笔独立订单的当前表现。
利用这个函数返回的单个订单的盈亏值,我们可以实现多种功能,例如:计算所有持仓订单的平均浮动盈利;计算每个持仓订单的收益率;找出所有持仓订单中盈利最多和亏损最严重的那一笔;检查是否存在持仓超过10根K线但仍处于亏损状态的订单;找到并平掉所有当前亏损超过100个货币单位的订单。
标准语法格式
该函数的标准语法格式如下:
strategy.opentrades.profit(trade_num)
trade_num 是持仓订单的编号。这个整数参数告诉PineScript我们想获取哪个持仓订单的当前浮动盈亏。这个编号是一个从零开始的索引:策略开立的第一个订单编号为0,第二个为1,第三个为2,以此类推。我们可以通过 strategy.opentrades - 1 这个表达式来获取最后一个(即最近的)持仓订单的编号。
这个函数的返回值有两种可能:一是一个浮点数值,代表该订单的当前盈亏——如果订单盈利,该值为正数;如果亏损,则为负数。二是一个 na 值,这在提供的订单编号不正确(例如,小于0或大于等于当前持仓订单总数),或者策略当前没有任何持仓订单时会发生。
快速示例
要获取第一个(即最早的)持仓订单的盈亏,我们使用订单编号0:
// 获取持仓中第一笔订单的浮动盈亏
firstEntryProfit = strategy.opentrades.profit(0)
如果我们对最后一个(即最近的)开仓订单的盈亏感兴趣,则可以这样使用:
// 获取持仓中最后一笔订单的浮动盈亏
lastEntryProfit = strategy.opentrades.profit(strategy.opentrades - 1)
另一个常见的应用是遍历所有持仓订单,以进行综合分析。例如,假设我们想计算每个订单的平均盈利。我们可以使用一个 for 循环来遍历所有持仓订单,在循环内部将每个订单的盈亏累加到一个变量中,循环结束后,用这个总盈利除以订单总数,即可得到平均盈利。实现这一逻辑的代码如下:
// 对所有持仓交易的盈利进行求和
profitSum = 0.0
for tradeNumber = 0 to strategy.opentrades - 1
profitSum += strategy.opentrades.profit(tradeNumber)
// 计算每个持仓交易的平均盈利
avgProfit = profitSum / strategy.opentrades
顺便一提,这个例子主要是为了演示如何使用循环配合 strategy.opentrades.profit()。如果我们只是想获取所有持仓订单的总盈利,直接使用 strategy.openprofit 变量会是更简单高效的方法。
函数的特性
此函数返回的盈亏值已包含佣金成本。因此,如果我们为策略设置了佣金,每个订单的浮动盈利都会相应地被扣除交易费用。
strategy.opentrades.profit() 是从PineScript版本5开始才可用的函数,且只能在策略(Strategy)脚本中使用,不能在指标(Indicator)脚本中使用,否则会报错。
示例策略
让我们通过一个完整的策略来看看如何应用持仓订单的盈利。下面的脚本基于超级趋势(SuperTrend)指标进行交易。当趋势线由跌转升时做多,反之则做空。
该策略以两种方式利用了 strategy.opentrades.profit():首先,它会检查最近一笔订单的盈利是否超过某个阈值,如果是,就进行加仓。其次,代码会将每一笔持仓订单的浮动盈亏绘制在图表上,以便直观地观察各个订单的表现。
该策略的完整代码如下:
//@version=5
strategy(title="Open trade profit", pyramiding=3)
// 获取10周期的超级趋势方向(ATR乘数为3.0)
[_, stDirection] = ta.supertrend(3.0, 10)
// 当超级趋势方向反转时,开立多头或空头仓位
if stDirection < 0 and stDirection[1] > 0
strategy.entry("Enter Long", strategy.long)
if stDirection > 0 and stDirection[1] < 0
strategy.entry("Enter Short", strategy.short)
// 当最近一笔订单的盈利超过3时,进行加仓
if strategy.opentrades.profit(strategy.opentrades - 1) > 3
if strategy.position_size > 0
strategy.entry("Enter Long 2", strategy.long)
else
strategy.entry("Enter Short 2", strategy.short)
// 将每个持仓订单的盈利绘制成图表
plot(strategy.opentrades.profit(0), style=plot.style_columns,
color=#EEDC82, title="第一笔订单盈利")
plot(strategy.opentrades.profit(1), style=plot.style_columns,
color=#FF55A3, title="第二笔订单盈利")
plot(strategy.opentrades.profit(2), style=plot.style_columns,
color=#E0B0FF, title="第三笔订单盈利")
// 添加一条0轴水平线以便观察
hline(0, linestyle=hline.style_solid)
我们首先用 strategy() 函数配置脚本的基本属性,允许最多3次金字塔加仓。然后,我们获取超级趋势的方向,并在其发生反转时通过 strategy.entry() 开仓。
接着,我们使用 strategy.opentrades.profit() 来实现盈利加仓的逻辑:
// 当最近一笔订单的盈利超过3时,进行加仓
if strategy.opentrades.profit(strategy.opentrades - 1) > 3
if strategy.position_size > 0
strategy.entry("Enter Long 2", strategy.long)
else
strategy.entry("Enter Short 2", strategy.short)
这个 if 语句获取了最近一笔订单的浮动盈利,如果该盈利超过了3个货币单位,它就会根据当前的持仓方向(多头或空头)开立一笔额外的仓位。
策略的最后一部分代码则将每个持仓订单的盈利绘制在图表上:
// 将每个持仓订单的盈利绘制成图表
plot(strategy.opentrades.profit(0), style=plot.style_columns, ...)
plot(strategy.opentrades.profit(1), style=plot.style_columns, ...)
plot(strategy.opentrades.profit(2), style=plot.style_columns, ...)
这里,plot() 函数创建了三个柱状图,分别显示了第一、二、三笔持仓订单的实时盈亏。如果策略没有持满三笔订单,strategy.opentrades.profit() 会对不存在的订单返回 na,这会自动阻止 plot() 函数进行绘制。
在图表上,持仓订单的盈利图和基于盈利的加仓行为看起来是这样的:
简单总结一下:strategy.opentrades.profit() 函数返回一个特定持仓订单的当前浮动盈亏。一个订单编号(索引)参数告诉函数要返回哪个订单的数据,第一个订单使用0,最后一个(最近的)订单使用 strategy.opentrades - 1。该函数返回的盈亏值已包含策略的佣金成本。




