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

Pine Script(229):未平仓订单的最大浮盈max_runup

#Pine Script入门教学

获取未平仓订单的最大浮动盈利

当一个策略持有仓位时,我们可以使用 strategy.opentrades.max_runup() 函数来获取某一个特定开仓订单的最大浮动盈利。这个最大浮动盈利指的是该笔订单自开仓以来,到当前K线为止,所经历过的历史最高利润。

我们可以通过多种方式来利用这个值,例如:计算所有开仓订单的平均最大潜在利润;如果每笔订单都在其最大浮动盈利点平仓,计算整个仓位的最大可能利润;通过比较一笔订单的最大浮动盈利和最大回撤,来评估其风险回报比;评估策略平仓信号的效率——一个好的平仓信号应该出现在接近订单最大潜在利润的位置。

默认语法结构

该函数的标准语法如下:

strategy.opentrades.max_runup(trade_num)

trade_num 是开仓订单的编号。这个整数用于告知PineScript我们想要获取哪一笔开仓订单的最大浮动盈利。这个订单编号采用从零开始的索引方式:第一笔开仓订单的编号是0,第二笔是1,第三笔是2,以此类推。我们可以通过 strategy.opentrades - 1 这个表达式来获取最后一笔(即最新一笔)订单的编号。

这个函数的返回值有两种可能:一是返回一个正的浮点数,代表指定开仓订单的最大浮动盈利;二是返回 na 值,这在传入的订单编号 trade_num 不正确(例如小于0,或大于等于当前开仓订单的总数 strategy.opentrades),或者策略当前没有任何持仓时会发生。

快速示例

要获取第一笔开仓订单(即最早的那一笔)的最大浮动盈利,我们可以这样做:

// 获取仓位中第一笔入场的最大浮动盈利
firstEntryRunUp = strategy.opentrades.max_runup(0)

要获取最后一笔开仓订单(即最新的一笔)的最大浮动盈利,可以这样使用:

// 检索最新一笔开仓订单的浮动盈利
lastEntryRunUp = strategy.opentrades.max_runup(strategy.opentrades - 1)

另一个应用场景是遍历所有开仓交易。例如,假设我们想找出所有开仓订单中最大和最小的最大浮动盈利值。我们可以创建一个 for 循环,遍历所有订单,然后在循环内部使用 math.max()math.min() 函数来持续追踪这两个极值。代码示例如下:

// 从当前持仓中获取最高和最低的最大浮动盈利
maxRunUp = 0.0
minRunUp = 1e10 // 设一个极大的初始值
for tradeNumber = 0 to strategy.opentrades - 1
    maxRunUp := math.max(maxRunUp, strategy.opentrades.max_runup(tradeNumber))
    minRunUp := math.min(minRunUp, strategy.opentrades.max_runup(tradeNumber))

// 在图表上绘制这两个值
plot(maxRunUp, title="最高浮盈")
plot(minRunUp, title="最低浮盈")

函数的特性

strategy.opentrades.max_runup() 返回的值是扣除手续费后的净浮盈。因此,开仓时支付的手续费越多,这个值就越低。

此函数返回的是订单当前最大浮动盈利的一个快照。由于订单尚未平仓,这个最大利润值在未来仍有可能继续增加(但它不可能减少,因为它记录的是已经达到的最大值)。如果一笔订单自开仓以来一直处于亏损状态,它仍然会有一个最大浮动盈利值,只不过这个值会是一个负数。

还有一点容易误解:此函数测量的浮动盈利是从入场价格到后续的最优价格(对多头是最高价,对空头是最低价),而不是从交易过程中的最低点到最高点的波幅。

这个函数是自PineScript版本5起才可用的新功能,在版本4及更早的版本中不存在,且只能在策略(strategy)脚本中使用,不能在指标(indicator)中使用。

示例策略

让我们通过一个完整的策略来看看如何使用 strategy.opentrades.max_runup() 函数。下方的脚本基于相对强弱指数(RSI)进行交易。当RSI下穿30时做多,上穿70时做空。

我们使用 strategy.opentrades.max_runup() 在每个K线上计算整个仓位的总最大浮动盈利。然后,我们将这个值与上一根K线的值进行比较。如果它增加了,说明仓位创下了新的最大浮盈记录,我们便用一个绿色的图表背景来高亮显示这种情况。

策略的完整代码如下:

//@version=5
strategy(title="开仓交易的最大浮动盈利", pyramiding=5)

// 计算RSI
rsiValue = ta.rsi(close, 7)
// 绘制RSI及超买超卖线
plot(rsiValue, color=color.fuchsia, title="RSI")
hline(30, title="超卖线")
hline(70, title="超买线")

// 当RSI进入超买或超卖区时生成交易
if ta.crossunder(rsiValue, 30)
    strategy.entry("Enter Long", strategy.long)
if ta.crossover(rsiValue, 70)
    strategy.entry("Enter Short", strategy.short)

// 获取当前仓位的总最大浮动盈利
positionMaxRunUp = 0.0
for tradeNumber = 0 to strategy.opentrades - 1
    positionMaxRunUp += strategy.opentrades.max_runup(tradeNumber)

// 当仓位创下新的最大浮盈时,将图表背景设为绿色
newMaxRunUp = strategy.openprofit > 0 and 
     positionMaxRunUp > positionMaxRunUp[1]
bgcolor(newMaxRunUp ? color.new(color.green, 70) : na)

我们首先配置策略,然后计算并绘制了7周期的RSI及其超买超卖线。入场逻辑是当RSI进入超买超卖区时开仓。

接着,我们计算当前持仓的总最大浮动盈利:

// 获取当前仓位的总最大浮动盈利
positionMaxRunUp = 0.0
for tradeNumber = 0 to strategy.opentrades - 1
    positionMaxRunUp += strategy.opentrades.max_runup(tradeNumber)

这段代码初始化了一个 positionMaxRunUp 变量,然后通过 for 循环遍历所有开仓订单,将每一笔订单的最大浮动盈利累加起来,从而得到整个仓位的总最大浮动盈利。

最后,我们判断仓位的最大浮盈是否创下了新高:

// 当仓位创下新的最大浮盈时,将图表背景设为绿色
newMaxRunUp = strategy.openprofit > 0 and 
     positionMaxRunUp > positionMaxRunUp[1]
bgcolor(newMaxRunUp ? color.new(color.green, 70) : na)

我们创建一个布尔变量 newMaxRunUp。它的值为真的条件有两个:第一,当前仓位是盈利的(strategy.openprofit > 0);第二,当前K线的总最大浮动盈利大于上一根K线的值。当条件满足时,我们就通过 bgcolor() 函数将图表背景设为半透明的绿色。

在图表上,每当持仓创下新的最大浮动盈利记录时,策略就会将背景涂成绿色。对于多头仓位,这通常发生在价格创出新高时;对于空头仓位,则发生在价格创出新低时:

简单总结一下:strategy.opentrades.max_runup() 函数返回某一个特定开仓订单的最大浮动盈利,即该订单自开仓以来所经历过的历史最高利润。我们通过一个订单编号来告知函数我们想要查询哪一笔订单,第一个订单的编号是0,最后一笔(最新一笔)订单的编号是 strategy.opentrades - 1。订单的最大浮动盈利值是扣除了手续费成本之后的净值。

理解订单的最大浮盈

PineScript中有两个函数可以返回一个订单的最大浮盈(Maximum Run-up)值:strategy.opentrades.max_runup() 返回一个当前持仓订单到目前为止的最大浮盈;strategy.closedtrades.max_runup() 返回一个已平仓订单在其整个生命周期中的最大浮盈。

这很好,但这个最大浮盈值到底是什么意思呢?

最大浮盈指的是一个订单在其持有期间所能达到的历史最高利润。它告诉我们这笔交易最理想的盈利能有多少。如果我们能够在该订单最有利的价格点平仓,那么订单的最终利润就等于其最大浮盈值。

这个指标之所以有用,有以下几个原因:如果我们知道了订单可能达到的最佳利润,就可以将其与实际利润进行比较,从而评估我们平仓信号的效率。此外,如果我们将最大浮盈与最大回撤进行比较,就能大致了解这笔交易的潜在回报与风险。

如何衡量最大浮盈

要计算一个订单的最大浮盈,我们需要用其入场价与最佳价格之间的价差,乘以订单的大小,然后再减去佣金成本。

这里的最佳价格,对于多头订单来说,是指订单持有期间的最高价;对于空头订单来说,则是指订单持有期间的最低价。

图表示例

让我们通过图表来进一步说明。从公式中可以看出,一个多头订单的最大浮盈是(最高价 – 入场价)× 订单大小 – 佣金。在图表上它看起来是这样的:

这个多头订单在1753.51进入市场。在订单持有期间,股价达到了1964.40的最高点。这带来了每股210.89美元的最大潜在利润。因为该订单买入了5股,所以其最大浮盈是1054.45美元(5 x 210.89)。

现在我们再来看看空头的情况。空头订单的最大浮盈是(入场价 – 最低价)× 订单大小 – 佣金。在图表上它看起来是这样的:

这个空头订单在619.66开仓。在订单持有期间,价格下跌至474.00。这创造了每股145.66美元的最大利润。由于该订单卖出了5股,其最大浮盈是728.30美元(5 x 145.66)。

(为了让解释更简洁,以上两个例子都没有计算佣金成本。如果计算了佣金,最大浮盈值会相应减少。)

最大浮盈的特性

理想情况下,我们希望在接近最大浮盈的点位平仓,以实现利润最大化。一个较高的最大浮盈可能意味着更好的交易机会,但这需要结合其最大回撤来综合评估。如果一个订单在平仓前,从其最大浮盈点回吐了大量利润,这通常意味着平仓信号有待改进。

要注意的是,最大浮盈衡量的是从入场价到最佳价格的距离。它不是衡量浮动盈亏的最大变化范围(即从最低谷到最高峰的距离),通常后者的范围会比基于入场价计算的最大浮盈要大。另外,一个订单的最终盈亏总是小于或等于其最大浮盈值。

strategy.opentrades.max_runup()strategy.closedtrades.max_runup() 这两个函数的计算方式完全相同。它们唯一的区别在于:前者返回的是持仓订单到目前为止的最大浮盈,而后者报告的是已平仓订单在其整个生命周期中的最终最大浮盈。

除了单个订单的最大浮盈,我们也可以计算一个总仓位的最大浮盈,只需将构成该仓位的每个订单的最大浮盈相加即可。

最大有利偏移(Maximum Favourable Excursion)

PineScript中所说的订单最大浮盈,在交易文献中也被称为最大有利偏移(Maximum Favourable Excursion,MFE)。

最大有利偏移被定义为入场价与交易期间最有利(即最佳)价格之间的差值。也就是说:对于多头交易,MFE是入场价与交易期间最高价之间的差值;对于空头交易,MFE是入场价与交易期间最低价之间的距离。

与订单的最大浮盈值一样,MFE衡量的也是一笔交易在其生命周期中向有利方向发展的最大幅度。

简单总结一下:一个订单的最大浮盈值是其可能实现的最佳利润。它的计算方式是用最佳价格(多头为最高价,空头为最低价)与入场价的价差,乘以订单大小,再减去佣金成本。最大浮盈越高,说明价格向有利方向的波动越大,订单的潜在盈利空间也越大。订单的最大浮盈也被称为最大有利偏移(MFE)。

赞(0)
未经允许不得转载:图道交易 » Pine Script(229):未平仓订单的最大浮盈max_runup
分享到

评论 抢沙发

登录

找回密码

注册