Pinescript如何实现回溯期内满足条件2时重置条件1的计数功能
PineScript 计数器重置逻辑实现方案
核心修改思路
你需要在遍历回溯周期统计is_condition_1次数时,按时间先后顺序判断是否遇到is_condition_2触发点,一旦遇到就重置计数器,仅统计该节点之后的is_condition_1触发次数。
修改后的完整代码(兼容原有循环写法)
cnt = 0 is_condition_1 = false is_condition_2 = false if timeframe.isdaily is_DD_down_bar = change(close) < close[1] * -0.002 ? true : false is_DD_volume_up = change(volumeData) > 0 ? true : false is_condition_1 := is_DD_down_bar and is_DD_volume_up ? true : false is_condition_2 := crossover(close,ema(close,21))? true : false // 调整遍历方向:从回溯周期最远端往当前K线遍历,符合时间先后顺序 for i = lookbackPeriod to 0 by -1 // 遇到condition2触发直接清零计数器 if is_condition_2[i] cnt := 0 // 统计condition1触发次数 if is_condition_1[i] cnt := cnt + 1
改动说明
- 调整了
for循环的遍历方向:从回溯周期最远端(i=lookbackPeriod)往当前K线(i=0)遍历,匹配时间先后逻辑 - 每次遍历优先判断是否触发
is_condition_2,触发则直接重置计数,再叠加is_condition_1的统计 - 最终得到的
cnt值就是最近一次is_condition_2触发后,回溯周期内的is_condition_1总触发次数,完全匹配你给出的示例场景预期结果
可选优化方案(无需循环,性能更高)
如果不需要严格限制最多统计32根回溯周期内的次数,仅需要统计最近一次is_condition_2触发之后的所有is_condition_1次数,可以用逐K线累计的写法,代码更简洁运行效率更高:
is_condition_1 = false is_condition_2 = false var cnt = 0 if timeframe.isdaily is_DD_down_bar = change(close) < close[1] * -0.002 ? true : false is_DD_volume_up = change(volumeData) > 0 ? true : false is_condition_1 := is_DD_down_bar and is_DD_volume_up ? true : false is_condition_2 := crossover(close,ema(close,21))? true : false // 触发condition2直接清零 if is_condition_2 cnt := 0 // 触发condition1累计计数 if is_condition_1 cnt := cnt + 1
如果需要限制最多统计32根周期内的次数,仅需额外加判断:当cnt累计对应的K线跨度超过32时停止计数即可。
内容的提问来源于stack exchange,提问作者Bierbaron1920
相关产品推荐
相关产品推荐

