FennEdge Learn · 编程

DAS Trader Advanced Hotkey Script Course

读懂代码,检查状态,验证结果。 从语言与数据结构,到订单对象、事件工作流和完整项目,系统学习 Advanced Script 编程。

按约 1046 分钟安排,已包含阅读、算例和每课练习;实际用时因人而异。

36节课程≈1046预计分钟—登录后保存进度
20
第 20/36 课 · 约 30 分钟

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 才跨过执行边界。找不到名字时的返回值没有确证,不能把空值判断写成通用保证。两个脚本共用一个变量时,大小写不同也不能避免覆盖;用一致的命名与输入输出约定解决依赖。