Tradingview Pine 脚本 bar_index 作为自身的条件

问题描述 投票:0回答:3

我已经搜索了几周,但找不到解决我的问题的方法。所以也许你可以帮忙。 :)

我创建了一个始终显示最近 5 个交易日的指标。因此,在编写脚本时,我想创建一个简单的条件:如果实际柱(日线图上)是实时柱之前的第 5 个柱,则启动指标。然后,该指标汇总每天的百分比变化并创建一行 5 个值。这是想法,但似乎无法知道实际的柱是否是实时柱的第五个。

我尝试使用 timenow 变量并减去以毫秒为单位转换的 5 天,但它无法正常工作,因为周末、交易假期等没有可用的交易数据(也没有蜡烛)。此外,图表的不同时区(即 UTC+2)和证券的时区(即 UTC-4)会变得混乱。在我看来,简单地使用酒吧将是一种优雅的方式,而且更好,但也许这个解决方案是获得所需结果的唯一方法。

另一个想法是使用循环并将所有数据存储在数组中,但我遇到的问题是无法绘制数组,因为绘图函数不允许这样做。

那么你知道如何解决这个问题吗?坦率地说,我不敢相信这个简单的问题不能用专门设计用于酒吧的软件轻松解决..

干杯卡尔

pine-script
3个回答
0
投票

我认为你正在尝试做这样的事情

//@version=5
indicator("Cumulative percentage change")

src = input.source(close, "Source")
len = input.int(5, "Length")

pct_change = 100 * ta.change(src)/src[1]
cumulative = math.sum(pct_change, len)

plot(pct_change, "pct_change", color.blue)
plot(cumulative, "cumulative", color.red)

产生

编辑1
回答此评论

//@version=5
indicator("Cumulative percentage change")

src = input.source(close, "Source")
len = input.int(5, "Length")
t1  = input.symbol("EURUSD", "Symbol 1")
t2  = input.symbol("EURNZD", "Symbol 2")
t3  = input.symbol("EURCHF", "Symbol 3")

var float   cumulative1 = 0
var float   cumulative2 = 0
var float   cumulative3 = 0
var bool    draw        = false

value1 = request.security(t1, "", src)
value2 = request.security(t2, "", src)
value3 = request.security(t3, "", src)

delta1 = ta.change(value1)
delta2 = ta.change(value2)
delta3 = ta.change(value3)

// if bar_index >= last_bar_index - len - 1 and not draw
//     draw := true

if bar_index >= last_bar_index - len - 1
    if draw
        cumulative1 += 100 * delta1/value1[1]
        cumulative2 += 100 * delta2/value2[1]
        cumulative3 += 100 * delta3/value3[1]
    else
        draw := true

plot(draw ? cumulative1 : na, "cumulative1", color.red)
plot(draw ? cumulative2 : na, "cumulative2", color.green)
plot(draw ? cumulative3 : na, "cumulative3", color.blue)

产生


0
投票

您不必发现某个小节是实时小节之前的第 5 个小节。 到达实时柱后,您可以直接选取最后 5 个柱的值。以下是 30 天绘制的 EURUSD 累积变化总和示例

//@version=5
indicator("30 Day Change By Rohit")
var sumofchange=0.0
if barstate.islast
    for j = 1 to 30 
        i=30-j
        newsum=sumofchange+(close[i]-close[i+1])/close[i+1]
        line.new(bar_index-i,sumofchange,bar_index-i+1,newsum)
        sumofchange:=newsum


0
投票

我遇到了类似的问题/要求,并决定以不同的方式解决它。

我只是在 if (barstate.islast) 测试中创建了一段代码。因此,等到最后一个柱 (islast=true),然后您就可以根据需要向后处理。因此,不要尝试在脚本逐条处理时解决问题。等到最后再向后处理。您可以在 for 循环中执行此操作。这样

if (barstate.islast)
    for i = 0 to 4
         [code required to perform function]

您可以使用 [i] 获取之前的柱值。

如果您要处理大量历史柱,您可能需要在脚本开头的指标语句中设置“max_bars_back =”

© www.soinside.com 2019 - 2024. All rights reserved.