Pine Script:如何避免带默认值的序列字段随新K线重置
问题:避免手动重置订单流状态的方法
背景代码
我定义了一个订单流相关的枚举:
enum Orderflow IN_BULLISH_ZONE = "In Bullish Zone" IN_BEARISH_ZONE = "In Bearish Zone" FORMING_BEARISH_ZONE = "Forming Bearish Zone" FORMING_BULLISH_ZONE = "Forming Bullish Zone" BULLISH_TREND = "Bullish Trend" BEARISH_TREND = "Bearish Trend" UNKNOWN = "Unknown"
将订单流状态存储在初始值为UNKNOWN的series变量中:
series Orderflow orderflow = Orderflow.UNKNOWN
后续通过条件判断更新状态:
// 初始阶段从UNKNOWN切换趋势状态 if(orderflow == Orderflow.UNKNOWN and newLowReached) info("Orderflow switched from unknown to bearish trend") orderflow := Orderflow.BEARISH_TREND if(orderflow == Orderflow.UNKNOWN and newHighReached) info("Orderflow switched from unknown to bullish trend") orderflow := Orderflow.BULLISH_TREND // 从下跌趋势切换至形成看跌区间 if(orderflow == Orderflow.BEARISH_TREND and low > low[1]) info("Orderflow switched from bearish trend to forming bearish zone") orderflow := Orderflow.FORMING_BEARISH_ZONE // 从上涨趋势切换至形成看涨区间 if(orderflow == Orderflow.BULLISH_TREND and high < high[1]) info("Orderflow switched from bullish trend to forming bullish zone") orderflow := Orderflow.FORMING_BULLISH_ZONE
当前问题:每根新K线计算时,orderflow会被重置为UNKNOWN,因此必须手动添加以下代码恢复前一根K线的状态:
if(orderflow[1] == Orderflow.BEARISH_TREND) orderflow := Orderflow.BEARISH_TREND if(orderflow[1] == Orderflow.BULLISH_TREND) orderflow := Orderflow.BULLISH_TREND
请问有没有办法避免这种手动重置操作,同时在未确立趋势时仍保留UNKNOWN的默认值?
解决方案
你可以通过修改orderflow变量的初始化逻辑,让它自动继承前一根K线的状态,仅在第一根K线时使用UNKNOWN作为默认值。具体做法是将变量初始化代码替换为:
series Orderflow orderflow = na(orderflow[1]) ? Orderflow.UNKNOWN : orderflow[1]
原理说明
- 在Pine Script中,
orderflow[1]代表上一根K线的orderflow值,第一根K线时orderflow[1]为na(空值)。 - 这段代码的逻辑是:如果上一根K线没有状态(即第一根K线),则设置为
Orderflow.UNKNOWN;否则直接继承上一根K线的状态。 - 这样每根新K线计算时,
orderflow会自动保留前一根的状态,无需手动重置。你只需要在满足状态切换条件时修改orderflow的值即可,初始的UNKNOWN状态也只会在第一根K线生效。
修改后的完整代码示例
enum Orderflow IN_BULLISH_ZONE = "In Bullish Zone" IN_BEARISH_ZONE = "In Bearish Zone" FORMING_BEARISH_ZONE = "Forming Bearish Zone" FORMING_BULLISH_ZONE = "Forming Bullish Zone" BULLISH_TREND = "Bullish Trend" BEARISH_TREND = "Bearish Trend" UNKNOWN = "Unknown" // 自动继承前一根K线状态,第一根K线默认UNKNOWN series Orderflow orderflow = na(orderflow[1]) ? Orderflow.UNKNOWN : orderflow[1] // 初始阶段从UNKNOWN切换趋势状态 if(orderflow == Orderflow.UNKNOWN and newLowReached) info("Orderflow switched from unknown to bearish trend") orderflow := Orderflow.BEARISH_TREND if(orderflow == Orderflow.UNKNOWN and newHighReached) info("Orderflow switched from unknown to bullish trend") orderflow := Orderflow.BULLISH_TREND // 从下跌趋势切换至形成看跌区间 if(orderflow == Orderflow.BEARISH_TREND and low > low[1]) info("Orderflow switched from bearish trend to forming bearish zone") orderflow := Orderflow.FORMING_BEARISH_ZONE // 从上涨趋势切换至形成看涨区间 if(orderflow == Orderflow.BULLISH_TREND and high < high[1]) info("Orderflow switched from bullish trend to forming bullish zone") orderflow := Orderflow.FORMING_BULLISH_ZONE
这样就可以完全去掉手动重置状态的代码,同时保留初始的UNKNOWN默认值。
内容的提问来源于stack exchange,提问作者Adam A
相关产品推荐
相关产品推荐

