保持敬畏之心
交易是一场持久战

Pine Script(232):strategy.position_size持仓数量详解

#Pine Script入门教学

获取策略的持仓数量:strategy.position_size详解

当一个策略在图表上运行时,它会处理价格K线并生成交易,这些订单会建立或平掉仓位。那么,我们的代码该如何获取策略的持仓数量呢?让我们一探究竟。

获取策略的持仓数量(及方向)

在PineScript中,我们可以通过内置变量 strategy.position_size 来访问策略的当前市场持仓数量。这个变量会返回三种类型的值:当策略持有多仓时,返回一个正数,代表多头仓位的数量;当策略持有空仓时,返回一个负数,代表空头仓位的数量;当策略空仓时,返回0。

如果只想获取持仓数量的绝对值而不关心方向,可以将该变量与 math.abs() 函数结合使用:math.abs(strategy.position_size) 总会返回一个正数或零。

使用 strategy.position_size 主要有两种方式:一是获取其当前值并用于策略决策;二是在当前K线上将其与前一根K线的值进行比较,从而判断仓位发生了何种变化。下面我们来分别探讨这两种用法。

使用策略当前的持仓数量

当我们的代码引用 strategy.position_size 时,我们得到的是在当前脚本计算那一刻策略的持仓数量。我们可以通过多种方式利用这个信息。

一个最直接的用法就是查看策略当前的仓位有多大。我们可以这样做:

// 获取策略当前的持仓数量(绝对值)
posSize = math.abs(strategy.position_size)

我们创建的 posSize 变量会持有一个数值,代表策略的持仓数量:当策略空仓时为0,当持有多仓或空仓时为一个正数。通过 math.abs() 函数,即使策略持有空仓,我们得到的也是一个正数,这可以避免负值干扰后续的计算。

除了持仓数量,strategy.position_size 的正负号也告诉了我们策略的持仓方向。通过与零进行比较,我们就能知道策略是持有多仓还是空仓:

// 判断策略是持有多仓还是空仓
isLong  = strategy.position_size > 0
isShort = strategy.position_size < 0

这里,我们首先判断策略是否持有多仓。只要 strategy.position_size 的值大于0,isLong 变量就为 true。同样,只要它的值小于0,isShort 变量就为 true。一旦我们知道了策略的持仓方向,我们就可以执行相应的逻辑,例如只在持有多仓时提交止损单,或者只在持有空仓时绘制止盈目标位。

类似地,要判断策略当前是否空仓,我们只需检查 strategy.position_size 是否等于零:

// 检查策略当前是否空仓
isFlat = strategy.position_size == 0

当策略没有任何持仓时,isFlat 变量为 true,否则为 false

我们当然也可以直接使用 strategy.position_size 的数值。下面这个例子展示了如何将策略的当前持仓与一个预设的最大仓位进行比较,以控制加仓行为:

// 创建一个输入选项来配置最大持仓量
maxPos = input.int(100, title="最大持仓量")

// 查看我们还可以交易多少数量
posToTrade = maxPos - math.abs(strategy.position_size)

// 如果尚未达到最大持仓,则在满足条件时加仓
if posToTrade > 0 and close > close[1]
    strategy.entry("EL", strategy.long, qty=posToTrade)

这段代码首先创建了一个名为”最大持仓量”的整数输入框,默认值为100。然后,我们计算出距离最大仓位还允许交易的数量 posToTrade。最后,一个 if 语句判断是否还有加仓空间(posToTrade > 0),并在满足交易条件时,以剩余可交易的数量(qty=posToTrade)进行加仓。通过这种方式,我们就能确保策略的总仓位不会超过我们设定的上限。

顺带一提,我们也可以使用 strategy.risk.max_position_size() 函数来限制策略的最大持仓量。使用这个内置的风险管理规则,所需的代码量会更少。

使用策略之前的持仓数量

了解策略当前的持仓数量很有用,但有时我们还需要知道这个仓位与近期历史相比发生了什么变化。例如,策略是不是刚刚才开了一个新仓?

要回答这类问题,我们需要获取 strategy.position_size 变量在前一根K线上的值。这可以通过历史引用操作符([])来实现。

要注意的是,我们通过 [] 获取的任何历史值,返回的都是该变量在那根K线收盘时的值。所以,strategy.position_size[1] 代表的是在上一根K线收盘时策略的持仓状态,我们无法通过这种方式窥探K线内部的仓位变化。

通过比较当前和之前的 strategy.position_size 值,我们可以判断策略是否刚刚开了一个新仓。代码如下:

// 判断策略是否刚刚开了一个新仓
longShortNow = strategy.position_size[1] == 0 and 
     strategy.position_size != 0

这里,我们判断策略在上一根K线收盘时是否为空仓(strategy.position_size[1] == 0),并且当前是否持有仓位(strategy.position_size != 0)。如果这两个条件都满足,那么 longShortNow 变量就为 true,表示刚刚开了一个新仓。

我们也可以直接使用 strategy.position_size 的数值来计算仓位的变化。例如,我们可以计算当前仓位与上一根K线相比增加了多少:

// 计算持仓数量的变化量
posChange = strategy.position_size - strategy.position_size[1]

这个 posChange 变量记录了当前持仓与上一根K线收盘时持仓的差值。当策略做多或加仓多头时,这个值为正数;当做空或加仓空头时,为负数;当仓位没有变化时,为0。通过这种方式,我们可以编写出依赖于仓位如何变化,而不仅仅是当前仓位是什么的策略逻辑。

变量的特性

关于 strategy.position_size 变量,有几点需要注意。它的值在每次脚本计算时更新:在实时行情中,如果开启了”在每个Tick上重新计算”,那么每次价格跳动都会更新;在历史回测中,则通常是在每根K线收盘时更新一次(如果开启”订单成交后重新计算”,则会增加额外的计算)。

这个变量返回的是总持仓数量,其单位与图表交易品种的单位一致(如合约数、股数、手数等)。它的历史值(如 strategy.position_size[1])代表的是策略在该K线收盘时的持仓状态。另外,我们不能在指标(Indicator)脚本中使用 strategy.position_size,否则会报错。

简单总结一下:strategy.position_size 变量返回策略的市场持仓数量。当策略持有多仓时,该变量返回一个正数;当持有空仓时,返回一个负数;当空仓时,返回零。它可以告诉我们两件事:第一,策略当前是持有多仓(> 0)、持有空仓(< 0)还是空仓(== 0);第二,它告诉我们策略的持仓数量,为了总是以正数的形式获取这个数量,我们可以使用 math.abs(strategy.position_size)

赞(0)
未经允许不得转载:图道交易 » Pine Script(232):strategy.position_size持仓数量详解
分享到

评论 抢沙发

登录

找回密码

注册