在TakeProfit的Indie语言中安全访问Optional[float]类型值的方法(使用value_or(None)时出现类型错误)
在TakeProfit的Indie语言中安全访问Optional[float]类型值的方法(使用value_or(None)时出现类型错误)
我太懂你现在的糟心了——本来想优雅地用value_or给Optional[float]兜底,结果直接碰上个类型不兼容的报错,明明逻辑上没问题,就是卡在这里,确实挺闹心的。
其实你踩的坑,很多刚接触Indie类型系统的开发者都遇到过:Indie里的Optional类型和你熟悉的Python里的Optional不太一样,它的“空状态”是用na(Not Available)来标记的,而不是None,而且类型检查卡得特别严——如果你的代码上下文需要的是纯float类型,你返回带None的Union类型肯定会报错。
给你几个实用的解决办法,都是我平时写Indie指标常用的:
显式条件判断兜底(最直观,新手友好)
直接用is not na判断Optional变量是否有有效值,然后给float类型的变量赋值兜底的float值:# 假设你从高时间框架拿到的Optional变量叫higher_tf_value var Optional[float] higher_tf_value = request.security(syminfo.tickerid, "4H", close) # 安全获取值,这里用0.0作为兜底,你可以换成自己需要的float值 float plot_value = na if higher_tf_value is not na: plot_value = higher_tf_value else: plot_value = 0.0三元表达式简化写法(代码更紧凑)
如果嫌上面的写法太啰嗦,用Indie支持的三元表达式一行搞定:float plot_value = higher_tf_value is not na ? higher_tf_value : 0.0
至于你之前用value_or(None)报错的原因:value_or如果传None,返回的类型还是Optional[float](因为None不是float类型),而你用来绘图或者计算的变量大概率是要求纯float类型,类型检查自然就触发错误了。所以一定要确保value_or里传的兜底值是float类型,比如改成value_or(0.0),其实和上面的三元表达式效果是一样的,不过很多人更习惯用条件判断或者三元表达式,可读性更强。
给你个完整的绘图示例,直接就能用:
# indie:lang_version = 5 indicator("High TF Value Marker", overlay=true) # 从日K线获取收盘价,返回的是Optional[float] var Optional[float] daily_close = request.security(syminfo.tickerid, "D", close, gaps=barmerge.gaps_on) # 安全获取值,用当前K线收盘价作为兜底 float marker_price = daily_close is not na ? daily_close : close # 绘制向上三角标记 plotshape(series=marker_price, title="Daily Close Marker", location=location.belowbar, color=color.new(color.green, 0), style=shape.triangleup, size=size.small)
备注:内容来源于stack exchange,提问作者Pavlito
相关产品推荐
相关产品推荐

