如何着手编写图表中5个higher highs与higher lows的形态检测代码?
图表形态检测实现思路指导
一、先搞定杂波过滤,精准定位有效高低点
- 窗口过滤法:遍历价格数据,给每个点设置一个N根K线的观察窗口(比如5-10根,根据品种波动调整),只有当某个点是窗口内的绝对最高/最低点时,才标记为有效高低点,直接过滤掉小幅波动产生的杂点。
- 波动阈值过滤:设定一个百分比阈值(比如0.5%),新的高点必须比上一个有效高点涨幅超过这个阈值,才算“有效抬高”;低点同理,需比上一个有效低点涨幅(因为是逐步抬高的低点)超过阈值,避免把微幅震荡误判为形态组成部分。
二、构建连续抬高的高低点序列
- 维护两个列表:
valid_highs(存筛选后的有效高点)、valid_lows(存筛选后的有效低点)。 - 遍历筛选后的点,逐个验证序列连续性:
- 高点:如果当前高点 >
valid_highs最后一个元素,就加入列表;否则清空当前连续序列,重新计数。 - 低点:当前低点 >
valid_lows最后一个元素,加入列表;否则重置序列。 - 必须保证高低点序列同步:比如当
valid_highs有5个元素时,valid_lows也得有5个,才算完整形态的基础。
- 高点:如果当前高点 >
三、用滑动窗口检测重叠形态
当有效高点序列长度≥5时,用滑动窗口遍历:
- 比如序列是
H1<H2<H3<H4<H5<H6<H7,那么窗口从索引0开始,取H1-H5作为第一个形态;窗口后移到索引2,取H3-H7作为第二个重叠形态(完全符合你说的7个高点生成两个重叠形态的需求)。 - 每取一个窗口的高点,同步检查对应索引的低点窗口是否也是连续抬高的,两者都满足才算有效形态。
四、核心逻辑伪代码示例
# 假设已完成预处理,得到有效高低点列表 valid_highs = [h1, h2, h3, h4, h5, h6, h7] valid_lows = [l1, l2, l3, l4, l5, l6, l7] detected_patterns = [] # 滑动窗口遍历,步长可根据需求调整(这里步长2实现7个高点出两个重叠形态) for i in range(0, len(valid_highs) - 4, 2): window_highs = valid_highs[i:i+5] window_lows = valid_lows[i:i+5] # 验证是否连续抬高 is_valid_highs = all(window_highs[j] < window_highs[j+1] for j in range(4)) is_valid_lows = all(window_lows[j] < window_lows[j+1] for j in range(4)) if is_valid_highs and is_valid_lows: detected_patterns.append({ 'start_pos': i+1, 'end_pos': i+5, 'high_points': window_highs, 'low_points': window_lows }) # 输出检测结果 for idx, pattern in enumerate(detected_patterns): print(f"形态{idx+1}:第{pattern['start_pos']}至{pattern['end_pos']}个有效高低点")
五、实操注意事项
- 过滤参数(窗口大小、波动阈值)必须结合你的交易品种和时间周期调优,拿历史数据回测几次,找到最适合的数值。
- 遇到高低点不同步的情况(比如高点连续抬,但低点中途回落),直接重置序列,别硬凑形态。
- 可以额外加形态确认规则,比如形态收尾时的成交量变化、后续的突破信号,提升形态的实战价值。
内容的提问来源于stack exchange,提问作者sey eeet
相关产品推荐
相关产品推荐

