Trading View tvWidget.setSymbol调用同一符号两次失效问题求助
解决TradingView同一品种不同手数无法触发新数据请求的问题
问题核心
setSymbol 函数的作用是切换交易品种和K线周期,它的第二个参数是周期(比如'1'代表1分钟),并不负责传递手数(lot size)参数。当你针对同一品种、同一周期重复调用setSymbol时,TradingView会判定没有发生有效切换,因此不会触发向getData的新请求。
解决方案
要实现不同手数触发新请求,需要把手数作为自定义参数附加到数据请求中,并通过强制刷新的方式触发重新加载,具体步骤如下:
将手数作为请求参数传递
确保你的getData接口支持接收lotSize参数,在请求时主动带上该参数,让后端根据手数返回对应计算后的数据。强制触发数据刷新
由于同一品种周期下setSymbol不会触发刷新,可通过「临时切换品种再切回」的方式触发重新请求,同时在回调中传递手数参数并强制刷新图表。
修改后的代码示例
if (window.tvWidget) { window.tvWidget.onChartReady(function() { // 定义当前手数 let currentLotSize = 1; // 封装更新图表的函数,传入目标品种和手数 function updateChartWithLotSize(targetSymbol, lotSize) { // 先切换到临时品种,触发TradingView的刷新机制 tvWidget.setSymbol('TEMP_SYMBOL', '1', function() { // 切回目标品种 tvWidget.setSymbol(targetSymbol, '1', function() { // 将手数参数传递给自定义数据feed(假设你的datafeed有此方法) const datafeed = window.tvWidget._datafeed; datafeed.setExtraParams({ lotSize: lotSize }); // 强制刷新图表数据,触发getData请求 tvWidget.chart().refresh(); console.log(`已切换到手数 ${lotSize},数据请求已触发`); }); }); } // 初始加载调用 updateChartWithLotSize(symbol, currentLotSize); // 后续切换手数时调用(比如按钮点击事件中) // updateChartWithLotSize(symbol, 2); }); }
额外说明
如果你使用的是TradingView自定义数据feed,需要在getBars方法中读取lotSize参数并传递给后端接口,确保每次请求都包含手数信息。例如:
// 自定义datafeed的getBars方法示例 getBars(symbolInfo, resolution, periodParams, onResultCallback, onErrorCallback) { // 获取之前设置的手数参数 const lotSize = this.extraParams?.lotSize || 1; // 发起请求时带上lotSize fetch(`/getData?symbol=${symbolInfo.name}&lotSize=${lotSize}`) .then(res => res.json()) .then(data => onResultCallback(data)) .catch(err => onErrorCallback(err)); }
内容的提问来源于stack exchange,提问作者sumit santra
相关产品推荐
相关产品推荐

