TradingView自定义DataFeed中getMarks与getTimescaleMarks未调用求助
解决TradingView自定义DataFeed标记无输出问题
核心排查步骤
先确认函数是否触发
直接在getMarks和getTimescaleMarks最顶部加console.log('getMarks被调用了', startDate, endDate),刷新图表看控制台输出。要是没输出,先查这几点:- DataFeed类里有没有写
supportsMarks() { return true; }和supportsTimescaleMarks() { return true; }——没这俩返回true,TradingView根本不会触发标记请求 - 当前图表时间范围是否包含你标记数据的时间戳,只有可视时间段才会触发标记函数
- 图表设置的「标记」选项卡,有没有打开股息、会议这类标记的显示开关
- DataFeed类里有没有写
再检查函数实现合规性
- 函数必须用async/await或返回Promise,TradingView只认异步结果
- 返回的标记数据格式不能错:
getMarks每条数据需包含id(字符串/数字)、time(秒级时间戳!别用毫秒)、color、text、labelgetTimescaleMarks每条数据需包含id、time(秒级)、color、label
- 一定要过滤掉超出请求
startDate和endDate范围的标记数据,否则可能不显示
最后校验数据有效性
- 确认标记时间戳是秒级,存的是毫秒就除以1000转换
- 检查
id有没有重复,重复ID会导致标记不显示
修正后的代码示例
// 必须添加这俩函数,告知TradingView支持标记 supportsMarks() { return true; } supportsTimescaleMarks() { return true; } // 正确实现getMarks async getMarks(symbolInfo, startDate, endDate, onDataCallback, resolution) { console.log('getMarks触发', startDate, endDate); // 替换为你的实际数据获取逻辑 const rawMarks = await fetch('/api/dividend-and-meeting', { method: 'POST', body: JSON.stringify({ symbol: symbolInfo.ticker }) }).then(res => res.json()); // 过滤可视范围标记并转换格式 const validMarks = rawMarks.filter(mark => mark.timestamp >= startDate && mark.timestamp <= endDate) .map(mark => ({ id: mark.id, time: mark.timestamp, // 确保是秒级时间戳 color: mark.type === 'dividend' ? '#27ae60' : '#3498db', text: mark.type === 'dividend' ? `股息: $${mark.amount}` : '年度股东大会', label: mark.type === 'dividend' ? 'D' : 'M' })); onDataCallback(validMarks); }
常见踩坑点
- 漏写
supportsMarks/supportsTimescaleMarks,直接导致标记函数不被调用 - 时间戳用毫秒级,标记要么显示在错误时间要么完全不出来
- 函数未做异步处理,TradingView拿不到返回数据
- 标记数据超出当前图表可视范围,自然不会显示
内容的提问来源于stack exchange,提问作者Altaf
相关产品推荐
相关产品推荐

