脚本
//@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)
我正在对问题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个参考中位数:
然后我在May 01, 2020
的截止日期使用颜色开关绘制自定义中位数(2种颜色)
-红色:固定长度LEN1 = 100的中位数
-绿色:固定长度为LEN2的中位数= 500
我希望红线与蓝线和黄线的形式相同。
为什么?因为它们都有固定的中值长度100。
就是这样
但是,我也希望绿线与白线具有相同的形式。
为什么?因为它们都有固定的中值长度500。
显然不是这样。
任何人都知道为什么绿线和白线的形状不同,尽管具有相同的固定中位长度500?
答案 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)