PineScript编译报错:'if'无法作为变量/函数名的问题求助
PineScript v5编译错误:"'if' cannot be used as a variable or function name" 解决方法
错误原因
PineScript是严格依赖缩进层级的语言,你的代码存在缩进不统一的问题:被注释的Buy1开仓、平仓逻辑对应的if块,缩进长度和同级代码块不一致。编译器会因为错误的缩进,将这些if关键字误判为变量名或函数名,从而抛出该错误。
比如原代码中:
if (not na(vrsi)) if (co and co1 and co2 and inTradeWindow) strategy.entry("Buy", strategy.long, comment="Buy") if (rco and rco1 and inTradeWindow) // 此处缩进比上一行if多1个空格,层级混乱 strategy.entry("Buy1", strategy.long, comment="Buy1")
这种缩进差异会破坏代码块的层级结构,让编译器无法正确识别if的逻辑分支作用。
修复方法
将所有嵌套的if语句缩进统一,保持和同级代码块一致的缩进(推荐用4个空格作为标准缩进),确保每个代码块层级清晰。另外原代码漏定义了vrsi变量(co = ta.crossover(vrsi, overSold)中使用但未声明),也需要补充。
修正后的核心逻辑代码
//@version=5 strategy("Your Strategy Name", overlay=true) // 请补充定义以下变量:price, ShortLength, LongLength, overSold, overBought, betweenbuy, betweensell, barsbetween, profitnumber, lossnumber, inTradeWindow, vrsi1BottomBorder, vrsi1TopBorder rsi = ta.rsi(price, ShortLength) vrsi = ta.rsi(price, ShortLength) // 补充漏定义的vrsi变量 vrsi1 = ta.rsi(price, LongLength) co = ta.crossover(vrsi, overSold) co1 = vrsi1 - vrsi <= betweenbuy co2 = vrsi1 < vrsi1BottomBorder barsSinceLastEntry = 1 barsSinceLastEntry := strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na cu = ta.crossunder(vrsi, overBought) cu1 = vrsi - vrsi1 <= betweensell cu2 = vrsi - vrsi1 <= betweensell + (betweensell * barsSinceLastEntry / barsbetween) cu3 = vrsi1 > vrsi1TopBorder rco = ta.crossunder(vrsi, overSold) rco1 = ta.crossunder(vrsi1, vrsi1BottomBorder) rcu = ta.crossover(vrsi, overBought) rcu1 = ta.crossunder(vrsi1, vrsi1TopBorder) // 创建买卖逻辑 if (not na(vrsi)) if (co and co1 and co2 and inTradeWindow) strategy.entry("Buy", strategy.long, comment="Buy") if (rco and rco1 and inTradeWindow) strategy.entry("Buy1", strategy.long, comment="Buy1") if (barsSinceLastEntry < barsbetween) if (inTradeWindow and cu and cu1 and cu3) strategy.exit("exit", "Buy", profit=profitnumber, loss=lossnumber) else if (barsSinceLastEntry >= barsbetween) if (inTradeWindow and cu and cu2 and cu3) strategy.exit("exit", "Buy", profit=profitnumber, loss=lossnumber) if (rcu and rcu1 and inTradeWindow) strategy.exit("exit", "Buy1", profit=profitnumber, loss=lossnumber)
内容的提问来源于stack exchange,提问作者Ilya Volkov
相关产品推荐
相关产品推荐

