拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

XTP/CTP/数字货币API实盘接入路线图:从权限到风控的完整指南

XTP/CTP/数字货币API实盘接入路线图:从权限到风控的完整指南

做量化和程序化交易的团队,十个里有九个在“实盘接入”这个环节栽过跟头。我最早接触的是CTP,后来因为做A股日内策略,又被拉着接XTP,再往后做多市场轮动,开始研究币圈交易所的原生API,比如OKX和币安那套常用的接口。绕了一大圈之后,最大的感受就是——XTP、CTP、数字货币API虽然都被叫做“交易接口”,但它们的定位、协议风格、权限体系和风控边界完全不一样,拿一套经验硬套,是对自己不负责。这篇东西没有废话,就是想把三大主流交易接口的实盘接入路线图讲透,内容涵盖三套接口各自解决什么问题、接入前要搞定哪些权限、下单和回报的协议差异、断线重连与状态恢复、容易被忽略的费率风控,以及几个我真实踩过又排查出来的故障案例。不管你是模拟盘跑得好好的准备切实盘的个人开发者,还是小团队里负责系统接入的工程师,这篇文章都值得先收藏再对照着做。

1. 三大接口解决的根本问题:先分清柜台、通道与交易所

很多人一开始就把XTP、CTP和数字货币API混为一谈,觉得“不都是下单收行情嘛,有什么不一样”。实际上这三个东西所属的层级完全不同,如果不先把这个想明白,后面写代码和排障都会很混乱。

1.1 XTP本质是一个极速柜台,不是普通行情API

XTP(X-Trade Platform)是中泰证券推出的极速交易柜台系统。注意“柜台”这个词,它跟普通散户用的同花顺、通达信不是一个概念。普通交易软件的接口是帮你操作本地客户端,性能受制于客户端进程和网络链路;而XTP是券商机房里的独立交易通道,从客户端进程直达券商极速柜台,中间少了很多层转发和风控校验,延迟能做到微秒级打印,这在日频、T+0、高频交易场景里有巨大价值。

但它的门槛也摆在那里。首先你得有中泰证券的账户,而且不是开了户就能用。量化接口通常需要单独申请,有的营业部还会卡资产量或交易频率,走PB系统接入的更是要签一堆补充协议。这跟开户随便开完全是两码事。需要认清的是:XTP并不是全市场通用,它的行情源、交易通道都是中泰自己的,如果你同时做多个券商,那每个券商都得单独接各自的极速柜台。

1.2 CTP是期货行业的互操作标准,服务的是“交易流程的完整性”

CTP(Comprehensive Transaction Platform)由上海期货信息技术有限公司开发,但它的意义远超一个交易系统本身。国内几乎所有期货公司都提供CTP接入,这套接口已经成为事实上的行业标准。做国内期货,你根本没有太多选择,要么直接接CTP,要么通过支持CTP协议的第三方系统间接接,本质还是一回事。

CTP解决的不仅仅是“下单快”,它更强调交易流程的完整和规范。里面包含了完整的订单状态机、资金和持仓变动推送、结算单信息、条件单/预埋单等丰富功能。CTP在设计上是标准的异步回调模型,用C++封装,后来vn.py等开源框架做了Python绑定,所以现在个人开发者也能很轻松地用Python写CTA策略并接到CTP实盘。跟XTP最大的不同在于,CTP的账户体系是各路期货公司共用的,接口虽然统一,但每家期货公司给你的交易前置、行情前置地址都不同,认证参数也各不相同,接起来就是“标准协议+各家配置”。

1.3 数字货币API是交易所直连,灵活但纪律要求最高

数字货币领域的API和前面两者有个本质区别:它没有统一的行业标准。你接币安是一套签名和限频规则,接OKX又是另一套,Bybit和Bitget也不尽相同。每家交易所自己定义REST接口路径、WebSocket订阅格式、订单字段和推送机制,所以“永续合约”“资金费率”“标记价格”这些概念也得在接入时逐个搞明白。

优势是开放程度高,你注册个账户、通过KYC,就能创建API Key,不用像证券那样找客户经理、签协议、等审核。但这也意味着责任全在你这边。交易所不会提醒你“你的Key权限过大了”“你的时钟偏差超过30秒了”“你这种撤单频率要触发限频了”,所有坑都要自己在模拟环境里先踩一遍。很多人把CCXT这种聚合库当救命稻草,但我的建议是,做研究可以用CCXT,做实盘还是得接原生API——原生接口的稳定性、推送实时性和字段完整度,是聚合库很难比的。

维度XTPCTP数字货币API
市场A股(沪深两市)国内商品/金融期货全球加密货币现货/合约
接入门槛中泰开户+单独权限申请任意期货公司开户+接入授权注册+KYC+创建API Key
主要协议官方C++ SDK,社区有Python封装C++为主,通过vn.py等封装成PythonREST + WebSocket
交易时段工作日9:30-11:30、13:00-15:00日盘+夜盘分品种7×24小时
延迟水平微秒级,极速柜台毫秒级,取决于期货公司链路边缘到毫秒级不等,受网络影响大
风控位置券商侧+客户端期货公司侧+客户端交易所侧+客户端

2. 接入前的准备清单:账号、权限、测试环境一个都不能少

实盘接入前,很多人最急躁,总想着“先跑通代码再说”。但代码反而是最简单的部分,真正耗时的是账号、权限、测试环境这些前置条件。这些搞不定,你连模拟盘的登录都难过。

2.1 XTP的权限申请:先用测试环境,别拿正式环境练手

XTP的接入流程大概是这样的:先在官网或营业部申请测试环境账号,下载对应SDK。测试环境地址、端口和正式环境是完全分开的,登录参数里会有一个类似session的配置,行情和交易还要分开连接。我个人建议,不要一上来就申请实盘,先在测试环境把账户登录、行情订阅、委托、撤单、回报处理全流程跑通,至少跑一周,不然正式环境里出了问题你根本分不清是代码bug还是业务逻辑错误。

申请实盘权限时,你会接触到几个关键参数:client_id、软件版本号、本地网卡IP等。XTP连接时会做客户端软件版本校验,版本不匹配会被直接拒登。还有一个很容易忽略的点:XTP对交易服务器的时钟同步要求极高,如果你的服务器时钟偏差大,下单时回包会出现各种奇怪的错误,这个后面在排查环节展开说。实盘接入前,券商可能会要求你填写一份接入申请表,说明策略类型、交易频率、最大委托笔数等,这些信息其实是券商做风控参考用的,尽量如实填写。

2.2 CTP的仿真与实盘:SimNow就好比驾校练车场

CTP的测试环境叫SimNow,全称是“上期技术综合模拟交易平台”。注册之后你会拿到一套brokerID、userID和密码,然后配置SimNow的行情前置和交易前置地址,就能开始模拟交易。SimNow最大的价值是让你在零成本环境下跑通策略逻辑、验证回报处理和资金计算。但它和实盘有个关键差别:SimNow撮合逻辑相对宽松,很多在真实盘面会出现的排队成交、部分成交、停板封单等场景,在SimNow上体现得非常模糊。所以SimNow跑通只是起点,不是终点。

实盘要联系开户的期货公司。每家期货公司的开户流程类似,但接入参数不同。通常你会得到四个核心东西:交易前置地址、行情前置地址、brokerID、还有一笔AuthCode授权码。CTP的实盘接入,现在很多期货公司要求用带认证功能的客户端——也就是说你的程序不光要登录,还得先做一次“认证请求”,认证通过后才能真正连上交易前置。这就是很多人第一次接CTP实盘时卡住的地方,明明账户密码都对,却一直登不进去,其实就是忘记做AuthCode认证或者认证顺序不对。

2.3 数字货币API Key的安全边界:权限、IP白名单、防泄露

数字货币交易所创建API Key时,界面会有一堆权限勾选项,常见的有“读取”“交易”“提现”三类。在这里请记住一条铁律:永远不要勾“提现”权限。程序化交易只需要读取账户信息和执行交易,提现权限一旦泄露,等于把钱包钥匙交出去。我见过不止一起因为Key权限过大导致资产被盗的案例,其中绝大多数不是被黑,而是开发者把带提现权限的Key硬编码在配置文件里,上传到GitHub仓库后被人扫描到了。

另一个容易被忽略的选项是IP白名单。绑定服务器出口IP是最稳妥的做法,这样即使Key泄露,攻击者也无法从别的IP使用它。数字货币API很多还要求本地时间与服务器时间偏差不能太大,差个几十秒就会返回时间戳错误。所以接入前要先把服务器时间用NTP调准。还有,不同交易所对Key数量有不同限制,多策略、多账户的情形要提前规划好命名和管理方式,别到上线前才发现Key不够用。

3. 委托到回报的完整闭环:XTP、CTP、Crypto的关键协议差异

模拟盘跑通之后,接下来就是重头戏:真正理解“委托-回报”这条链路的每一个环节。这三类接口在这条链路上的设计思路各有千秋,不理解细节,代码写出来必定是“看着能跑,一遇异常就废”。

3.1 XTP的订单生命周期与本地管理

XTP的委托流程用一句话概括就是:你发一个订单请求,系统异步给你回推订单状态和成交信息。它的交易API围绕XTPTraderApi展开,下单时传入股票代码、价格、数量、买卖方向、订单类型等信息。注意XTP把“订单”和“成交”分开推送:一个订单可能对应多笔成交,所以你会收到多次OnTradeEvent,而每次成交都会在OnOrderEvent的基础上更新订单的累计成交数量。

很多新手第一次接XTP时有个错觉,以为调用下单接口返回了XTP_ORDERREF就代表“订单已经发出去了”。其实这个返回值只是本地索引,真正的报送结果要通过回调事件才知道。回调里会包含订单状态,比如XTP_ORDER_STATUS_NOTRADEQUEUEING表示已报待成交、PARTTRADEDQUEUEING是部分成交、ALLTRADED是全成、CANCELED已撤、REJECTED废单。这里最关键的工程问题是:XTP不帮你持久化任何东西,所有订单状态和持仓变动都必须你自己落库或维护内存状态。如果进程崩溃,重启后要主动调查询接口拉取未完成委托,才能把状态恢复到崩溃之前。这一点一定要重视,很多程序化交易事故就是忘了状态恢复。

3.2 CTP的Req/SPI异步模型:你的回调函数就是业务主逻辑

CTP的编程模型是所有接口里最典型的“请求-响应-推送”三分离模式。它分两层:你主动发起请求,调用ReqUserLogin、ReqOrderInsert、ReqQryPosition这类方法;然后结果通过继承SPI接口得到回调,比如OnFrontConnected、OnRspUserLogin、OnRtnOrder、OnRtnTrade。简单说,你的业务逻辑必须挂在回调里,而不是放在主函数的顺序逻辑里。

具体到下单,你要构造一个CThostFtdcInputOrderField结构体,填好会员代码、用户代码、合约代码、价格、数量、开平标志、价格类型等字段,然后ReqOrderInsert。注意,这里插入成功只代表请求被前置接受了,不代表交易所接受了。真正的接受结果在OnRtnOrder里,订单状态字段OrderStatus会变成尚未成交或全部成交,中途发生废单则在OnRspOrderInsert里带错误码。CTP里还有一个概念叫OrderRef(报单引用)和FrontID、SessionID,这三个字段组成了区分一笔报单的唯一标识。多线程环境下如果分配OrderRef不小心,很容易出现不同订单互相覆盖的问题。

3.3 数字货币API:REST负责动作,WebSocket负责流

数字货币交易接口的思路和证券期货有很大不同。以币安为例,REST接口负责命令类操作,比如POST /api/v3/order创建订单、DELETE /api/v3/order撤销订单、GET /api/v3/account查询账户;而行情、订单更新、成交推送这些“流式数据”,全部走WebSocket。REST是同步的,你发一个请求,它会等交易所返回结果,适合低频的操作;WebSocket是长连接,适合高频的订阅和实时感知。

所以数字货币API接入的第一原则是:不要把REST当成行情源,不要把WebSocket当成命令通道。REST做下单,WebSocket做状态同步,这是主流做法。在OKX V5接口里,交易和行情频道也做了类似区分,你通过WebSocket订阅orders私有频道,就能实时收到自己订单的更新推送。这里还牵扯到一个重要机制:用户数据流的保活。币安的用户数据流需要一个listenKey,这个Key有过期时间,必须定期用PUT请求续期,否则连接会被断开,订单更新就会“静默丢失”。很多新手发现自己的实盘系统跑着跑着突然收不到成交回报,十有八九是忘了续期ListenKey。

下面我用一个简化示意来说明三者在“业务事件分发”上的差异,不是真实代码,但逻辑是通用的:

# 统一事件分发伪代码:不同接口的事件流怎么进入同一套业务逻辑 def on_xpt_order_event(raw_event): order_state = map_xtp_status_to_enum(raw_event.status) handle_order_update(order_state) def on_ctp_rtn_order(raw_event): order_state = map_ctp_status_to_enum(raw_event.OrderStatus) handle_order_update(order_state) def on_crypto_ws_message(raw_message): if raw_message.type == 'ORDER_UPDATE': order_state = map_crypto_status_to_enum(raw_message.status) handle_order_update(order_state) def handle_order_update(state): # 更新本地订单簿、写日志、触发策略回调 print('订单状态更新:', state.client_order_id, state.status)

4. 实盘工程化的硬骨头:连接生命周期、重连与订单状态恢复

如果说前面讲的协议差异是“道”,那连接管理和状态恢复就是“术”,而且是决定你实盘系统能不能稳定过夜的术。做量化的人都知道,程序跑一两天看不出问题,跑一个月,问题全在“网络闪断、进程重启、交易所拒单”这类异常场景里暴露出来。

4.1 登录与断开:所有接口都要求你管理会话

XTP、CTP、数字货币API三者在连接管理上有一个共同点:登录状态不是一次性的。CTP有OnFrontDisconnected,XTP有OnDisconnected,币安WebSocket断连也会触发关闭事件。接入实盘,你必须写一个连接管理器,统一处理“初次连接失败”“运行中连接断开”“断开后自动重连”“重连后重新登录/重新订阅”这四件事。

我的做法是所有连接状态都维护一个有限状态机,比如DISCONNECTED -> CONNECTING -> CONNECTED -> AUTHENTICATED,任何异常都把它打回CONNECTED之前的状态,然后由统一的重连循环来推进。重连策略上,我用指数退避:第一次1秒,第二次2秒,第四次8秒,最多30秒封顶,同时设置最大重连次数,超过次数就直接报警停止运行——宁可停止交易,也不能在异常状态下重复下单。有些接口断线后需要重新拉取全部持仓和未完成委托,这一步千万不能省。

4.2 订单状态对账与本地数据库

状态恢复的核心,就是“本地持久化+启动对账”。无论是XTP、CTP还是数字货币API,都提供查询接口,可以在启动时拉取当天或者近几日的订单记录。我强烈建议,每次收到订单回报、成交回报,立刻写本地SQLite或者Redis,别只放在内存里。进程崩溃后,启动时先查本地未完成的委托清单,再向交易所发送查询指令,两边一对比,把缺失状态补上,然后才能开始新的交易。

举个例子,你维护一个orders表,每行包含client_order_id、exchange_order_id、status、filled_qty、avg_price、update_time字段。上线后,每次OnRtnOrder/OnOrderEvent/WebSocket推送,都执行UPDATE orders SET status=?, filled_qty=? WHERE client_order_id=?。启动时查这个表找出所有status不为FILLED和CANCELED的订单,再通过查询接口核对。数字货币API尤其要注意幂等性,很多交易所支持自定义clientOrderId,这个字段是防止网络超时后重复下单的法宝。

4.3 时区与时间同步:别让你的单子输在“最后一秒”

XTP和CTP全部使用北京时间,但数字货币交易的服务器时间通常是UTC或者Unix毫秒时间戳。如果你在A股服务器上跑币圈策略,没做时区换算,K线时间、订单时间会全部错位。更危险的是,很大一部分交易所有“时间窗校验”,比如你的请求时间戳与交易所服务器当前时间相差超过一定阈值,请求直接拒绝。我遇到过一次非常隐蔽的故障:服务器NTP同步服务配置错了源,时钟慢了两分钟,结果币安所有下单接口都不稳定,时好时坏,排查了半天才发现是系统时钟问题。从那之后我把所有交易服务器都强制配置了系统级NTP,并且加了定时巡检脚本,每天检查时钟偏差。

5. 容易被忽视的交易参数与风控细节:要想清楚再下单

接口能下单只是一个起点,真正决定策略能不能赚钱的是那些藏在“业务规则”里的细节。很多时候不是策略逻辑不行,而是你的下单代码根本没处理好手续费、保证金、涨跌停和限频这些看起来不起眼的东西。

5.1 手续费、保证金、资金费率直接影响策略

股票交易有佣金、印花税;期货交易有手续费,而且平今和平昨费率不同;数字货币永续合约还有资金费率,每隔八小时结算一次。接口里虽然一般不直接让你填费率,但你在做策略前必须把这些成本模型算清楚。

举个例子,同一条期货策略,在SimNow上跑通和实盘跑完全是两个概念,因为SimNow不模拟真实的平今手续费差异化,实盘高频开平仓的成本可能直接把收益吃掉。数字货币永续合约的资金费率更是如此,如果你的持仓方向和主流仓位反向,八小时一次的资金费可能让你的“套利”变成“送钱”。接入实盘前,一定要把费率参数做成可配置项,并且在下单前做一次显性的“预检”:这笔订单按当前盘口能成交多少,实际会产生多少成本,会不会导致收益为负。别小看这一步,很多实盘策略亏损不是方向看错,是被成本和撮合规则磨掉的。

5.2 交易时段、涨跌停与有效性规则

XTP和CTP的交易时段是固定的,A股在周末和法定节假日休市,期货有日盘和夜盘,不同品种的夜盘时段还不同。如果你的系统没有校准“是否处于当前合约的可交易时段”,很容易在开盘集合竞价阶段或者收盘瞬间发出废单。CTP有一个字段叫TimeCondition(有效时间类型),可以设置成立即有效或当日有效,很多人图省事直接用当日有效,结果收盘后撤单撤不掉、新单也报不进去,还要额外处理超时废弃。

涨跌停板更是个大坑。A股有涨跌停价,超出范围直接废单,所以追涨停策略的委托价不能简单是“最新价+1%”。期货合约的涨跌停幅度按合约不同,而且连续单边市会调整涨跌停幅度,这种变化在实盘里是动态的,不是配置一次就完事。数字货币没有涨跌停,但有“最小价格精度”“最小下单数量”“最大单笔数量”这类限制,下单价格精度不够就直接被拒。

5.3 接口限频与批量操作

每个接口都有频率限制,只是表现形式不同。CTP前置通常对每秒事务数有限制,超出后会产生流控错误;XTP对单账户的委托频率也有隐性限制;币安和OKX对REST请求和下单次数有明确限制,比如单IP每秒请求次数、单账户每分钟下单笔数。这条我们放在接口工程层面讲,但实际它会直接影响策略的交易频率上限。

我的做法是做一个全局的“请求限速器”,维护一个滑动窗口计数器,每次发请求前检查,超过阈值就排队等待。批量撤单操作尤其需要限速,很多人手上的策略一遇到回撤就批量撤单,瞬间触发限频,结果撤单请求被交易所拒绝,订单全部滞留,然后亏损放大。预先在本地把撤单请求排队、均匀打出去,比一次性发几十个请求要可靠得多。

接口常见限频类型典型应对办法
XTP客户端维度请求频率控制本地请求队列 + 重试退避
CTP前置流控(每秒事务数)控制单连接请求频率,批量拆分
币安权重系统 / 下单次数(如10秒50单)用本地计数器控制,优先使用WebSocket推送
OKXIP维度请求速率限制REST低频操作,行情和订单更新走WebSocket

6. 实战排查实录:三个典型的实盘翻车现场

说实话,最让人长进的从来不是顺利跑通,而是“查不出为什么”的崩溃现场。下面三个案例,全是真实发生过、并且耗费了我大量时间才定位的问题,如果你接入时也遇到类似情况,希望能帮你少走半天弯路。

6.1 XTP“订单状态查询永远少一笔”:本地订单ID的坑

有个策略在A股收盘后做收盘价扫描,需要拉取当天全部委托记录,结果发现有一笔废单在查询结果里永远不出现。最开始怀疑是查询接口的返回限制,后来对比发现,那笔废单发生在进程刚重启后的十几秒内,而重启后的登录会话还没完全把本地状态恢复完整,就用了一个本地的订单索引去查交易所记录。

排查链路是这样的:先看日志确认废单是否收到过OnOrderEvent,发现收到过且已经落库;再看查询接口的过滤条件,发现它要求用“本地订单索引+交易所订单编号”来精确查找,而我查的时候传的索引不对。根因是在登录完成后、状态恢复完成前,我的代码过早开放了查询入口。解决方法是:在登录成功且对账完成后才置一个ready标志位,查询和下单都等待ready再执行。这个教训后来变成了我们所有接入任务的一个默认约束——任何接口登录后都要先同步状态,再接策略。

6.2 CTP“废单秒变小灰单”:前置认证与RequestID冲突

CTP的报单引用是FrontID + SessionID + OrderRef的组合,其中OrderRef在同一个会话里必须唯一。我之前写过一个多线程CTA引擎,直接并发调用ReqOrderInsert,结果出现了一个非常诡异的现象:两笔不同合约的订单,成交回报显示成同一笔订单的多次成交,而且撤单时会把另一笔单子一起撤掉。

查到最后发现,就是多线程并发分配OrderRef时出现了重复。CTP的接口要求ReqOrderInsert在短时间内串行调用,否则本地报单引用会冲突,后一笔会覆盖前一笔的引用记录。让我崩溃的是这个错误不是必现的,只在某个线程切换的临界点出现,单跑一个策略几乎遇不到,一上多策略就中招。解决办法有两步:一是用一个原子变量统一分配OrderRef,保证全进程唯一;二是所有请求放进一个发送队列,由一个发送线程统一出队调用,彻底规避并发竞争。这也是我后来接触所有接口时的默认姿势,包括XTP和数字货币API,命令操作全部走单写队列,异步回调单独走处理线程。

6.3 数字货币API的“重复下单”:网络超时后的幂等策略

有一段时间做币圈网格策略,遇到过一个最典型的故障:币安行情剧烈波动时,下单请求超时了,我的代码捕获到超时后自动重试,结果这个订单其实已经在交易所成交了,重试等于重复下了一单。那天晚上网格策略重复下单了三次,仓位直接翻了三倍。

根因是我把“请求超时”和“订单失败”混为一谈了。在数字货币API里,订单创建请求超时,交易所既可能没收到,也可能收到了但响应丢失,这两种情况必须区分。后来我改造了下单流程:每次下单时生成一个newClientOrderId,请求超时后不直接重试,而是先调用“按客户端订单号查询订单”的接口,查这个clientOrderId是否存在;如果存在且是最终状态,就不重试;不存在才重试。加上WebSocket推送的订单更新通道,双保险。同样的问题在股票和期货接口里也存在,只是表现形式不同,所以不管接什么接口,“全局唯一业务单号+幂等查询+状态恢复”这套组合拳必须作为基础设施提前做好。

7. 怎么选接口、怎么组合:我给后来人的实操建议

讲了这么多技术细节,最后回到最实际的问题:我到底该选哪个接口,以及多市场到底怎么组合。

7.1 按你的交易场景选接口

如果你主攻A股,策略换手率高、对延迟敏感,那XTP或者类似级别的极速柜台确实值得投入,因为它的行情延迟、下单延迟和成交回报链路在券商端是经过专门优化的。如果你做国内期货,CTP没有任何悬念,直接选它,唯一要比较的是各家期货公司给的链路质量和行情源稳定性。如果你做币圈,别纠结,直接接你想交易的那家交易所的原生API,常见的币安、OKX、Bybit都有完善的开发文档和测试网环境。

你的交易目标首选接口备注
A股高频/日内T0XTP(或同类极速柜台)需要单独申请权限,看重延迟
A股日频/中低频普通券商行情+极速柜台均可主要关注稳定性和费率
国内商品/金融期货CTP按期货公司配置接入,可加AuthCode
数字货币现货/合约交易所原生API行情走WS,下单走REST
跨市场多策略原生API+自己封装适配层不要依赖CCXT做实时交易

7.2 多市场策略的统一封装思路

不少朋友是“什么市场都做”,这样就必须面临一个统一适配的问题。我给自己的建议和给你的建议一样:不要为了偷懒把所有接口都揉进一个类里硬凑,而是抽象出一个干净的业务层接口。

from abc import ABC, abstractmethod class BaseBrokerAdapter(ABC): @abstractmethod def connect(self): pass @abstractmethod def send_order(self, symbol, price, quantity, side, order_type): """ 返回本地生成的 client_order_id,用于后续幂等和跟踪 """ pass @abstractmethod def cancel_order(self, client_order_id): pass @abstractmethod def query_open_orders(self): pass @abstractmethod def on_order_update(self, raw_event): """ 从不同接口的回调/推送中接收原始事件,映射成统一结构 """ pass

然后每个接口写一个Adapter:XtpAdapter、CtpAdapter、OkxAdapter,内部去处理各自的回调、字段映射、重连和限频。策略层只依赖BaseBrokerAdapter,这样在A股和币圈之间切换策略,只需要替换Adapter配置,策略代码基本不动。统一的订单状态枚举建议包含:PENDING、PARTIAL_FILLED、FILLED、CANCELED、REJECTED、UNKNOWN,每个Adapter负责把自家接口的状态映射到这套枚举上,这是最省力的做法。

7.3 最后几句实在话

从零开始接接口,我建议你先从CTP入手。原因是SimNow免费仿真环境非常成熟,社区资料铺天盖地,遇到问题搜一搜就能找到答案,而且CTP的异步回调模型和状态机思想是通用的,理解它之后,再去接XTP和数字货币API都会顺畅很多。不要一上来就三套系统同时搞,那就是给自己挖坑。上线之前至少跑一周仿真,把撤单排队、网络闪断、账户资金变动这些异常场景都主动模拟一遍,确认状态恢复逻辑没漏洞再开实盘权限。

我自己的习惯是,任何新接口接入后,第一周都用“只汇报不交易”的方式挂着,把所有回调日志、状态机转换、异常路径全部记录下来,确认没有异常再开放实盘下单权限。听起来很保守,但正是这个习惯,帮我避开了至少三次因为接口协议版本升级导致的批量废单事故。

返回列表