trdingview

// 切换商品
watch(
  () => currencyInfo.value.symbol,
  (n, j) => {
    widget.onChartReady(async () => {
      await widget.activeChart().setSymbol(n);
      widget.activeChart().setVisibleRange(widget.activeChart().getVisibleRange(), {
        applyDefaultRightMargin: true,
        percentRightMargin: true
      });
    });
  }
);
// 更新实时k线
watch(
  () => userkline.realTimeKline,
  async (n, j) => {
    if (n && typeof realtimeCallback.value === "function" && typeof widget.onChartReady === "function") {
      widget.onChartReady(async () => {
        await realtimeCallback.value(n);
      });
    }
  },
  { deep: true }
);

tradingview 切换商品 会出现历史数据于实时k线不符的情况a历史+b实时,只是最后一条历史k线

【以下回答由 GPT 生成】

问题解决方案

根据提供的代码和问题描述,导致历史数据与实时K线不匹配的原因可能是由于异步操作引起的。为了解决这个问题,我建议对代码进行一些修改,以确保正确的顺序和正确的数据被加载和更新。

首先,在切换商品时,我们需要确保当前的商品数据加载完成后再更新可见范围。为此,可以使用Promise来实现。

// 创建一个 Promise 对象
function setSymbolPromise(symbol) {
  return new Promise((resolve) => {
    widget.onChartReady(() => {
      widget.activeChart().setSymbol(symbol, () => {
        resolve(); // 标记 Promise 完成
      });
    });
  });
}

// 监听商品切换
watch(
  () => currencyInfo.value.symbol,
  async (n, j) => {
    await setSymbolPromise(n); // 等待商品切换完成
    widget.activeChart().setVisibleRange(widget.activeChart().getVisibleRange(), {
      applyDefaultRightMargin: true,
      percentRightMargin: true
    });
  }
);

接下来,我们需要确保实时K线数据在商品切换后再进行更新。可以使用async/await来确保正确的顺序。

// 更新实时K线
watch(
  () => userkline.realTimeKline,
  async (n, j) => {
    if (n && typeof realtimeCallback.value === "function" && typeof widget.onChartReady === "function") {
      await setSymbolPromise(currencyInfo.value.symbol); // 等待商品切换完成
      await realtimeCallback.value(n);
    }
  },
  { deep: true }
);

通过这些修改,我们可以确保实时K线数据的更新发生在正确的商品切换后,并且历史数据和实时K线数据能够匹配。

希望这些修改能帮助解决你的问题,如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^