易得程序化交易技术论坛

登录 | 注册

积分: 0 |用户组: 游客

搜索
查看: 2538|回复: 1

自定义函数实现通达信Last函数

[复制链接]

22

主题

65

帖子

1423

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1423
发表于 2022-9-10 12:37:46 | 显示全部楼层 |阅读模式
  1. function MyLast(X, A, B)
  2. begin
  3.     nBgn := BarPos - a;
  4.     nEnd := BarPos - b;
  5.     if (nEnd >= nBgn and nBgn >= 1 && nEnd >= 1) then
  6.     begin
  7.         bok := 1;
  8.         for i=nBgn to nEnd do
  9.         begin
  10.             if (X[i] < 1) then
  11.             begin
  12.                 bok := 0;
  13.                 break;
  14.             end
  15.         end
  16.         return bok;
  17.     end
  18.     return 0;
  19. end

  20. A:MyLast(C>O, 10, 5);
复制代码
回复

使用道具 举报

8

主题

37

帖子

1586

积分

金牌会员

Rank: 6Rank: 6

积分
1586
QQ
发表于 2025-3-9 15:33:46 | 显示全部楼层
本帖最后由 cheetor 于 2025-3-9 15:55 编辑

一、原函数功能解析
1. 设计目标
函数 MyLast(X, A, B) 检查时间窗口内(从当前K线向前第 A 根到第 B 根)的所有 X 值是否满足 X ≥ 1。若全部满足,返回 1;否则返回 0。
应用场景:
  • 检测历史K线是否连续满足条件(如连续阳线、价格在均线上方等)。
  • 示例 MyLast(C>O, 10, 5):检查过去第10到第5根K线是否全为阳线。
2. 代码问题分析
  • 参数顺序矛盾:
    当 A > B 时(如 A=10, B=5),计算出的 nBgn = BarPos-A 可能小于 nEnd = BarPos-B,导致循环无法触发(例如 BarPos=20 时,nBgn=10, nEnd=15,实际检查的是第10到15根K线,与用户意图相反)。
  • 索引越界风险:
    未检查 nBgn 是否有效(如 BarPos < A 时 nBgn 为负数)。
  • 初始条件冗余:
    条件 nBgn >=1 && nEnd >=1 假设索引从1开始,若平台索引从0开始则逻辑错误。
  • 效率问题:
    每次调用均重新遍历窗口,高频场景性能差。

二、优化版本代码
  1. function MyLastOptimized(X, LookbackStart, LookbackEnd)
  2. begin
  3.     // --- 参数处理 ---
  4.     // 确保 LookbackStart <= LookbackEnd(如输入10,5则自动交换)
  5.     startPeriod := min(LookbackStart, LookbackEnd);
  6.     endPeriod := max(LookbackStart, LookbackEnd);
  7.    
  8.     // --- 计算窗口索引 ---
  9.     nBgn := BarPos - endPeriod;  // 更早的位置
  10.     nEnd := BarPos - startPeriod;  // 更近的位置
  11.    
  12.     // --- 边界检查 ---
  13.     // 若索引无效(如数据不足或越界),返回0
  14.     if (nBgn < 0) or (nEnd >= TotalBars) then
  15.         return 0;
  16.    
  17.     // --- 核心逻辑:检查窗口内所有X[i] >=1 ---
  18.     for i = nBgn to nEnd do
  19.     begin
  20.         if X[i] < 1 then
  21.             return 0;  // 发现不满足条件,立即终止
  22.     end
  23.    
  24.     return 1;  // 全部满足条件
  25. end
复制代码

调用示例:
  1. A:MyLastOptimized(C>O, 10, 5);  // 检查过去第10到第5根K线是否全为阳线
复制代码


三、关键优化点说明
1. 参数自动校正
  • 参数顺序:通过 min/max 自动处理 A 和 B 的输入顺序,确保 nBgn <= nEnd。
  • 命名清晰化:参数名改为 LookbackStart 和 LookbackEnd,明确表示“向前回溯的起点和终点”。
2. 索引安全性与平台兼容性
  • 索引计算:
    • nBgn = BarPos - endPeriod(更早的K线)
    • nEnd = BarPos - startPeriod(更近的K线)
      例如,输入 (10,5) 转换为 startPeriod=5, endPeriod=10,窗口为 BarPos-10 到 BarPos-5。
  • 边界检查:
    • nBgn < 0:窗口起点早于数据起点。
    • nEnd >= TotalBars:窗口终点超过最大K线数(需根据平台变量名调整)。

3. 性能优化
  • 短路逻辑:一旦发现 X < 1,立即返回 0,避免无效遍历。
  • 增量计算(进阶):
    若需高频调用,可缓存历史窗口状态,仅更新新进入和退出的数据点,将复杂度从 O(N) 降至 O(1)。

四、边界案例测试[td]
场景输入参数nBgn 和 nEnd预期输出
数据充足(BarPos=20)A=10, B=510 到 15依数据定
数据不足(BarPos=8)A=10, B=5-2 到 30
参数颠倒(A=5, B=10)A=5, B=10自动校正为10到5同第一行

五、应用场景扩展
  • 形态识别:
    检测“连续N日放量上涨”:MyLastOptimized(V > Ref(V,1) AND C>O, N, 1)。
  • 策略过滤:
    确保入场前市场处于稳定状态(如过去20日均无巨幅波动)。
  • 风控条件:
    若最近5根K线中有3根触发止损,暂停交易。
通过以上优化,函数在参数兼容性、执行效率和代码可读性上均得到显著提升



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|易得程序化 ( 粤ICP备2022064048号 )

GMT+8, 2025-4-28 16:41 , Processed in 0.053121 second(s), 19 queries .

快速回复 返回顶部 返回列表