本帖最后由 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;
 
 
 技术分析:  
- 结合成交量分析涨停有效性(如放量涨停后缩量回调)。
 
 
 风险控制:  
 
  高级优化思路(如需高频计算)
 通过上述优化,函数在准确性、鲁棒性和代码可读性上均有提升,同时平衡了性能需求  
 
 |