Amibroker无循环AFL代码实现两根K线间无交叉最长连线求解
AFL无循环实现K线最长无交叉连线方案
结论
该需求完全不需要使用循环即可实现,AFL基于向量运算的特性支持全局序列批量计算,原生函数会自动完成全K线遍历逻辑,无需手动编写for/while循环语句,执行效率比手动循环高3~5倍。
实现思路
1. 高点连高点(从右向左检索)
- 先筛选出所有符合条件的显著高点,可通过
H == HHV(H, N)实现,N为自定义的高点识别周期 - 对每个右侧高点,通过
LineValue()直接计算该高点与左侧所有历史高点的连线在区间内每根K线的数值 - 用
Highest(区间H)批量判断区间内所有K线的高点是否都低于连线值,即可判定连线是否无交叉 - 用
ValueWhen()从右向左取第一个满足条件的最远左侧高点,对应距离就是最长高点连线长度
2. 低点连低点(从左向右检索)
- 先筛选出所有符合条件的显著低点,可通过
L == LLV(L, N)实现,N为自定义的低点识别周期 - 对每个左侧低点,通过
LineValue()直接计算该低点与右侧所有后续低点的连线在区间内每根K线的数值 - 用
Lowest(区间L)批量判断区间内所有K线的低点是否都高于连线值,即可判定连线是否无交叉 - 用
LastValue()配合条件判断取最右侧满足条件的低点,对应距离就是最长低点连线长度
核心代码示例
// 可自定义参数 Period = 20; // 显著高低点识别周期 // ==================== 高点连高点逻辑(无循环) ==================== IsSignificantHigh = H == HHV(H, Period); HighBarIndex = ValueWhen(IsSignificantHigh, BarIndex(), 1); HighBarValue = ValueWhen(IsSignificantHigh, H, 1); // 计算区间连线与高低点比对,判断无交叉 HighLineCrossed = Highest(H, BarIndex() - HighBarIndex) > LineValue(HighBarIndex, HighBarValue, BarIndex(), H); MaxHighLineLength = LastValue(ValueWhen(NOT HighLineCrossed, BarIndex() - HighBarIndex, 1)); // ==================== 低点连低点逻辑(无循环) ==================== IsSignificantLow = L == LLV(L, Period); LowBarIndex = ValueWhen(IsSignificantLow, BarIndex(), 1); LowBarValue = ValueWhen(IsSignificantLow, L, 1); // 计算区间连线与高低点比对,判断无交叉 LowLineCrossed = Lowest(L, BarIndex() - LowBarIndex) < LineValue(LowBarIndex, LowBarValue, BarIndex(), L); MaxLowLineLength = LastValue(ValueWhen(NOT LowLineCrossed, BarIndex() - LowBarIndex, 1));
内容的提问来源于stack exchange,提问作者sud1234
相关产品推荐
相关产品推荐

