Pine Script实现货币强度指标仅绘制当前品种对应两条强度线
Pine Script货币强度脚本问题修复方案
问题根因
- 赋值运算符使用错误:Pine Script语法规定,给已经声明过的全局变量重新赋值时,必须使用
:=运算符,不能使用=。你在if代码块内使用=赋值,相当于在if的局部作用域中声明了新的同名局部变量,全局的avgLeft、avgRight并未被修改,始终保留初始化的0.0值,因此绘制出的是水平线。 - 额外说明:提前初始化变量的操作是正确的,Pine Script要求所有变量必须先声明才能使用,若仅在if块内声明变量,出了局部作用域后变量会失效,就会触发
undeclared identifier报错。
基础修复代码(适配你现有写法)
// 原有货币强度平均值计算逻辑保留 avgUSD = (USDEUR + USDGBP + USDJPY + USDNZD + USDCAD + USDCHF + USDAUD) / 7 avgEUR = (EURNZD + EURGBP + EURJPY + EURUSD + EURCAD + EURCHF + EURAUD) / 7 avgJPY = (JPYEUR + JPYGBP + JPYNZD + JPYUSD + JPYCAD + JPYCHF + JPYAUD) / 7 avgCAD = (CADEUR + CADGBP + CADJPY + CADUSD + CADNZD + CADCHF + CADAUD) / 7 avgCHF = (CHFEUR + CHFGBP + CHFJPY + CHFUSD + CHFCAD + CHFNZD + CHFAUD) / 7 avgAUD = (AUDEUR + AUDGBP + AUDJPY + AUDUSD + AUDCAD + AUDCHF + AUDNZD) / 7 avgNZD = (NZDEUR + NZDGBP + NZDJPY + NZDUSD + NZDCAD + NZDCHF + NZDAUD) / 7 avgGBP = (GBPEUR + GBPJPY + GBPUSD + GBPCAD + GBPCHF + GBPAUD + GBPNZD) / 7 // 提前声明全局变量 avgLeft = 0.0 avgRight = 0.0 colLeft = color.blue colRight = color.red // 使用:=运算符修改全局变量值 if syminfo.root == "CADCHF" avgLeft := avgCAD colLeft := colCAD avgRight := avgCHF colRight := colCHF else avgLeft := avgAUD colLeft := colAUD avgRight := avgJPY colRight := colJPY // 绘图 plot(avgLeft, title=str.tostring(syminfo.basecurrency) + " 强度", color=colLeft) plot(avgRight, title=str.tostring(syminfo.countercurrency) + " 强度", color=colRight)
优化方案(无需手写全量货币对if判断)
可直接用Pine Script内置的syminfo.basecurrency、syminfo.countercurrency获取当前交易对的基准货币和计价货币,配合switch语句直接映射对应的强度值,不需要为每个货币对单独写判断分支:
// 原有avg系列计算逻辑保留 base = syminfo.basecurrency quote = syminfo.countercurrency // 映射基准货币强度 avgLeft := switch base "USD" => avgUSD "EUR" => avgEUR "JPY" => avgJPY "CAD" => avgCAD "CHF" => avgCHF "AUD" => avgAUD "NZD" => avgNZD "GBP" => avgGBP // 映射计价货币强度 avgRight := switch quote "USD" => avgUSD "EUR" => avgEUR "JPY" => avgJPY "CAD" => avgCAD "CHF" => avgCHF "AUD" => avgAUD "NZD" => avgNZD "GBP" => avgGBP
颜色映射可以套用完全相同的switch逻辑实现。
内容的提问来源于stack exchange,提问作者Heiko Fuchs
相关产品推荐
相关产品推荐

