2

我有一个要转换为 python 的 pine 脚本。

但是,pine 脚本允许 RSI 有 2 个系列作为输入,而不是传统的系列和周期。

我的问题是这是如何实现的,我在他们的文档中尝试了实现,但它不计入第二个系列:

pine_rsi(x, y) => 
u = max(x - x[1], 0) // upward change
d = max(x[1] - x, 0) // downward change
rs = rma(u, y) / rma(d, y)
res = 100 - 100 / (1 + rs)
res

谢谢,

4

4 回答 4

2

我不是 Python 或其他方面的专家,但我认为您正试图除以零。

RSI 的公式为:

RSI= 100 - { 100 \ (1+RS) }

在哪里

RS = SMMA(U,n) / SMMA(D,n)

如果向下的 rma 等于零,则等式中的逻辑似乎无法解释 RS 在分母中为零的事实。只要价格连续 14 个周期呈下降趋势,或者无论 RSI 的周期是什么,就会出现这种情况。

每当出现上述情况时,pine 编辑器脚本通过将 RSI 设置为 100 来解决此问题。

在下面的第 6 行:只要 down rma 项等于 0,RSI 就会切换到 100。该行的第二部分仅在代码不会被零除时执行。

1  //@version=3
2  study(title="Relative Strength Index", shorttitle="RSI")
3  src = close, len = input(14, minval=1, title="Length")
4  up = rma(max(change(src), 0), len)
5  down = rma(-min(change(src), 0), len)
6  rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
7  plot(rsi, color=purple)
8  band1 = hline(70)
9  band0 = hline(30)
10 fill(band1, band0, color=purple, transp=90)
于 2018-08-19T17:26:01.720 回答
2

来自 pine 脚本文档:

rsi(x,y)

“如果 x 是一个系列,y 是整数,那么 x 是一个源系列,y 是一个长度。

“如果 x 是一个系列并且 y 是一个系列,则 x 和 y 被认为是 2 个计算的向上和向下变化的 MA”

所以,如果你有向上和向下的变化系列,rsi将像这样工作:

u = ["your upward changes series"]
d = ["your downward changes series"]

rsi = 100 - 100 / (1 + u / d) //No need for a period value
于 2020-01-05T16:58:37.773 回答
0

Pine Script 里面其实有“第二系列”这样的东西。从文档中:

rsi(x,y)

"If x is a series and y is integer then x is a source series and y is a length.
If x is a series and y is a series then x and y are considered to be 2 calculated MAs for upward and downward changes"

但是它没有解释目的是什么,因为 rsi() 函数没有长度输入 - Pine 应该对数据做什么?

像 OP 一样,我也想知道 2 系列作为输入的目的,以移植到 python。这还没有回答。

于 2019-04-30T12:50:31.467 回答
-1

这是如何实现的..它不计入第二个系列

没有“第二”系列


让我们回顾一下代码,
原来的样子是这样的:

pine_rsi( x, y ) => 
     u   = max(x - x[1], 0) // upward change
     d   = max(x[1] - x, 0) // downward change
     rs  = rma(u, y) / rma(d, y)
     res = 100 - 100 / (1 + rs)
     res

然而,如果我们将逻辑解码为更易读的形式,我们会得到:

pine_rsi(        aTimeSERIE, anRsiPERIOD ) => 
     up   = max( aTimeSERIE
               - aTimeSERIE[1], 0 )     //         upward changes

     down = max( aTimeSERIE[1]
               - aTimeSERIE,    0 )     //       downward changes

     rs   = ( rma( up,   anRsiPERIOD )  //  RMA-"average" gains  over period
            / rma( down, anRsiPERIOD )  //  RMA-"average" losses over period
              )

     res  = 100 - 100 / ( 1 + rs )      //  

     res

这正是 J. Welles Wilder 所命名的相对强度指数,不是吗?

因此,只需按照调用签名的规定传递正确的数据类型,就完成了。

于 2018-05-17T10:59:51.857 回答