运行中值计算似乎继续使用相同的输入

时间:2020-05-12 20:52:48

标签: pine-script

脚本

//@version=4
study(title="PlayGround", shorttitle="PG", overlay=true)

// My custom Median
median_custom(_src, _len) =>
    for _i = 1 to _len
        if _i == _len
            percentile_nearest_rank(_src, _i, 50)

// Built-in Median
median_builtin(_src, _len) =>
    percentile_nearest_rank(_src, _len, 50)

// 100 bars Median
median_len_100(_src) => percentile_nearest_rank(_src, 100, 50)
// 500 bars Median
median_len_500(_src) => percentile_nearest_rank(_src, 500, 50)

LEN1 = 100
LEN2 = 500

isBeforeDate = time < timestamp(2020,05,01,0,0,0)
len_custom = isBeforeDate ? LEN1 : LEN2

plot_space_delta = 10
plot(4*plot_space_delta + median_len_100(close),             "median_len_100", color = color.blue)
plot(3*plot_space_delta + median_len_500(close),             "median_len_500", color = color.white)
plot(2*plot_space_delta + median_builtin(close, LEN1),       "median_builtin", color = color.yellow)
plot(1*plot_space_delta + median_custom (close, len_custom), "median_custom",  color = isBeforeDate ? color.red : color.lime)

输出(股票代号SPX)

Output_median_test

我正在对问题Using percentile_nearest_rank with variable length to calculate running median

进行一些测试

我以为我找到了一种使用函数median_custom(_src, _len)实现运行中位数的方法,
通过欺骗percentile_nearest_rank()使其认为它得到的是integer参数而不是series
通过运行中位数,我的意思是接受变化的长度参数作为输入的中位数。
默认情况下不起作用,因为percentile_nearest_rank()的length参数必须是一个固定的整数。

首先,我绘制了3个参考中位数:

  • 蓝色:固定长度为100的中位数
  • 白色:固定长度为500的中位数
  • 黄色:固定长度LEN1 = 100的中位数

然后我在May 01, 2020的截止日期使用颜色开关绘制自定义中位数(2种颜色) -红色:固定长度LEN1 = 100的中位数 -绿色:固定长度为LEN2的中位数= 500

我希望红线与蓝线和黄线的形式相同。
为什么?因为它们都有固定的中值长度100。
就是这样

但是,我也希望绿线与白线具有相同的形式。
为什么?因为它们都有固定的中值长度500。
显然不是这样。

任何人都知道为什么绿线和白线的形状不同,尽管具有相同的固定中位长度500?

1 个答案:

答案 0 :(得分:0)

percentile_nearest_rank()循环中,不能使用for,也不能在每个小节上执行任何其他内置函数。那将需要嵌入式运行时进行循环,事实并非如此。因此,长度为100的循环版本可以正常工作,因为该函数仅返回循环的上一次迭代的值。

这有望满足您的需求:

//@version=4
study(title="PlayGround", shorttitle="PG", overlay=true)

// 100 bars Median
median_len_100(_src) => percentile_nearest_rank(_src, 100, 50)
// 500 bars Median
median_len_500(_src) => percentile_nearest_rank(_src, 500, 50)

m100 = median_len_100(close)
m500 = median_len_500(close)
isBeforeDate = time < timestamp(2020,05,01,0,0,0)
m = isBeforeDate ? m100 : m500

plot(m100,  "median_len_100", color.blue, 8, transp = 60)
plot(m500,  "median_len_500", color.gray, 8, transp = 60)
plot(m,     "median_custom",  not isBeforeDate and isBeforeDate[1] ? na : isBeforeDate ? color.red : color.lime)

enter image description here