信号已经出现,为什么还不能直接下单?

执行入门:委托状态与信号衔接

约 12 分钟4 道小题

学完你能说清楚把交易意图变成可追踪、可对账、不会重复下单的执行流程。

01学完这一课,你能做到什么

本课讲执行系统的原理。网站不提供实盘入口,也不构成交易建议。任何真实交易都必须在具备相应权限的环境中,经过独立的风控、模拟和人工确认。

学完这一课,你应该能:

  1. 画出从行情、信号、风控到委托、成交和对账的执行链路;
  2. 区分订单已受理、部分成交、全部成交、撤单和拒绝等状态;
  3. 设计轮询、回调、重连查询和唯一请求标识,降低重复下单风险;
  4. 让日线信号以不发单模式接入执行器,并明确哪些环节还没有验证。

执行系统不是“把买入函数调用一次”。它要回答:这笔交易为什么产生、是否允许执行、委托到了哪一步、实际成交了多少,以及程序重启后能不能接着对账。

一句话记住信号是意图,成交才是结果。

02先把研究、信号和执行分开

以 XtQuant 为例,可以把系统拆成两个接口方向:

  • xtdata 负责在权限范围内获取行情;
  • xttrader 负责连接交易服务、委托、撤单、查询和接收回报。

这两个模块通过本地客户端和相应服务协作,但本地连接不等于拥有全部数据、无限调用次数或交易权限。历史覆盖、财务字段、订阅数量和频率限制,都要按券商和服务版本核对。

更重要的是分层:

  1. 研究层:用历史数据验证规则;
  2. 信号层:根据当时真正可见的数据产生交易意图;
  3. 执行层:检查账户和风控,提交委托,追踪状态并对账。

这样做的价值是,策略换了,不必重写连接;连接换了,也不应悄悄改变策略逻辑。

从信号到成交的三层结构
  1. 1研究层历史数据与回测
  2. 2信号层形成交易意图
  3. 3风控层检查是否允许
  4. 4执行层委托、回报、对账

一句话记住研究、信号、执行要能单独检查。

03第一步永远是只读连接

连接前先确认客户端是否人工登录成功,交易功能是否启用,数据目录、账户标识、会话 ID 和运行环境是否匹配。userdata_mini 等路径只是配置线索,不能把示例路径当成自己机器上的真实路径。

一个安全的顺序是:创建连接对象,启动并连接,订阅账户,依次查询资产、持仓、委托和成交,最后停止连接。每一步都记录返回结果;连接成功不代表订阅成功,订阅成功也不代表有委托权限。

只读核对至少包含总资产、可用现金、冻结资金、持仓、总量、可卖数量、成本或参考价,以及当日委托和成交。会话 ID 如 100002、100003 只是区分连接实例的示例值,不是资金账户或密码;多进程运行时要避免冲突。

遇到失败时,先检查人工登录、目录、账户权限、SDK 环境、订阅结果和日志,再判断原因。周末或非交易时段可能影响部分链路,但不能把每次失败都归因于非交易日;遇到“资金为 0 却能看到持仓”这类异常,先如实记录,再逐项排查原因。账户和密钥放在安全配置中,不能写进共享日志。

只读验收顺序
  1. 1客户端登录人工确认
  2. 2连接服务检查返回
  3. 3订阅账户记录权限
  4. 4查询账户资产、持仓、委托、成交
  5. 5停止连接保存日志

一句话记住先验证能读到什么,再谈能不能下单。

04委托参数:意图还要经过约束

一次委托至少要表达账户、证券代码、买卖方向、数量和价格类型;限价单还要提供价格。限价是价格边界,可能不成交;市价或特定最优价更强调成交,但可能有价格偏离、保护参数和市场限制。不要把某个示例里的数字常量直接当成通用接口定义,应以当前 SDK 的明确常量和标的市场规则为准。

数量要同时通过几道检查:交易单位、最小申报量、买卖差异、可用现金、冻结资金、手续费、最大和可卖数量。不能假设所有产品都必须是 100 股整数倍。价格也要符合最小价位单位和可接受区间。

把交易意图写成一条可审阅记录,例如:策略请求 ID、账户、标的、方向、目标数量、价格类型、限价、有效时间、风控结果。这样后面收到 时,仍然知道它对应哪一次决策。

委托前的三道闸门
身份

是哪笔意图

账户、策略请求 ID、标的和方向。

数量

最多能下多少

资金、单位、可卖数量和仓位上限。

价格

什么条件成交

限价、市价、价位单位和保护规则。

一句话记住下单参数先过账户、数量、价格三道检查。

05订单 ID 不等于成交

提交后返回订单 ID,只说明请求拿到了某种受理标识。它不能直接增加持仓。订单还可能经历已报、部分成交、全部成交、撤单处理中、已撤、拒绝等状态。状态数字如 50、54、56、57 可能随 SDK 版本有不同映射,必须查当前定义,不能依赖魔法数字。

部分成交时,已经成交的数量不会因为撤单消失;撤单只能针对剩余未成交部分。撤单请求被受理,也不等于最终已撤,因为成交和撤单可能同时发生。最终结果要结合成交回报、和账户查询对账。

批量撤单也要限定范围,例如只处理本策略、当前账户、指定日期和指定标的的活动订单,不能无差别取消其他手工或策略订单。

委托状态的关键分叉
  1. 1提交取得请求标识
  2. 2已报等待市场撮合
  3. 3部分成交只撤剩余量
  4. 4全部成交更新持仓
  5. 5拒绝或已撤记录原因并对账

一句话记住订单被受理,不代表订单已成交。

06轮询和回调要互相补位

轮询是程序按固定间隔主动查询;回调是状态变化时由 SDK 通知程序。回调可以覆盖订单变化、成交、下单错误、撤单错误、断连和异步响应等事件,但具体接口和字段要以当前版本为准。

每条事件至少记录账户、订单 ID、策略请求 ID、方向、状态、成交数量、成交价格、时间和错误码。方向要显式识别买、卖和未知类型,不能把某个数字以外的所有情况都当成卖出。

回调可能重复、延迟,断连时还可能丢失。处理方式是:回调用于及时更新,轮询用于定期核对;重连后先查询活动订单和成交,再恢复新的委托。回调处理要短,日志要持久化,程序重启后仍能判断哪些请求已经提交。

一句话记住回调抢速度,轮询保完整。

07超时后先查结果,不要直接重发

提交后超时,可能是订单已经进入交易系统,只是响应没有回来。如果直接在 except 后重试,就可能产生两笔订单。

更稳妥的状态机是:

  1. 提交前生成唯一请求标识,并把意图写入持久化记录;
  2. 超时进入“结果未知”,暂停同一意图的重复提交;
  3. 按账户、标的、时间和可用标识查询委托与成交;
  4. 只有明确拒绝、原因已处理且规则允许时,才重新提交;
  5. 对账不一致时暂停新增委托,先人工或程序核对。

给执行器设置单标的未完成订单上限、单次和单日金额上限、冷却时间及异常暂停。可以封装一个类似 MiniQMTTrader 的自定义对象,把连接、买卖、取消、查询和回调日志统一起来,但它不是官方 SDK 类型。封装层要区分请求状态和成交状态,失败不能返回空列表来伪装“没有持仓”。默认使用只读或模拟模式,真实执行必须由独立配置明确打开。

网络超时的处理路径
  1. 1提交意图先持久化请求 ID
  2. 2响应超时结果未知
  3. 3查询委托与成交不要立刻重发
  4. 4明确拒绝核对原因
  5. 5允许时重试仍受限额约束

一句话记住未知结果先查询,拒绝重试也要有条件。

08把日线信号接到执行器

以 为例,常见参数是 12、26、9。判断金叉或死叉,要比较相邻两根已经完成的 bar:今天的快线从下方穿到上方,才是一次新信号;不能只判断快线当前高于慢线,然后每 60 秒重复买入。volume=150 的含义如果没有明确接口定义,就不能直接当成真实下单量。策略目标仓位和交易单位检查要分开。

日线策略可以每 60 秒查询一次,但这仍然是日线策略,不会自动变成 tick 策略。要提前写清楚:只使用完成 bar,还是允许盘中数据改变信号。历史数据和实时数据还要统一更新时间、方式和字段口径。

建议先做单次模式:取数据、计算信号、打印交易提案,不提交委托;再做循环模式:定时更新、检查新信号、查询账户和风险,最后生成待审阅委托。执行前还要写交易计划:跳空或价格偏离超过预设阈值时是否取消或重新评估,是否已有持仓,可卖数量是否足够,是否遇到交易时段、、停牌、 或过期数据。

这里的阈值只是系统参数示例,不是通用规则。更多数据频率也不自动更好。

不发单模式的信号链路
  1. 1完成 bar只用当时可见数据
  2. 2计算 MACD比较相邻 bar
  3. 3生成信号去重同一信号
  4. 4检查账户与风控资金、持仓、限额
  5. 5输出提案不提交真实委托

一句话记住先让信号可重复,再让执行可追踪。

09把 Agent 放在建议层,不放在强制风控层

Agent 可以整理账户信息、解释信号、生成交易提案和检查日志;但账户权限、仓位上限、资金检查、重复请求拦截和人工确认,必须由确定性的执行层强制执行,不能只靠提示词约束。

一个可审阅的提案至少包含:信号来源、数据时间、方向、目标数量、价格条件、已有持仓、风险检查结果、有效时间和失效条件。Agent 无情绪不等于系统安全,策略同向也可能造成拥挤,容量、和异常行情仍要测试。

一句话记住AI 可以提案,执行层必须硬拦截。

10动手任务:做一张执行状态表

按下面顺序完成一次不发单演练:

  1. 做只读账户查询,保存资产、持仓、委托和成交快照;
  2. 用模拟数据提交和撤单,记录每个状态变化;
  3. 注入重复回调、网络超时、部分成交、撤单失败、资金不足、可卖不足和旧数据;
  4. 写一个执行器封装,区分请求状态、成交状态和对账状态;
  5. 用 MACD 只生成信号,不提交真实委托。

验收时交付状态转换表、请求日志、对账结果和交易计划。若只有连接或查询被验证,就明确写“成交链路未验证”,不要把接口返回当成真实成交。

一句话记住验收看状态、日志和对账,不只看是否报错。

检验
检验一下

4 道小题

全部答对,这一课就算真正读懂了。答错了会告诉你为什么。

01提交返回订单 ID,最准确的理解是什么?
02订单部分成交后申请撤单,撤掉的是什么?
03提交请求超时后,第一步更稳妥的做法是什么?
04日线 MACD 每 60 秒循环检查时,怎样避免同一信号重复下单?
知识卡

这一课,浓缩成一张卡

学完可以保存或分享给朋友。保存成图片的功能会在下一版加上。

AI+金融投资训练营 · 执行入门:委托状态与信号衔接执行系统最重要的原则是什么?

把信号、风控、委托、成交和对账串成可追踪状态机,未知结果先查询而不是重发。

  • 订单 ID 不等于成交
  • 回调和轮询互补
  • 默认先不发单
quant.jtxaionline.com
这一课的要点

记住这 5 句话

  1. 01执行系统要分开研究、信号和执行,连接层变化不应悄悄改变策略逻辑。
  2. 02先做只读核对,再讨论委托;账户、数量、价格和权限都要检查。
  3. 03订单 ID 不等于成交,部分成交、撤单和拒绝必须通过状态与成交回报对账。
  4. 04回调负责及时通知,轮询和重连查询负责补齐丢失或重复的事件。
  5. 05超时先查结果,日线信号要用完成 bar 去重;Agent 可提案,确定性执行层负责拦截。
完成这一课

完成这一课

读完讲义、答对小题,这一课就算学完了。

  • 读完讲义
  • 通过随堂自测

实验数据AI+金融投资训练营教学样本。固定教学样本

固定教学样本只用于解释量化研究方法,不代表任何真实标的未来表现,也不构成投资建议。