别再为每个柜台重写下单层:StockSharp 把 CTP、QMT 与全球交易所收成统一 Connector

说明:微信源页触发「环境异常 / 验证码」,无法直读原文。本文按题意(开源量化平台 StockSharp 统一交易接口),并基于官方仓库
StockSharp/StockSharp中英文 README、StockSharp/Connectors(含 CTP / QMT 适配器说明)以及 官方文档 Connectors 章节 做工程向改写;版本口径以撰写时公开文档为准。本篇只讨论合法、自有账户下的行情订阅与下单编排,不涉及任何绕过风控、违规刷单或未授权接入。
做量化的人,痛点很少是「策略公式写不出来」,更多是:每个柜台、每家券商、每家交易所的协议都不一样。CTP 要自己扛前置地址、认证码、结算确认;MiniQMT / QMT 是另一套会话与委托字段;币安、OKX、IB 又是 REST + WebSocket 拼盘。策略层本来只想关心「订阅 K 线 → 算信号 → 下单 → 看成交」,结果 70% 的时间耗在适配层。
StockSharp(简称 S#)把这件事产品化了:用一套 C# API + MessageAdapter 连接器模型,把券商差异压到适配器里,策略与终端只面对统一的 Connector / 订阅 / 订单对象。连接器源码已拆到独立仓库 StockSharp/Connectors,核心平台与 Designer / Hydra / Terminal / Shell 仍在主仓。对国内期货 CTP、以及近年补上的 QMT,都能按同一套订阅与下单语义接入。
一、它解决什么:策略层只认 Connector,柜台差异下沉到 Adapter

官方文档的关键句可以翻译成工程语言:
| 概念 | 作用 | 你平时该碰哪一层 |
|---|---|---|
Connector |
多连接聚合门面:订阅、下单、持仓、事件回调 | 策略与业务代码主要写这里 |
MessageAdapter |
把某家柜台协议翻译成 StockSharp 消息模型 | 选现成连接器,或自己实现适配器 |
Subscription / DataType |
描述「订什么数据」(K 线、Tick、盘口…) | 与具体柜台字段解耦 |
Order / 异步 RegisterOrderAsync |
统一委托对象与异步注册 | 策略信号出口 |
一个 Connector 上可以挂任意多个适配器,因此同一进程里可以同时连期货 CTP、股票 QMT、加密货币交易所——这正是源标题里「交易接口不用一条条自己啃」的工程含义:不是少接几家,而是少写几套领域模型。


二、产品地图:API、Designer、Hydra、Terminal、Shell 怎么分工
StockSharp 不是「只有一个 NuGet」。官方按场景拆了几块(均以公开 README 为准):
1. API:给 Visual Studio / .NET 开发者的免费 C# 库,从中低频到 HFT(DMA)都可以写。
2. Designer:可视化策略设计器 + 内置 C# 编辑器、指标与调试器,可连多交易所。
3. Hydra:行情自动下载与高压缩存储,支持多源、计划任务、实例间同步,以及导出 CSV / Excel / XML / DB。
4. Terminal:交易图表终端,支持多连接、图表点选下单、多种 K 线类型与成交量分布。
5. Shell:开源图形脚手架,可直接改 UI,跑回测统计、并行策略与定时启动。
对「只想写策略、不想养 UI」的人,API + Connector 就够;若还要可视化编排或批量落盘历史数据,再叠 Designer / Hydra。连接器名单极长:README 列出了 Binance、OKX、IB、CTP、QMT / MiniQMT(XtQuant)、FIX/FAST、大量 DEX / 数据商等——完整表以主仓 README 与 Connectors 仓目录为准,本文不逐条抄录以免过时。
三、最小可运行路径:订阅 1 分钟 K 线并按阴阳线反向下单
下面这段来自主仓中文 README 的官方示例(符号与类型名以公开文档为准;实盘前请换成你自己有权限的合约与账户,并先在仿真环境验证):
var connector = new Connector();
var security = connector.LookupById("AAPL@NASDAQ");
var subscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(1)),
security);
connector.CandleReceived += (sub, candle) =>
{
if (sub != subscription || candle.State != CandleStates.Finished)
return;
// 阳线买、阴线卖——仅作 API 形态演示,不是可上线的策略
var isGreen = candle.ClosePrice > candle.OpenPrice;
var order = new Order
{
Security = security,
Type = OrderTypes.Market,
Side = isGreen ? Sides.Buy : Sides.Sell,
Volume = 1
};
connector.RegisterOrder(order);
};
connector.Subscribe(subscription);
connector.Connect();
读这段时抓住三步即可:
1. 解析标的:LookupById("CODE@BOARD") 把业务符号映射到 Security。
2. 声明订阅:Subscription(DataType, Security),柜台差异不出现在策略分支里。
3. 事件驱动下单:等 CandleStates.Finished 再决策,避免用未收盘 K 线误触发。
文档还强调可用 AddAdapter<TAdapter>(...) 在代码里挂多个连接,例如:
connector.AddAdapter<BinanceMessageAdapter>(a =>
{
a.Key = "<Your API Key>";
a.Secret = "<Your Secret Key>";
});
// 可继续 AddAdapter<CtpMessageAdapter>(...) / QmtMessageAdapter 等
密钥只放本地配置或密钥库,不要写进仓库;示例里的占位符请原样保留。
四、国内柜台怎么接:CTP 与 QMT 适配器各自覆盖什么
Connectors 仓把柜台实现拆成独立项目。对国内读者最相关的两块:
1)CTP(上期技术)
公开 README / 源码注释表明,CTP 适配器面向国内期货公司常用的 Trader + Market Data 双前置:
- 覆盖品种:期货 / 期权(以券商开通权限为准:上期所、大商所、郑商所、中金所、能源中心、广期所等)。
- 行情:Level1、五档盘口、由成交量增量推导的 Tick。
- 交易:限价 / 市价 / IOC / FAK / FOK / 止损,以及开平、平今、平昨等指令语义。
- 账户:委托回报、成交、持仓、资金、保证金与手续费字段回传。
- 刻意不做:标准 CTP 本身不提供历史 K 线——适配器也不会谎称支持;历史行情请走 Hydra 或其他数据源。
工程上要注意:打包桥接与原生库版本(文档示例口径为 CTP 6.7.11)与券商要求的 SDK 不能混用头文件/运行库;生产前置、AppId / AuthCode、流文件目录、断线续传模式都是券商侧约束,本地 Connected 只代表链路通,最终接受/拒绝以柜台回报为准。
2)QMT(含 MiniQMT / XtQuant 路线)
2026-07 起 Connectors 仓合入了 QMT 连接器(含 Python Gateway + C# QmtMessageAdapter)。公开能力摘要:
- 覆盖:股票、期货、期权、债券、基金 / ETF、指数等(以 QMT 账户权限为准)。
- 行情:Level1、Tick、盘口、K 线;并支持历史数据请求(便于画图与回测喂数)。
- 交易与账户:委托工作流、组合 / 资金 / 持仓与执行状态更新。
- 设计目标与 CTP 相同:柜台协议细节藏在适配器后,上层仍是 StockSharp 标准 API。


五、实战建议:先仿真、再多连接、最后才谈 HFT
结合官方文档与连接器 README,落地时建议按这个顺序:
1. 先跑通单连接仿真:SimNow(CTP)或券商提供的 QMT 仿真;只验证订阅与下单事件闭环。
2. 把密钥与前置地址外置:Connector.Save() / Load() + IFileSystem(文档已标记无 IFileSystem 的序列化扩展为过时)。
3. 多连接时分适配器看状态:使用 ConnectedEx / ConnectionErrorEx 区分「哪一路断了」,避免整盘误判。
4. 订阅生命周期要订阅全:SubscriptionStarted → SubscriptionOnline → SubscriptionFailed / SubscriptionStopped。
5. 历史与实盘分流:CTP 实盘不指望原生历史 K;用 Hydra 或其他数据商喂回测,实盘只订阅实时流。
6. 异步下单优先:RegisterOrderAsync / CancelOrderAsync / EditOrderAsync,减少 UI 或策略线程被同步调用卡住。
7. 合规边界:仅使用你有权访问的账户与数据;量化系统的风控、报备、交易权限以券商与监管要求为准——框架帮你统一 API,不帮你越过合规。
排坑速记:适配器「支持某消息类型」≠ 你的账户一定有该权限;
SubscriptionFailed的第三个参数isSubscribe能区分订阅失败还是退订失败,排障时别混为一谈。
六、和「自己撸 SDK」比,StockSharp 值不值得上
| 维度 | 自研多柜台 SDK | StockSharp Connector 模型 |
|---|---|---|
| 领域对象 | 每家一套 Order/Tick 结构 | 统一 Order / Security / Subscription |
| 多市场 | 策略里写大量 if (venue) |
多 Adapter 挂同一 Connector |
| 可视化与落盘 | 自己做图表与存储 | Designer / Terminal / Hydra 可选叠加 |
| 学习曲线 | 单柜台起步快 | 需熟悉消息模型与订阅生命周期 |
| 定制柜台 | 完全自控 | 可按文档实现自有 MessageAdapter |
| 风险 | 协议细节全自己背 | 仍要理解柜台约束;框架不是风控替身 |
如果你已经绑定单一柜台、策略极简,自研 SDK 可能更轻。一旦出现「期货 + 股票 + 数字货币」或「同一策略要在仿真 / 实盘 / 多券商之间迁移」,统一 Connector 的收益会陡增——这也是源文强调「省事」的真实工程背景。
七、小结
StockSharp 的核心交付不是又一个行情 GUI,而是:把全球(含国内 CTP / QMT)交易与行情差异收敛到 MessageAdapter,让策略只与 Connector 对话。主仓提供 API 与配套应用,Connectors 仓持续增加柜台实现;你要做的是选对适配器、外置密钥、先仿真再实盘,并把订阅 / 下单事件当成一等公民来设计。
相关链接:
- 主仓:https://github.com/StockSharp/StockSharp
- 连接器仓:https://github.com/StockSharp/Connectors
- 中文站:https://stocksharp.com/zh
- API 文档(Connectors):https://github.com/StockSharp/doc/blob/main/en/topics/api/connectors.md
本文为技术学习笔记,不构成任何投资建议;交易有风险,接入前请仔细阅读券商协议与官方文档。
💻 配套实训环境与动手练习
本文涉及的相关技术指令、开发环境与工具链已内置在边学边练在线实验室中,无需繁琐安装配置,随时在浏览器中实践体验: