首页 > 解决方案 > 如何计算自“strategy.entry”以来的柱数

问题描述

我刚开始用 PineScript 编写代码,经过几次尝试,我想寻求帮助。

我试图计算从最后一个多头头寸入场时发生了多少条柱线。这个问题(或类似的问题)已经被问过好几次了,但我发现 barsince() 并没有解决问题。简单地说,它根本不起作用。

我想测试的策略如下:如果价格从之前的高点下跌 2.5%,我想关闭多头头寸。前一个高点不在一个固定长度的窗口中进行评估(例如,在最后 10 根柱线左右),但需要从完成多头进场的柱线开始评估。

我试图关闭一个多头头寸(以它的 id "buy" 开仓),如下所示:

npastdays=barssince(strategy.position_size > 0)
    
prevHigh=highest(close, npastdays)
if (close < 0.975*prevHigh)
    strategy.close("buy")

我什至尝试了其他方法,例如在开多头头寸时将“op”变量设置为非零值,而不是使用“change(op > 0)”或类似的“crossover(op, value)”。“npastdays”变量不计算,无论哪种方式,它都保持未定义(nd)。

编辑#1:当多头头寸打开时,我再次尝试设置 op:=6.5(任何数字都可以,或布尔值),然后:

npastdays=barssince(op==6.5)
if (npastdays!=0)   // else, I just opened a long position
    prevHigh=highest(close, npastdays)
    if (close < 0.975*prevHigh)
        strategy.close("buy")

我得到了一个不同的错误,“Pine 无法确定系列的参考长度。尝试在研究或策略函数中使用 max_bars_back。”。仍然没有解决。

编辑#2:我尝试在完成长条目时使用内置的“bar_index”和指令“posLong := bar_index”,但没有成功。但是,该代码仅适用于固定数量的柱:即使我尝试捕获负的 nPastDays 值(它的第一个值似乎是 -1096 但 posLong 应该 > posLong[1]...)

// Determine trail stop loss prices
float longStopPrice = 0.0
int nPastDays = 4
float prevHigh = 0.0
longStopPrice := if (strategy.position_size > 0)
    nPastDays := posLong - posLong[1]
    if nPastDays > 0
        prevHigh := highest(close, nPastDays)
    else
        prevHigh := highest(close, 4)
    
    prevHigh * 0.975
    
//    stopValue = close * (1 - longTrailPerc)
//    max(stopValue, longStopPrice[1])
else
    0

// Submit exit orders for trail stop loss price
if (strategy.position_size > 0)
    strategy.exit(id="buy", stop=longStopPrice)

解释器给出关于负 nPastDays 值的错误,或者在建议使用 max_bars_back 时给出错误。但是我已经在策略声明中设置了“max_bars_back=50”。仍然没有解决。

标签: pine-script

解决方案


barsince有一个你想要的快捷方式。

ta.barssince(strategy.position_size == 0)

推荐阅读