TradingView Pine Script多交易所数据调用问题求助
解决方案:TradingView多交易所指标优化(避免无效交易对报错+自动符号转换)
核心问题分析
你遇到的两个关键问题本质都是Pine Script的规则限制:
request.security的交易对参数必须是不可变常量(不能用:=动态修改)- 无效交易对会触发报错,必须通过逻辑控制避免请求无效数据
以下是针对性的优化方案:
一、完整代码实现
//@version=5 indicator("Multi-Exchange Volume Tracker", overlay=false) // 工具函数:自动转换BitMEX的BTC/XBT符号 fix_bitmex_btc(select_coin) => select_coin == "BTC" ? "XBT" : select_coin // 提取当前图表的基础币种(一次性初始化,不可变) var ticker = syminfo.ticker // 移除USDT/USD/PERP后缀,提取纯币种符号 var base_coin = str.replace_all(str.replace_all(str.replace(ticker, "USDT", "", 0), "USD", "", 0), "PERP", "", 0) // 生成BitMEX兼容的币种符号 bitmex_base = fix_bitmex_btc(base_coin) // 生成BitMEX交易对(常量表达式,不可修改) bitmex_perp_usdt_symbol = "Bitmex:" + bitmex_base + "USDT" bitmex_perp_usd_symbol = "Bitmex:" + bitmex_base + "USD" // 输入控制选项 use_bitmex_perp_usdt = input.bool(title="启用Bitmex USDT永续合约数据", defval=true) // 可选:允许手动修正交易对(默认自动生成) bitmex_perp_usdt_custom = input.symbol(title="Bitmex USDT合约(自定义)", defval=bitmex_perp_usdt_symbol) // 条件请求数据:利用三元运算符短路特性,关闭开关时不执行request.security bitmex_vol = use_bitmex_perp_usdt ? request.security(bitmex_perp_usdt_custom, timeframe.period, volume) : na // 计算累积成交量:仅当开关开启且数据有效时执行 sum_period = input.int(title="成交量统计周期", defval=20) cum_vol_bitmex = use_bitmex_perp_usdt and not na(bitmex_vol) ? math.sum(bitmex_vol, sum_period) : na // 绘制指标 plot(cum_vol_bitmex, title="BitMEX USDT永续合约累积成交量", color=color.blue, linewidth=2)
二、关键优化点说明
不可变交易对符号
- 所有交易对字符串用
=定义,或通过纯函数生成,确保是编译时确定的常量,避免触发Cannot use a mutable variable错误 - 用
var关键字初始化币种变量,确保只在脚本启动时执行一次,不会动态修改
- 所有交易对字符串用
避免无效交易对报错
- 利用三元运算符的短路特性:当
use_bitmex_perp_usdt为false时,request.security不会被执行,也就不会解析无效交易对 - 提供手动修正输入框,默认自动生成交易对,遇到特殊情况时可快速修改
- 利用三元运算符的短路特性:当
数据有效性过滤
- 用
not na(bitmex_vol)判断数据是否有效,避免na值参与计算导致异常
- 用
三、对之前错误写法的修正说明
- 你之前用
:=修改交易对变量的写法会导致变量变为可变变量,违反request.security的参数规则,必须改为一次性生成的常量表达式 - 三元运算符本身是可行的,报错原因是交易对变量的可变性,而非语法问题
内容的提问来源于stack exchange,提问作者questionmaster69
相关产品推荐
相关产品推荐

