综合项目:DAS 多股票观察记录器
组合集合、行情对象与校验逻辑,生成可检查的多股票记录。
项目规格
前置知识:集合、行情状态、自定义对象。为两个已加载行情的股票建立手动快照记录。每行包含股票、读取的 Bid/Ask、价差、脚本观察时间和有效性。它不评价机会,也不创建订单。记录器拥有独立集合,不覆盖 QuoteObj.data。
准备与输入契约
在练习布局中加载 MSFT、AAPL,先分别验证 GetQuoteObj,再遍历集合。代码检查正价格与大小关系,不使用虚构空对象语法处理根本不存在的对象。报价可以数值合理但已经过期,所以 valid 仅表示通过本项目的数值检查。
完整实现
$feSymbols = NewUserObj();
$feSymbols.Set(0, "MSFT");
$feSymbols.Set(1, "AAPL");
$feSymbolCount = 2;
$feNotebook = NewUserObj();
$feNotebook.schema = 1;
$feNotebook.count = $feSymbolCount;
$feNotebook.rows = NewUserObj();
$feNotebook.validCount = 0;
$feNotebook.complete = 0;
$feRowIndex = 0;
while ($feRowIndex < $feSymbolCount) {
$feSymbol = $feSymbols.Get($feRowIndex);
$feQuoteForRow = GetQuoteObj($feSymbol);
$feRow = NewUserObj();
$feRow.symbol = $feSymbol;
$feRow.second = GetSecond();
$feRow.bid = $feQuoteForRow.BID;
$feRow.ask = $feQuoteForRow.ASK;
$feRow.spread = 0;
$feRow.valid = 0;
if ($feRow.bid > 0) {
if ($feRow.ask >= $feRow.bid) {
$feRow.spread = $feRow.ask - $feRow.bid;
$feRow.valid = 1;
$feNotebook.validCount = $feNotebook.validCount + 1;
}
}
$feNotebook.rows.Set($feRowIndex, $feRow);
$feRowIndex = $feRowIndex + 1;
}
$feNotebook.complete = 1;
$feNotebook.ShowObject();
跟踪数据流
先创建配置,随后创建 complete=0 的记录集。每轮新建一行,避免故意让所有键复用同一个可变行对象。价格副本通过检查后才增加 validCount;数值无效的股票仍有记录行。循环结束才设 complete=1,它不代表全部行都有效。
验收检查
逐行与可见行情比较并记录时间,预期 count=2、complete=1,validCount 可以为 0、1、2。确认两个股票拥有独立行。改变一个配置股票后重新手动运行,新记录集不应残留旧行。它不是两个股票的原子快照,读取按顺序发生,可能跨过多个行情更新。
扩展练习与参考解答
增加只列出无效行的报告。参考解答:从 0 到 count-1 遍历 rows,检查 row.valid,仅在等于零时将股票追加到显示字符串,不修改原记录。改成周期观察前,按照 Timer 章节分离初始化和采样,增加启停控制,不能每次 tick 重建使用者配置。