You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pine Script实现n根K线内条件首次触发的无重绘判断函数

Pine Script 无重绘连续条件检测函数:问题排查与实现

原有代码异常根因

  • Pine Script 的for循环没有自动聚合返回值的机制,循环过程中每次迭代的判断结果不会自动成为函数输出,最终只会保留循环最后一次迭代的计算值——这就是标记只出现在第n根K线的核心原因,前面连续真序列的判断结果完全被后续迭代覆盖丢失。
  • 遍历方向逻辑错位:原有代码多是从当前K线(索引0)往历史K线(索引n)正向遍历,无法反向定位连续真序列的“假转真起点m”,自然没法把m到连续真序列末端的所有K线都纳入标记范围。
  • 边界安全校验缺失:直接引用cond[_i+1]判断假转真,当历史K线数量不足时会读到未定义的未来值,引入重绘风险;同时没有单独处理n=0的单K线触发场景,和需求逻辑不匹配。
  • 标记逻辑错位:原有代码把“假转真判断”只绑定在循环最后一个迭代值上,完全没实现“拐点落在检测区间内时,覆盖整个连续真序列标记”的要求。

符合需求的正确实现

所有实现均采用纯历史值引用,无未来函数依赖,从根源上避免重绘。

第一类:区间内连续真序列全标记函数

对应需求定义:

  1. 在指定n根历史K线区间内,定位首次由假转真的连续序列起点m
  2. 只要m落在检测区间内,m位置及后续所有连续为真的K线,全部返回true
  3. 特殊边界:n=0时,仅当当前K线cond为真、紧邻前一根K线cond为假时,返回true
// 入参:_n 检测的历史区间长度,_cond 待检测的目标条件
f_type1_markSeq(int _n, bool _cond) =>
    // 处理n=0的单K线边界场景
    if _n == 0
        _cond and not _cond[1]
    else
        bool _foundValidStart = false
        int _seqStartOffset = -1
        // 从历史检测区间的远端往当前端遍历,定位第一个假转真的序列起点
        for _offset = _n downto 1
            // 假转真判定:当前offset位置cond为真,下一根更早期的K线cond为假
            if _cond[_offset] and not _cond[_offset + 1]
                _foundValidStart := true
                _seqStartOffset := _offset
                break
        // 判断当前K线是否落在连续真序列的覆盖范围内
        bool _isInSeq = false
        if _foundValidStart
            bool _seqBroken = false
            // 从找到的序列起点,往当前K线方向校验cond是否连续为真
            for _checkPos = _seqStartOffset downto 0
                if not _cond[_checkPos]
                    _seqBroken := true
                    break
            _isInSeq := not _seqBroken
        _isInSeq

场景验证:给定K线序列bars: 76543210、对应cond序列00001110

  • n=4时,假转真起点在bars3位置(offset=3),落在0-4的检测区间内,连续真序列覆盖bars3、2、1,三个位置函数返回true,和需求示例一致
  • n=2时,假转真起点在bars3位置,超出0-2的检测区间,无有效序列,所有位置返回false,符合示例预期

第二类:连续真贯穿到当前K线校验函数

对应需求定义:

  1. 在指定n根历史K线区间内,cond从某位置m首次由假转真
  2. 从m位置开始cond连续保持为真,直到当前K线(bars0),此时函数返回true
// 入参:_n 检测的历史区间长度,_cond 待检测的目标条件
f_type2_checkHold(int _n, bool _cond) =>
    // 处理n=0的单K线边界场景
    if _n == 0
        _cond and not _cond[1]
    else
        // 当前K线cond为假,直接返回不成立
        if not _cond
            false
        else
            // 从当前K线往历史方向数,统计连续为真的K线长度
            int _consecutiveLen = 0
            for _offset = 0 to _n
                if _cond[_offset]
                    _consecutiveLen += 1
                else
                    break
            // 判定:连续真序列的断点位置落在检测区间内,即起点m属于检测范围
            bool _isValid = false
            if _consecutiveLen > 0
                // 连续真序列的假值断点在 _consecutiveLen +1 的offset位置
                int _breakOffset = _consecutiveLen + 1
                // 断点在检测区间范围内(即假转真的起点m = breakOffset -1,落在0~n区间内)
                if _breakOffset <= _n + 1
                    _isValid = true
            _isValid

场景验证:

  1. 给定cond序列00001110,当前K线cond值为0,函数直接返回false,和示例预期一致
  2. 给定cond序列00001111,当前K线cond为真,连续真长度为4;当n≤3时,断点位置在offset=4,落在检测区间覆盖范围外,即起点m在n的检测范围内,函数返回true,符合示例要求

内容的提问来源于stack exchange,提问作者saltyeggs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 15:54:01