Pine Script中除法运算返回随机值问题排查求助
问题根源及解决方案
你的代码出现运算结果异常的核心原因有两个:
varip变量初始化逻辑缺陷:varip声明的变量会在脚本运行期间保留值,且仅在第一次满足na(StartingBaseSize)时赋值。如果脚本启动时request.security返回的BasePrice/CurrencyPrice是na(比如对应标的的日线数据未加载完成),变量会被赋值为na,之后再也不会更新,导致结果异常。- 未处理符号切换场景:当切换交易对时,
varip变量不会自动重置,旧的计算值会被保留,看起来结果“随机”。
修改后的代码
//@version=5 indicator("初始仓位计算器", overlay=false) varip float startingCapital = input.float(defval=1000.0, title="起始资金", minval=15) varip float StartingBaseSize = na varip float StartingCurrencySize = na varip float BasePrice = na varip float CurrencyPrice = na var string prevSymbol = syminfo.tickerid // 监听交易对切换,重置变量 if syminfo.tickerid != prevSymbol prevSymbol := syminfo.tickerid StartingBaseSize := na StartingCurrencySize := na BasePrice := na CurrencyPrice := na // 获取基础货币和计价货币的USDT日线收盘价 BasePrice := request.security(syminfo.basecurrency + "USDT", "D", close) CurrencyPrice := request.security(syminfo.currency + "USDT", "D", close) // 处理USDT/USD计价的特殊情况 if syminfo.currency == "USDT" or syminfo.currency == "USD" CurrencyPrice := 1.0 // 仅当价格有效且变量未初始化时,计算初始仓位 if na(StartingBaseSize) and not na(BasePrice) StartingBaseSize := (startingCapital / BasePrice) / 2 if na(StartingCurrencySize) and not na(CurrencyPrice) StartingCurrencySize := (startingCapital / CurrencyPrice) / 2 // 调试表格输出 var table debugTable = table.new(position.top_right, 4, 2) if barstate.islast table.cell(debugTable, 0, 0, "起始资金") table.cell(debugTable, 0, 1, str.tostring(startingCapital)) table.cell(debugTable, 1, 0, "基础货币价格") table.cell(debugTable, 1, 1, str.tostring(BasePrice)) table.cell(debugTable, 2, 0, "基础仓位") table.cell(debugTable, 2, 1, str.tostring(StartingBaseSize)) table.cell(debugTable, 3, 0, "计价仓位") table.cell(debugTable, 3, 1, str.tostring(StartingCurrencySize))
关键修改点
- 增加价格有效性判断:在初始化仓位时加入
not na(BasePrice)和not na(CurrencyPrice),确保只用有效的价格计算,避免na值污染变量。 - 添加交易对切换监听:通过对比当前和之前的
tickerid,在切换交易对时重置所有变量,保证重新计算初始仓位。 - 修正变量拼写错误:原代码中
StartingCurrencySize的赋值语句误写为StartingBaseSize,已修正。
内容的提问来源于stack exchange,提问作者Czár Iván
相关产品推荐
相关产品推荐

