DAS 脚本事件、Exec 与脚本复用
读懂事件入口,用 GetHotkeyScript、Exec 与 ExecHotkey 组织脚本。
不只有按键入口
2025 年 6 月版手册描述了每秒执行的 Timer Event、Chart Update Script、提醒触发脚本与 Desktop Load Script。这些入口的上下文不同,不能自动当作可靠的券商成交回调。
| 入口 | 教学用途 | 要验证的条件 |
|---|---|---|
| 手动热键 | 检查一个命名对象 | 当前目标与账户 |
| 图表更新 | 刷新展示计算 | 正确图表和指标 |
| Timer Event | 周期观察一个值 | 启用状态与停止行为 |
| 桌面加载 | 初始化练习变量 | 命名窗口已恢复 |
| 提醒脚本 | 响应配置条件 | 重复触发与上下文 |
复用意味着依赖,不意味着隔离
ExecHotkey(...) 会执行热键文件中的命名热键。调用前检查被调用脚本的内容和全局变量。看起来无害的调用方,可能间接启动带交易或外部进程副作用的脚本。
一个可用的设计是:准备 → 检查 → 明确启用 → 请求 → 核对 → 重置。这些是自行设计的流程状态,不是 DAS 内置函数名。准备状态绑定账户、股票和输入,其中任何一个变化都使它失效。
做一份明确依赖的复用练习
在热键编辑器里,把辅助脚本命名为 FE_PracticeMessage,正文只保留下面一行。Advanced Script · 仅显示信息。
MsgBox("Practice helper");
再建立调用方。Advanced Script · 调用已检查的辅助热键。 前提是该名称确实对应上面的正文;调用方的作用随着辅助脚本修改而变化。
ExecHotkey("FE_PracticeMessage");
动手练习:观察并停用
定时器只负责从命名行情对象刷新练习变量,与「窗口、对象与执行上下文」的一次性读取比较。记录更新时间、如何停止、断线和重连后发生什么。完成后停用定时器。测试复用时,先让辅助热键只包含 MsgBox("Practice helper");。
Exec、GetHotkeyScript 与 ExecHotkey 各做什么
| 接口 | 输入 | 作用 |
|---|---|---|
GetHotkeyScript("name") |
热键名称 | 取得该热键的脚本文本 |
Exec(script) |
脚本文本或保存文本的变量 | 解释并执行文本 |
ExecHotkey("name") |
热键名称 | 执行热键文件中对应的脚本 |
准确拼写是 GetHotkeyScript,不是 GetHokeyScript。取得文本不会自动执行;热键名称也不等于脚本文本。辅助热键可以只命名而不绑定实体按键,供其他脚本调用。
先读取,再执行同一份文本
保持上面的 FE_PracticeMessage 正文只有那一行消息。Advanced Script · 只读取并显示辅助脚本文本。
$feHelperText = GetHotkeyScript("FE_PracticeMessage");
MsgBox($feHelperText);
预期看到的是 MsgBox("Practice helper"); 这段代码本身。没有对应热键、名称重复或文件未加载时的返回行为,本课程没有实测;先在编辑器确认依赖存在,不把未知返回值直接传给 Exec。
关闭文本预览后,核对 $feHelperText 没有被其他脚本覆盖。Advanced Script · 执行刚检查过的消息正文。 依赖前一个片段已成功取得文本。
Exec($feHelperText);
这次应显示 Practice helper,而不是代码。修改编辑器中的辅助热键,不会自动重写已经取到的文本变量;要重新调用 GetHotkeyScript,并再次检查。不要让“我刚刚看过某个热键”和“实际执行的是哪份正文”脱节。
确认命名辅助热键的当前内容后,也可以组合两步。Advanced Script · 读取并立即执行已审查的消息辅助热键。
Exec(GetHotkeyScript("FE_PracticeMessage"));
与 ExecHotkey("FE_PracticeMessage"); 一样,这仍是执行入口,不是只读检查。每次调用前都需要知道当前辅助正文的作用。
字符串里的引号怎么写
Advanced Script · 执行固定的消息脚本。 外层字符串内的双引号用反斜杠转义;复制时保留 ASCII 引号和反斜杠。
Exec("MsgBox(\"Practice helper\");");
外层 Exec 接收的实际文本是 MsgBox("Practice helper");。如果漏掉转义,内部引号可能提前结束外层字符串,解析的就不再是预期正文。
文档还记录 Exec(script1, script2, ...) 和 ExecHotkey(name1, name2, ...)。多个片段可以依次组织,但不代表事务:某段已经造成的外部动作不会因为后续出错而自动撤销。复用也不是带局部变量隔离的自定义函数调用。
动手练习:分辨名称、文本和结果
按顺序执行“显示文本”“执行已保存文本”“按名称执行”。在纸上先写下每一步应该看到的内容,再到客户端核对。修改辅助消息后,比较旧变量中的文本与重新获取的文本。最后检查调用链没有回到自身,避免 A 调 B、B 又调 A。
不要把未经检查的输入、粘贴文本或外部内容直接交给 Exec;文本中的订单、Locate 或外部动作都会成为真实的执行内容。下一课将把同样的区别应用到 Alert 的触发脚本。
模块调用不是参数化函数声明
ExecHotkey 按名称执行已保存脚本;它不是你声明的带局部变量函数。调用前检查完整依赖,调用后检查明确输出。GetHotkeyScript 只拿文本,文本被 Exec 使用时才执行;把用户输入拼进脚本会把“数据”升级为“代码”。
可复用脚本应写清楚:调用前必须存在什么、每次先清掉哪些旧结果、成功后设置什么、失败时消费者怎样识别。不要依赖上一轮留下的 $feResult。实际完整计算模块见 脚本模块与调用协议。
回调需要单独的生命周期
先保存原回调,再安装只显示消息的最小回调;观察一次触发是否对应一次执行;移除回调后确认执行停止。添加 Timer 后不要继续用需要点击的弹窗记录每个 tick,官方也对 Timer 中阻塞式交互有说明。
练习解答
取得热键源码后展示它,没有执行其中动作;Exec 才跨过执行边界。找不到名字时的返回值没有确证,不能把空值判断写成通用保证。两个脚本共用一个变量时,大小写不同也不能避免覆盖;用一致的命名与输入输出约定解决依赖。