具有可变变量的颜色布尔值的 Pinescript 安全函数

Pinescript security function for colour boolean with mutable variable

我在将珊瑚趋势指标颜色代码绘制到我的 15 分钟 21EMA 安全函数中时遇到问题。 由于珊瑚趋势指标颜色代码有一个可变变量,我无法解析它。这是我的下一级编码,哈哈。

我会post

代码:

//@version=5

indicator(title='CT Indi', shorttitle='', overlay=true)


sm = input(21, title='Smoothing Period')
cd = input(0.4, title='Constant D')

di = (sm - 1.0) / 2.0 + 1.0
c1 = 2 / (di + 1.0)
c2 = 1 - c1
c3 = 3.0 * (cd * cd + cd * cd * cd)
c4 = -3.0 * (2.0 * cd * cd + cd + cd * cd * cd)
c5 = 3.0 * cd + 1.0 + cd * cd * cd + 3.0 * cd * cd
i1 = 0.0
i1 := c1 * request.security(syminfo.tickerid, "15", close) + c2 * nz(i1[1])
i2 = 0.0
i2 := c1 * i1 + c2 * nz(i2[1])
i3 = 0.0
i3 := c1 * i2 + c2 * nz(i3[1])
i4 = 0.0
i4 := c1 * i3 + c2 * nz(i4[1])
i5 = 0.0
i5 := c1 * i4 + c2 * nz(i5[1])
i6 = 0.0
i6 := c1 * i5 + c2 * nz(i6[1])

bfr = -cd * cd * cd * i6 + c3 * i5 + c4 * i4 + c5 * i3

bfrC = bfr > nz(bfr[1]) ? color.white : bfr < nz(bfr[1]) ? #056656 : na

plot(request.security(syminfo.tickerid, "1", ta.ema(close, 315)), title='15m 21 EMA', color=bfrC, linewidth=2)

截图:

问题:

如在 15 分钟时间范围(右下)的屏幕截图中所示:根据代码中的规则绘制 21 EMA 并更改颜色。这很棒!现在我想把它带到其他时间范围(尤其是较低的时间范围)。在顶部和左下角,我们找到了 5 分钟和 10 分钟图表。 15 分钟 21 EMA 绘制在那里,但颜色变化与 15 分钟时间范围内的不同。它接管了当前时间范围的信息(因此这里是 5 分钟和 10 分钟)。如何将可变变量循环到安全函数到颜色布尔值?

我尝试的解决方案:

所以我想如果我将创建颜色开关的那条线也放入安全函数中,事情就会起作用:

plot(request.security(syminfo.tickerid, "1", ta.ema(close, 315)), title='15m 21 EMA', color=request.security(syminfo.tickerid, "15", bfrC), linewidth=2)

但后来我收到了 'Cannot use a mutable variable as an argument.....' 评论。似乎应该使用 function() =>。但是我如何将它用于该颜色布尔值?

更新

当我将答案中的这段代码复制到 Pinescript 中时,我得到了特定时间范围内的常规 21 EMA,并且着色不是我想要的(15 分钟)。

我自己取得了一些进步。但我被困在两者之间的空间。这是代码:

//@version=5

indicator(title='CT Indi', shorttitle='', overlay=true)


sm = input(21, title='Smoothing Period')
cd = input(0.4, title='Constant D')

di = (sm - 1.0) / 2.0 + 1.0
c1 = 2 / (di + 1.0)
c2 = 1 - c1
c3 = 3.0 * (cd * cd + cd * cd * cd)
c4 = -3.0 * (2.0 * cd * cd + cd + cd * cd * cd)
c5 = 3.0 * cd + 1.0 + cd * cd * cd + 3.0 * cd * cd
i1_func() =>
    i1 = 0.0
    i1 := c1 * request.security(syminfo.tickerid, "15", close) + c2 * nz(i1[1])
i2_func() =>
    i2 = 0.0
    i2 := c1 * i1_func() + c2 * nz(i2[1])
i3_func() =>
    i3 = 0.0
    i3 := c1 * i2_func() + c2 * nz(i3[1])
i4_func() =>
    i4 = 0.0
    i4 := c1 * i3_func() + c2 * nz(i4[1])
i5_func() =>
    i5 = 0.0
    i5 := c1 * i4_func() + c2 * nz(i5[1])
i6_func() =>
    i6 = 0.0
    i6 := c1 * i5_func() + c2 * nz(i6[1])

bfr = -cd * cd * cd * request.security(syminfo.tickerid, "15", i6_func()) + c3 * request.security(syminfo.tickerid, "15", i5_func()) + c4 * request.security(syminfo.tickerid, "15", i4_func()) + c5 * request.security(syminfo.tickerid, "15", i3_func())

b1 = bfr > nz( bfr[1] )
b2 = bfr < nz( bfr[1] )

bfrC = b1 ? color.white : b2 ? #056656 : na

plot(request.security(syminfo.tickerid, "1", ta.ema(close, 315)), title='15m 21 EMA', color=bfrC, linewidth=2)

我正在寻找着色 (bfrC) 与前一个相同的解决方案。所以,在我看来,: na 类似于 : bfrC[1]。这一行: bfrC = b1 ? color.white : b2 ? #056656 : na

有人解决吗?谢谢!!

您必须在全局范围内使用 request.security() 函数,然后才使用它。

你可以这样做:

//@version=5

indicator(title='CT Indi', shorttitle='', overlay=true)

myTickerClose = request.security(syminfo.tickerid, "15", close)

sm = input(21, title='Smoothing Period')
cd = input(0.4, title='Constant D')

di = (sm - 1.0) / 2.0 + 1.0
c1 = 2 / (di + 1.0)
c2 = 1 - c1
c3 = 3.0 * (cd * cd + cd * cd * cd)
c4 = -3.0 * (2.0 * cd * cd + cd + cd * cd * cd)
c5 = 3.0 * cd + 1.0 + cd * cd * cd + 3.0 * cd * cd
i1 = 0.0
i1 := c1 * myTickerClose + c2 * nz(i1[1])
i2 = 0.0
i2 := c1 * i1 + c2 * nz(i2[1])
i3 = 0.0
i3 := c1 * i2 + c2 * nz(i3[1])
i4 = 0.0
i4 := c1 * i3 + c2 * nz(i4[1])
i5 = 0.0
i5 := c1 * i4 + c2 * nz(i5[1])
i6 = 0.0
i6 := c1 * i5 + c2 * nz(i6[1])

bfr = -cd * cd * cd * i6 + c3 * i5 + c4 * i4 + c5 * i3

bfrC = bfr > nz(bfr[1]) ? color.white : bfr < nz(bfr[1]) ? #056656 : na

ema21 = ta.ema(myTickerClose, 21)

plot(ema21, title='15m 21 EMA', color=bfrC, linewidth=2)

已解决!为了能够在声明变量时引用变量的先前值,首先初始化变量并使用 re-assign := 运算符。

改变

bfrC = b1 ? color.white : b2 ? #056656 : na

bfrC = color(na)
bfrC := b1 ? color.white : b2 ? #056656 : nz(bfrC[1])

成功了!