本帖最后由 cheetor 于 2025-3-9 15:54 编辑
优化后代码
- function RecentLike()
- begin
- min_diff := Infinity; // 初始化为无穷大
- find_pos := -1; // 未找到时返回-1
-
- // 从当前K线向前遍历到第2根K线(确保i-1有效)
- if (BarPos >= 1) then
- begin
- for i = BarPos downto 1 do // 索引从0开始时调整为 downto 0
- begin
- // 涨停判断:当日收盘价 >= 前一日收盘价 * 1.096
- is_up_limit := (C[i] >= C[i-1] * 1.096);
-
- if (is_up_limit) then
- begin
- // 计算当前收盘价与涨停K线收盘价的绝对差值
- current_diff := Abs(C[BarPos] - C[i]);
-
- // 更新最小差值及位置
- if (current_diff < min_diff) then
- begin
- min_diff := current_diff;
- find_pos := i;
- end
- end
- end
- end
-
- return find_pos;
- end
- // 仅在最后一根K线调用以提升性能
- if (IsLastBar) then
- a:RecentLike();
复制代码
优化说明
1. 涨停判断逻辑优化- 原问题:原代码通过 C/C[i-1] >= 1.096 判断涨停,可能因浮点数精度问题导致误差(例如 1.0955 四舍五入后误判)。
- 改进:改用乘法避免除法精度问题:
- is_up_limit := (C[i] >= C[i-1] * 1.096);
复制代码
2. 索引边界处理- 原问题:未明确处理 BarPos < 2 时的越界风险。
- 改进:增加条件 if (BarPos >= 1),确保 i-1 有效(假设索引从0开始)。
3. 变量命名与初始化- 原问题:minprice 和 findpos 的命名易混淆(实际记录的是差值而非价格)。
- 改进:
- min_diff:更清晰表示最小差值。
- Infinity 初始化:避免硬编码 99999999,适配极端值场景。
4. 性能优化- 限制调用频率:通过 IsLastBar 仅在最后一根K线计算,避免历史K线重复遍历。
- 短路逻辑(可选) :若允许近似值,可设定阈值(如 min_diff < 0.01)时提前终止循环,但需权衡准确性。
边界案例测试[td]场景 | 数据示例 | 预期输出 | 无涨停历史 | 全部K线涨幅<10% | -1 | 多个涨停且差值相同 | 涨停价分别为10, 20, 当前价15 | 最近的位置(i最大) | 首个K线为涨停 | 索引0的K线涨停(需平台支持i=0) | 0 |
应用场景量化策略:
- 寻找近期涨停后回调到特定价位的股票,作为买入信号。
- 示例:if RecentLike() != -1 and C < C[RecentLike()] then Buy;
技术分析:
- 结合成交量分析涨停有效性(如放量涨停后缩量回调)。
风险控制:
高级优化思路(如需高频计算)
通过上述优化,函数在准确性、鲁棒性和代码可读性上均有提升,同时平衡了性能需求
|