PlotCandle绘制SSRO蜡烛图数值错误问题修复咨询
SSRO蜡烛图数值异常与形态错误的修复方案
问题根源
- 稳定币数据顺序错误:
srcget方法中使用unshift添加数据,导致稳定币数组顺序反转,总和计算出现偏差。 - SSRO计算逻辑错误:对单根K线的开/高/低/收分别计算SSRO,破坏了原K线高低点的大小关系——主币高低点与稳定币对应高低点总和的比例关系不稳定,直接计算会出现
ssro.h < ssro.l的反向异常。
修复步骤
1. 修正稳定币数据数组顺序
将srcget方法中的srcs.unshift(val)替换为srcs.push(val),确保稳定币数据按添加顺序存入数组,总和计算准确。
2. 重构SSRO计算逻辑
SSRO是SSR(稳定币供给比率)的Z-score标准化指标,正确逻辑为:
- 先计算主币收盘价的SSR序列(
主币收盘价 / 稳定币收盘价总和) - 基于SSR序列计算均线和标准差,得到收盘价的SSRO值
- 用主币开/高/低与收盘价的比例,映射出对应点位的SSRO值,保证高低点的大小关系与原K线一致
修复后完整代码
//@version=6 indicator("Stablecoin Supply Ratio Oscillator", "SSRO", overlay=false) type bar float o = open float h = high float l = low float c = close method data(string coin) => bar x = request.security('CRYPTOCAP:' + coin, '', bar.new()) na(x) ? bar.new(0, 0, 0, 0) : x method srcget(array<bar> stbl, string src) => array<float> srcs = array.new<float>() for coin in stbl val = switch src 'o' => coin.o 'h' => coin.h 'l' => coin.l 'c' => coin.c srcs.push(val) // 替换unshift为push,修正数组顺序 srcs // 计算SSR序列的Z-score(SSRO) float ssro_calc(float src, float ssr_sma, float ssr_stdev) => (src - ssr_sma) / ssr_stdev method adj(color col, int lvl) => color.new(col, lvl) var string gs = "SSRO", var string gc = "Colors" len = input.int (200 , "Length" , group = gs) chart = input.bool (true , "Use Chart As Main Coin", group = gs) var string main = syminfo.type != 'crypto' ? 'BTC' : chart ? syminfo.basecurrency : 'BTC' bar coin = main.data() array<bar> stbl = array.from( 'USDT'.data(), 'USDC'.data(), 'DAI'.data(), 'GUSD'.data(), 'USDD'.data()) // 获取稳定币收盘价总和 float stbl_c_sum = array.sum(stbl.srcget('c')) // 计算主币收盘价的SSR float ssr_c = coin.c / stbl_c_sum // 计算SSR的均线和标准差 float ssr_sma = ta.sma(ssr_c, len) float ssr_stdev = ta.stdev(ssr_c, len) // 基于收盘价SSRO,映射开/高/低的SSRO值(保持原K线比例关系) float ssro_c = ssro_calc(ssr_c, ssr_sma, ssr_stdev) float ssro_o = ssro_c * (coin.o / coin.c) float ssro_h = ssro_c * (coin.h / coin.c) float ssro_l = ssro_c * (coin.l / coin.c) // 创建修正后的SSRO bar bar ssro = bar.new(ssro_o, ssro_h, ssro_l, ssro_c) color col = ssro.c > ssro.o ? color.green : color.red plotcandle(ssro.o, ssro.h, ssro.l, ssro.c, "SSRO", color=col, wickcolor=col, bordercolor=col) plot(ssro.l, "ssro.l", color=color.new(color.navy,50), style=plot.style_line) //plot(ssro.h,"ssro.h",color= color.new(color.black,50),style=plot.style_line) //plot(ssro.o,"ssro.o",color= color.new(color.blue,50),style=plot.style_line) //plot(ssro.c,"ssro.c",color= color.new(color.maroon,50),style=plot.style_line)
内容的提问来源于stack exchange,提问作者Tomasz Nadwor
相关产品推荐
相关产品推荐

