You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Trading View tvWidget.setSymbol调用同一符号两次失效问题求助

解决TradingView同一品种不同手数无法触发新数据请求的问题

问题核心

setSymbol 函数的作用是切换交易品种和K线周期,它的第二个参数是周期(比如'1'代表1分钟),并不负责传递手数(lot size)参数。当你针对同一品种、同一周期重复调用setSymbol时,TradingView会判定没有发生有效切换,因此不会触发向getData的新请求。

解决方案

要实现不同手数触发新请求,需要把手数作为自定义参数附加到数据请求中,并通过强制刷新的方式触发重新加载,具体步骤如下:

  1. 将手数作为请求参数传递
    确保你的getData接口支持接收lotSize参数,在请求时主动带上该参数,让后端根据手数返回对应计算后的数据。

  2. 强制触发数据刷新
    由于同一品种周期下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:58:56