TradingView图表库M周期下getBars无限递归调用问题求助
解决月(M)周期下getBars函数重复调用的问题
问题根源
月周期和周/日周期的核心区别在于时间跨度不固定(不同月份天数不同),如果调用getBars时未正确限定请求的时间范围,或者每次请求后没有更新时间边界,系统会一直判定存在未拉取的历史数据,导致重复调用。
解决步骤
1. 定义全局状态变量维护时间范围
把from、to、countBack定义在调用上下文的全局/模块级,避免每次调用都重置状态:
// 初始化时间变量:以当前时间为拉取终点 let to = Date.now(); let countBack = 10; // 每次拉取10根月K线,可根据需求调整 let from;
2. 带终止条件的getBars调用逻辑
每次调用时计算from,并在获取数据后更新时间边界,同时判断是否终止拉取:
function fetchMonthlyBars() { // 计算from:从当前to往前推countBack个月 const fromDate = new Date(to); fromDate.setMonth(fromDate.getMonth() - countBack); from = fromDate.getTime(); getBars({ symbol: '你的标的代码', period: 'M', from: from, to: to, countBack: countBack, onSuccess: (barsData) => { // 这里写你的K线数据处理逻辑 processBarsData(barsData); // 终止判断:如果返回数据量小于countBack,说明已拉完所有历史 if (barsData.length === countBack) { // 更新to为当前批次最早的K线时间,下一次拉取更早的历史 to = barsData[0].time; fetchMonthlyBars(); } else { console.log('月K线数据拉取完成,终止调用'); } }, onError: (err) => { console.error('拉取失败:', err); // 出错时直接终止,避免无限重试 } }); } // 启动拉取 fetchMonthlyBars();
3. 注意接口数据格式适配
假设你的数据接口返回的月K线格式如下(需与实际接口匹配):
// 接口返回示例 [ { time: 1672531200000, open: 100, high: 120, low: 90, close: 110 }, // 2023-01月K { time: 1675209600000, open: 110, high: 130, low: 100, close: 125 }, // 2023-02月K // ... 更多数据 ]
确保barsData[0].time是当前批次中最早的K线时间戳,用来更新下一次拉取的to边界。
关键注意点
- 不要在
getBars的回调里重新初始化from/to,必须维护全局状态; - 终止条件必须明确:当返回数据量小于
countBack时,说明没有更早的历史数据了; - 月周期的时间计算用
setMonth即可,大部分数据接口会自动处理跨月的日期边界问题。
内容的提问来源于stack exchange,提问作者Altaf
相关产品推荐
相关产品推荐

