10 分钟打通 openctp 的 CTP 模拟交易:量化新手完整指南
10 分钟打通 openctp 的 CTP 模拟交易:量化新手完整指南
【免费下载链接】openctpopenctp提供CTP股票期权、中泰证券XTP、华鑫证券奇点TORA、东方证券OST、东方财富证券EMT、盈透证券TWS、易盛TAP、量投QDP等各通道的CTPAPI兼容接口,CTP程序可以无缝对接各股票柜台。openctp也提供了一套基于TTS交易系统的模拟环境,同样提供了CTPAPI兼容接口,不仅支持国内期货与期权全品种,也支持A股股票、基金、债券以及股票期权模拟交易,可以替代Simnow,为CTP量化交易开发者提供7x24可用的模拟环境。项目地址: https://gitcode.com/GitHub_Trending/op/openctp
SimNow 只在交易时段可用,申请模拟账号流程长,晚上改完的回调代码要等到第二天开盘才有地方跑——这三个问题几乎绊倒每一个量化新手。openctp 用一套自研的 TTS 柜台解决了它:7x24 全天候的 CTP 模拟交易环境,覆盖国内期货、期权全品种以及 A 股股票、基金、债券、股票期权,你写好的 CTP 回调代码一行不用改,换个前置地址和账号就能直接跑。
openctp 还是 SimNow:差异在哪
如果你正评估 openctp 能否作为 SimNow 替代,直接看这张对照表:
| 维度 | SimNow | openctp |
|---|---|---|
| 可用性 | 仅交易时段可用 | 7x24、仿真、vip 仿真三套环境,全天候可连 |
| 账号门槛 | 需申请 BrokerID、AppID、AuthCode | 无需经纪商号与认证信息,注册模拟账号即可 |
| 柜台覆盖 | 仅 SimNow 柜台 | 兼容 XTP、奇点、EMT、OST、TWS、QDP、FEMAS、TAP 等真实柜台 |
| 品种覆盖 | 期货与期权 | 国内期货、期权全品种,另加股票、基金、债券、股票期权 |
| 语言支持 | 以 C++ SDK 为主,其他语言自行封装 | Python、Java、Go、C、C#、Rust 六套官方接口 |
表格能这么填,是因为 openctp 把各家柜台统一翻译成了 CTPAPI 标准:同一份程序,换 dll/so 就能从 TTS 模拟切到 XTP、奇点等真实柜台,业务逻辑不用动。TTS 柜台本身采用与 CTP 相似的内存数据库 + 总线架构,委托回报、成交回报的推送流程和 CTP 柜台完全一致,所以接入它相当于"同一套接口、换个前置",而不是再学一套 API。
动手前:三套模拟环境与一个账号
openctp 提供了三套模拟环境,写代码之前先想清楚用哪一套:
7x24 环境:循环回放最近交易日行情,供开发调试
全天候循环回放最近一个交易日的行情,晚上写程序、调 bug 都合适。行情前置tcp://121.37.80.177:20004,交易前置tcp://121.37.80.177:20002,行情前置不需要账号。
仿真环境:交易时段与实盘一致,用于验证策略
交易前置tcp://121.37.90.193:20002,支持国内各证券、期货交易所股票、期货及期权全品种合约仿真交易,用来验证策略的实盘效果和培训演示。注意该环境不提供实盘行情推送,需要实盘行情时用官方 CTP dll 连接实盘柜台(无需账号)。
vip 仿真环境:对仿真效果要求更高的用户
功能与免费仿真环境相同,另外支持 etf 期权等品种和 CTP 股票期权 API 兼容接口,独立环境、带宽更高、可靠性更好,属于付费服务。
前置条件与 CTP 模拟账号规则
环境要求只有两条:Python 3.8 以上、网络可访问公网。模拟账号在 openctp 官网注册,所有账号统一管理,同一个微信号下的模拟号共享一个密码;密码被改过,用 MiniTrader 这类 CTP 客户端就能重置。
10 分钟连上行情前置
先执行pip install openctp-ctp安装 Python 接口,无需自己编译,然后跑最小行情程序:
from openctp_ctp import thostmduserapi as mdapi md = mdapi.CThostFtdcMdApi.CreateFtdcMdApi() class MdSpi(mdapi.CThostFtdcMdSpi): def OnFrontConnected(self): print("已连上 openctp 行情前置") md.ReqUserLogin(mdapi.CThostFtdcReqUserLoginField(), 0) # 行情登录不校验账号 md.RegisterFront("tcp://121.37.80.177:20004") md.RegisterSpi(MdSpi()) md.Init()行情前置不校验账号密码,OnFrontConnected回调里直接发ReqUserLogin即可。看到"已连上 openctp 行情前置",✅ 说明网络、接口、环境三件事全部就绪。顺带建立一个概念:CTP 是回调驱动的,Init()之后所有事件(断线、登录结果、行情推送)都从 Spi 回调里进来,代码本身没有"等待"状态。
第一次模拟成交的完整链路
交易链路分五步,缺一不可。
第 1 步:连接交易前置
仿照上面的例子创建CThostFtdcTraderApi,RegisterFront("tcp://121.37.80.177:20002")后调用Init()。少了这一步,后面所有请求都发不出去。
第 2 步:登录 openctp 模拟账号
在OnFrontConnected回调里发起ReqUserLogin。TTS 环境免 BrokerID、AppID、AuthCode,填模拟账号和密码就行。
第 3 步:未确认结算单就下不了单
⚠️ 登录成功后第一件事是调用ReqSettlementInfoConfirm,等成功回调回来再下单。跳过这一步,柜台会拒掉当天所有委托,这是新手最高频的坑——委托莫名被拒时,十有八九是它。
第 4 步:用关键字段下一笔限价单
req = tdapi.CThostFtdcInputOrderField() req.BrokerID = "" # openctp 不需要经纪商号 req.UserID = req.InvestorID = "你的模拟账号" req.ExchangeID = "SHFE" req.InstrumentID = "au2406" # 选回放时段内有成交的合约 req.Direction = tdapi.THOST_FTDC_D_Buy # 买入 req.CombOffsetFlag = tdapi.THOST_FTDC_OF_Open # 开仓 req.OrderPriceType = tdapi.THOST_FTDC_OPT_LimitPrice # 限价单 req.LimitPrice = 450.0 # 须为最小变动价位的整数倍 req.VolumeTotalOriginal = 1 req.OrderRef = "1" # 报单引用,全局唯一,逐单递增 td.ReqOrderInsert(req, 0)默认撮合机制是做市撮合:柜台按实盘盘口撮合,价格大于等于叫卖价的买单立即成交,小于等于叫买价的卖单立即成交,否则挂在队列里等行情符合条件。也就是说在 7x24 环境里,限价只要越过回放盘口的对手价就会马上成交。7x24 环境另外提供客户间撮合,仅限 TEST、BTC、MINUS 三个合约,客户与客户直接成交,可以按自己想要的节奏验证报单、撤单、部分成交逻辑。
第 5 步:用 OnRtnOrder 和 OnRtnTrade 跟踪回报
下单结果不靠ReqOrderInsert的返回值,靠回调推送:
def OnRtnOrder(self, order): print("报单状态:", order.OrderStatus, order.StatusMsg) def OnRtnTrade(self, trade): print("成交:", trade.InstrumentID, trade.Volume, "@", trade.Price)OnRtnTrade里看到成交,链路就打通了。更完整的可运行版本参考 td_demo.py(交易全流程)与 md_demo.py(行情订阅)。
下不了单?照着这份清单自查
| 现象 | 原因 | 处理办法 |
|---|---|---|
| 前置连不上 / 连上即断 | 行情与交易端口混填 | 7x24 环境行情用 20004、交易用 20002;仿真环境只有交易 20002 |
| 能登录,但下单全部被拒 | 未确认结算单 | 登录后先调ReqSettlementInfoConfirm,等成功回调再下单 |
| 登录失败,账号没错 | 同一微信号共享的密码被改过 | 用 MiniTrader 等 CTP 客户端重置,同微信号下账号同步生效 |
| 报单被拒,提示价格错误 | 价格不是最小变动单位整数倍,或超出涨跌停 | LimitPrice 取 PriceTick 的整数倍,且不越过涨跌停价 |
| 合约查不到行情 / 不成交 | 合约不在回放时段 | 7x24 回放最近交易日行情,选当时正在交易的月份合约 |
| Linux 下订阅失败 | 合约代码按字符串传入 | 以 utf-8 字节串传入,如"au2406".encode("utf-8") |
进阶调优与周边生态
几个上生产前值得记下的要点:
- 回调里只做轻量操作(记状态、写队列),sleep、文件 IO、网络请求全部丢给独立线程。
- 行情按策略实际用到的合约订阅,不做全量订阅。
- 主题订阅用
THOST_TERT_QUICK跳过历史回放,只有需要复现历史数据时才切 RESTART。 OrderRef必须全局唯一,高频策略建议"事件循环 + 线程安全队列"单线程处理,避免多线程竞争报单引用。
周边工具与资料,按需取用:
- TickTrader:openctp 自研图形交易客户端,支持点价下单、自动开平、图表,可接 CTP、TTS、XTP、奇点等柜台。
- MiniTrader:TickTrader 迷你版,经 CTPAPI 兼容接口直连各柜台,无需自己替换 dll。
- vn.py(VeighNa):流行的 Python 量化框架,仓库 readme 的友情推荐项目,可配合 CTPAPI 做模拟交易。
- MT5CTP:MT5 客户端直连 CTP 系柜台的桥接软件,在 MetaTrader 5 界面里交易国内期货和期权。
- ViTrader:仓库自带的命令行 CTP 交易客户端,配置一个 ini 就能连柜台,源码在 widgets/ViTrader/。
- tools 工具集:
prices行情显示、ctpcommand交互式查询资金持仓订单、ctpsettle把结算单解析成 JSON、FTD-XML从结构定义批量生成代码,见 tools/README.md。 - 其余语言接口:ctpapi-java/、ctpapi-go/、ctpapi-c/、ctpapi-csharp/、ctpapi-rust/;股票期权 API 的 Python 接口在 ctpopt-python/,C++ 打印样例在 demo/ctpprint/。
接下来你可以做
- 读 CTP接口扩展说明,掌握股票、债券、基金等品种的扩展枚举值,对接股票柜台前必看。
- 精读 td_demo.py 和 md_demo.py,再浏览 docs/ 里的官方 PDF 资料。
- 把 TTS-CTPAPI 说明 中三套环境的前置地址抄进自己的配置文件。
【免费下载链接】openctpopenctp提供CTP股票期权、中泰证券XTP、华鑫证券奇点TORA、东方证券OST、东方财富证券EMT、盈透证券TWS、易盛TAP、量投QDP等各通道的CTPAPI兼容接口,CTP程序可以无缝对接各股票柜台。openctp也提供了一套基于TTS交易系统的模拟环境,同样提供了CTPAPI兼容接口,不仅支持国内期货与期权全品种,也支持A股股票、基金、债券以及股票期权模拟交易,可以替代Simnow,为CTP量化交易开发者提供7x24可用的模拟环境。项目地址: https://gitcode.com/GitHub_Trending/op/openctp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考