如何在Pine Script v5中为request.security动态生成标的符号字符串
Pine Script v5不用冗长switch语句能否动态生成符合request.security要求的交易对字符串?
我查阅了同类问题后认为,如果不使用如下所示的冗长switch语句,就无法动态生成交易对标的字符串,请问该结论是否正确?在Pine Script @version=v5中是否有更高效的方案可以实现我的需求?
//@version=5 indicator("String Test Script") // 示例:图表加载BINANCE:DOGEUSDT时运行该脚本 // 目标是移除ticker字符串中的USD*后缀 // 例如 DOGEUSDT -> DOGE // 之后就可以请求对应的币种占比数据 // 例如 DOGEUSDT -> DOGE -> DOGE.D // 拆分字符串"DOGEUSDT" -> 字符串数组 ["DOGE", "T"] _array = str.split(syminfo.ticker, "USD") // 取第一个元素转成字符串 string asset_fail = str.tostring(array.get(_array, 0)) // 生成新的占比指标symbol "DOGE" -> "DOGE.d" string dom_fail = str.format("{0}.d", asset_fail) // 请求数据 float data_fail = request.security (dom_fail, "D", close) // ^^^ 运行报错信息如下 plot(data_fail) // ------ 报错信息 --------------------------------------------------------------- // line 23: Cannot call 'request.security' with argument 'symbol'='symbol'. // An argument of 'series string' type was used but a 'simple string' is expected // ---------------------------------------------------------------------------- // 以下方法可以运行,但需要写极长的switch语句 // 必须手动覆盖所有可能的tickerUSD[.*]组合 asset_ok = switch syminfo.ticker 'DOGEUSD' => 'DOGE' 'DOGEUSDC' => 'DOGE' 'DOGEUSDT' => 'DOGE' 'BTCUSD' => 'BTC' 'BTCUSDC' => 'BTC' 'BTCUSDT' => 'BTC' // ... 此处省略上百个交易对组合 => 'UNKNOWN TICKER' // 生成新的占比指标symbol "DOGE" -> "DOGE.d" string dom_ok = str.format("{0}.d", asset_ok) // 请求数据 float data_ok = request.security (dom_ok, "D", close) plot(data_ok)
我已经查阅了以下资料:
- Pine Script v5类型系统官方文档
- Pine Script是否有替换字符串功能?
- Pine Script如何将series[string]转换为string类型
- ...其他更多资料
目前看起来即使是v5版本的Pine Script也没有其他可行方案。如果确实如此,请问有没有方法可以避免编写覆盖上百种tickerUSD.*组合的switch语句,来得到符合request.security()要求的常量字符串?还是说目前只能使用这个方案?
解答
你的结论不成立,Pine Script v5完全可以不用写冗长的switch语句实现需求。
你之前代码报错的核心原因是:字符串处理函数默认返回series string类型,而request.security的symbol参数要求传入编译期即可确定不会变化的simple string类型。
解决方案非常简单,你只需要把字符串处理逻辑放在barstate.isfirst分支中,配合var关键字声明变量,编译器就会识别到该变量全局唯一,符合simple string的类型要求,可行代码如下:
//@version=5 indicator("Dynamic Dominance Fetch", overlay=false) // var声明的变量只会在脚本初始化时赋值一次 var string target_asset = na var string dominance_symbol = na if barstate.isfirst // 找到USD在交易对字符串中的起始位置 usd_index = str.pos(syminfo.ticker, "USD") // 截取USD之前的部分作为标的币种名 target_asset := usd_index > 0 ? str.substring(syminfo.ticker, 0, usd_index) : "UNKNOWN" dominance_symbol := str.format("{0}.D", target_asset) // 直接传入全局固定的dominance_symbol即可通过类型校验 dominance_data = request.security(dominance_symbol, "D", close) plot(dominance_data, title="币种占比", color=color.new(color.blue, 0))
这个方案不需要枚举任何交易对,只要当前加载的交易对计价货币是以USD开头的(USD、USDT、USDC等),都可以自动识别币种名,适配所有主流加密货币交易对。
内容的提问来源于stack exchange,提问作者calmrat
相关产品推荐
相关产品推荐

