1. 选型之前,你要先搞清楚这三类接口分别解决什么问题
实盘接入这件事,看起来是“拿文档调接口”,但真正动手之后你就会发现,选错接口比写错代码可怕得多。我见过不止一个团队,在回测里跑得飞起的策略,换到实盘却卡在接口选型上,折腾一个月后又推翻重来。所以这篇文章我不会上来就贴代码,而是先把XTP、CTP和数字货币API这三类接口的定位、使用场景和接入链路讲透,再给你一套可以直接照着做的实战方案。
先说我的背景,过去几年我在私募和自营团队都待过,写过的交易程序从期货CTA到股票T0都有,加密货币这边也帮朋友搭过几套量化框架。这三类接口我都有实盘接入经验,踩过的坑不算少。下面的内容没有教科书式的讲解,全部是我实际动手过程中的记录和复盘。
1.1 CTP:国内期货市场绕不开的入口
CTP的全称是综合交易平台,由上海期货信息技术有限公司开发。它不只是某个期货公司的柜台系统,而是国内期货行业事实上的标准接口。无论是商品期货、股指期货还是期权,只要你走国内正规通道做程序化交易,基本都要跟CTP打交道。
CTP接口按功能拆成两大部分:行情API和交易API。行情API负责订阅实时Tick、K线等市场数据,交易API负责登录、报单、撤单、查持仓、查资金。两套API虽然是同一个SDK里的,但它们是独立的两个模块,连接的前置地址也不同。打个比方,行情API和交易API就像你家里的一条网线和一个电话线,都能跟外界通信,但走的通道完全不一样。
很多人第一次接触CTP时会有一个误解,以为用CTP就能直接连上交易所。实际上CTP只是一个中间层,期货公司把CTP柜台部署好之后,给你一个前置机地址,你通过这个地址接入CTP,再由CTP把订单转发到交易所。所以你找期货公司开户之后,需要向他们索要四个核心信息:行情前置地址、交易前置地址、BrokerID(期货公司编码)、UserID(资金账号)。这四样东西少了任何一个都登录不上。
CTP的接口语言以C++为主,官方不提供Python版本。好在社区生态非常成熟,vn.py、openctp这类开源项目都封装好了Python接口。我的建议是,如果你是个人量化开发者,直接用vn.py或openctp起步没问题;如果是团队作业、要追求极致性能,还是老老实实写C++,用自己维护的一套代码更可控。
1.2 XTP:面向股票与两融的极速通道
XTP是中泰证券推出的极速交易平台,主要面向沪深A股、ETF、可转债以及两融交易。它跟CTP最大的区别在于,XTP诞生之初就定位于低延迟场景,所以整个系统在设计上更强调性能和稳定性。
如果你只做期货,XTP跟你没什么关系;但如果你做股票日内、高频回转或者ETF套利,XTP就是绕不开的选择。国内像中泰、华鑫、招商等券商都有自己的极速柜台,XTP只是其中比较有代表性、资料相对开放的一个。
XTP的API同样分为行情和交易两套,登录认证方式比CTP复杂一些,尤其涉及RSA密钥对。在模拟环境里,你需要先自行生成RSA密钥,将公钥放到XTP指定的目录下;在实盘环境里,券商会给你一套已配置好的密钥信息。这个环节很多人会卡住,后面我会专门写一小节来讲。
另外要注意,XTP并不是全业务覆盖的。比如你可以做普通股票买卖、ETF申赎、融资融券,但你做不了期货和可转债转股——不同柜台支持的业务范围不同,接入前一定要跟券商确认清楚,避免系统做到一半发现业务不支持。
1.3 数字货币API:门槛低,但细节坑多
数字货币这一块,市面上主流的交易所都有官方API,比如币安、OKX、Coinbase等。它们的接口设计大体一致:REST API负责交易指令和账户查询,WebSocket负责订阅实时行情。和CTP、XTP相比,数字货币API最大的优势是开放,注册账号之后申请API Key就能开始联调,不需要经过柜台开通权限的漫长流程。
但这不代表数字货币API更简单。它的认证机制是基于HMAC SHA256签名,不同交易所对签名字符串的拼接要求不同,一个参数顺序写错就会报签名错误。更麻烦的是各种隐性限制,比如请求频率限制、IP白名单、现货与合约的接口权限分离等。
如果你同时做国内期货和数字货币,你会发现一个很有意思的现象:数字货币交易所的API文档更像互联网公司的接口文档,有沙盒环境、有错误码表、有Postman示例;而CTP的文档则像一份传统工业软件的说明书,没有在线调试环境,全靠你慢慢试。这两种风格各有优劣,但你必须适应。
2. 接入前的准备:环境、权限与账号体系
选型完成后就进入实操阶段了。很多初学者习惯直接去写代码,忽略了环境准备和权限申请,结果代码写好了却连不上服务器,白白浪费几天时间。
2.1 账户权限与测试环境申请流程
先把三类接口的权限获取路径说清楚。
CTP这块,你需要先在一家期货公司开户,然后向客户经理说明你打算做程序化交易,申请开通CTP直连权限。部分期货公司会要求你签署程序化交易风险揭示书,并提供策略说明或源码审查。接着你会拿到一套“仿真账号”和“实盘账号”,仿真账号对应的就是测试前置机,实盘账号对应的就是生产前置机。有一点很重要:仿真环境的BrokerID可能和实盘不同,代码里一定不要写死。
XTP的流程类似,只是主体从期货公司换成了券商。你需要有一个中泰证券的资金账户,然后申请开通XTP极速柜台权限。模拟环境分为“测试环境”和“仿真环境”,测试环境是给开发者做接口联调的,仿真环境则接入真实行情,但订单不进场。我个人的经验是,拿到权限后先在测试环境验证登录和报单基本流程,再去仿真环境做策略级的模拟交易。
数字货币API的申请最省事,直接在交易所官网创建API Key即可。但我必须强调一个安全细节:创建Key的时候,权限只勾选“现货交易”或“合约交易”,绝对不要勾选“提现”权限。密钥对里包含API Key和Secret Key,Secret Key只在创建时显示一次,一定要立刻保存到密码管理器里。如果你泄露了Secret Key,别人就可以用你的账户下单,甚至在某些交易所可以设置子账号划转资金,后果非常严重。
2.2 开发环境与依赖封装
XTP官方要求Windows操作系统,原因是它依赖特定的C++运行时和OpenSSL版本。你可以在Windows上直接用Visual Studio编译,如果像我一样习惯在Linux服务器上跑策略,就要通过Windows版API封装出CTA服务,再用gRPC或消息队列把下单指令转发给Windows服务进程。这种架构虽然麻烦一些,却是很多私募的真实做法。
CTP则在跨平台上友好很多,官方SDK提供Windows和Linux两套编译版本。建议直接在Linux服务器上用C++开发,性能最好;如果坚持用Python,推荐直接pip安装vnpy的CTP接口封装,省去自己编译C++库的麻烦。
数字货币API是最不需要纠结环境的,各主流交易所都提供了Python官方SDK或社区封装。你只需要确保服务器时间准确——是的,时间戳校验是一个非常大的坑。数字货币API的所有签名请求都依赖timestamp参数,服务器时间偏差超过30秒就会被拒绝。用ntpdate或systemd-timesyncd同步一下时间,能避免很多看起来莫名其妙的问题。
3. XTP实战:登录、就绪判断与下单链路
XTP的文档里反复强调一个词:就绪。这也是我用XTP时踩过最久的坑。下面把XTP从登录到下完一单的全流程拆开讲。
3.1 初始化API与回调函数机制
XTP的API分为XTAPI(行情接口)和XTQuant(交易接口)两套,每一套里都包含了接口调用函数和回调处理函数。用前先创建API实例,再注册回调对象,之后调用Connect连接前置机。
一个很关键的细节是,XTP的所有API调用都会异步返回。你调用InsertOrder下单之后,并不能立刻知道订单状态,而是通过回调函数收到委托回报、成交回报。所以写XTP程序的核心不是写下单函数,而是写状态机——一个单子从“已报”到“部成”再到“全成”,中间可能还有“已撤”,你必须用状态机把这一系列回调串起来。
我见过一些新手把InsertOrder的返回值当成下单成功标志,这是完全错误的。返回值只代表“下单指令是否被柜台接收”,不代表订单进入交易所系统。一个稳健的程序必须等待成交回报或撤单回报来确定订单的最终状态。
3.2 登录认证与“交易未就绪”问题
XTP登录最典型的坑,就是登录成功后立刻下单,结果收到“交易未就绪”的错误。原因是交易API登录成功后,柜台还需要做一系列初始化工作(加载账户资金、持仓、权限配置等),这个过程是异步的,只有收到OnQueryTradingAccount或OnServerStatus回调并且状态为就绪,才代表真正可以交易。
我的经验是,写一个线程安全的阻塞等待机制:用一个互斥锁和条件变量,在OnServerStatus收到就绪信号后通知主线程继续执行。每笔订单下发前再额外检查一次就绪标记,这是一个很便宜却很有效的防御性做法。
// 以C++风格伪代码示意就绪等待逻辑 std::mutex mtx; std::condition_variable cv; bool tradingReady = false; void OnServerStatus(XTP_SERVER_INFO* serverInfo) { if (serverInfo->server_status == XTP_SERVER_STATUS_READY) { std::unique_lock<std::mutex> lock(mtx); tradingReady = true; cv.notify_all(); } } void WaitForReady() { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return tradingReady; }); }之前我帮一个朋友排查XTP问题,他反复收到“用户未登录”错误,但日志显示登录明明成功了。后来发现他的程序在收到OnDisconnected后尝试自动重连,但重连后没有重新执行完整的登录流程,而是直接去查持仓,交易所端根本没建立会话。XTP的重连逻辑绝不是简单的“断开后重新Connect”就完事,必须按顺序重新走一遍登录和就绪等待流程。
3.3 RSA密钥配置与权限文件检查
XTP的登录方式里,我遇到最多问题的就是RSA密钥配置。在测试环境里,你需要自己用openssl生成一对RSA2048密钥,把公钥放到XTP指定的配置目录中。连接的时候通过SetRSAKey指定私钥路径,客户端才能完成身份认证。
openssl genrsa -out rsa_private_key.pem 2048 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem然后在XTP的配置文件里添加账户信息,把公钥发布到服务端。注意:XTP的AppID(客户端ID)是唯一的,你用什么AppID登录,就会占用这个ID的在线会话。如果多个程序使用同一个AppID,后登录的会把先登录的踢下线,这也是分布式部署时一个很隐蔽的坑。
实盘环境里,券商通常会把AppID和密钥文件直接配置好,你要做的是拿到权限后先测试服务器的验证流程是否畅通。我见过有人在测试环境能正常登录,但在实盘环境连续输入错误的AppID,触发了账户锁定的情况。XTP对连续登录失败有保护机制,账户会被锁几分钟到半小时不等。接入实盘前,建议先确认一遍所有认证参数,做到一次登录成功。
3.4 XTP的下单参数与订单状态流转
XTP下单最核心的报单结构是XTPOrderInsertInfo,其中xtp_order_id由客户端生成,全局唯一;order_client_id用于客户端自我标识,方便后续在回调里快速匹配到业务上下文。
XTPOrderInsertInfo order = {}; strcpy(order.ticker, "600000.SH"); order.market = XTP_MARKET_SZ; order.price = 10.50; order.quantity = 100; order.price_type = XTP_PRICE_LIMIT; // 限价单 order.side = XTP_SIDE_BUY; order.business_type = XTP_BUSINESS_TYPE_CASH; order.order_client_id = GetNextClientId();我建议每个订单的order_client_id都要有自增策略,方便在回调里按这个字段来回速匹配订单状态。配合一个内部订单映射表(client_id到策略上下文),可以轻松实现撤单、改单以及对账的功能。XTP的OnOrderEvent回调会告诉你订单的最新状态,比如XTP_ORDER_STATUS_NEW、XTP_ORDER_STATUS_PARTTRADED、XTP_ORDER_STATUS_TRADED、XTP_ORDER_STATUS_CANCELED等。一个常见的实操误区是只在OnOrderEvent里处理,忽略了OnTradeEvent。实际上OnTradeEvent才是真正的成交回报,拿它统计成交量是最准确的。
4. CTP实战:从登录到撤单的完整链路
CTP的历史比XTP悠久得多,所以它的坑也更多。很多老交易员说“没在CTP上踩过几个坑,不算做过量化”,这话一点不夸张。接下来按顺序讲我实际用下来最容易出错、最影响交易的地方。
4.1 初始化、登录与结算单确认
CTP的初始化流程比XTP简单一些,不需要RSA密钥,直接使用用户名密码登录。但登录完之后隐藏着一个关键步骤:交易日首次登录后,必须调用ReqSettlementInfoConfirm接口确认前一交易日的结算单,否则不能进行交易。
当时我第一次实盘接入CTP,第二天早上跑程序报单,发现所有订单都被拒,错误码是CTP: 当前正处在禁止交易状态,找遍文档才反应过来是没确认结算单。后来我总结出一个顺序操作模板:
- 初始化API,注册回调。
- 连接行情前置和交易前置。
- 收到前置连接成功回调后,调用
ReqUserLogin登录交易接口。 - 登录成功回调中调用
ReqSettlementInfoConfirm。 - 收到确认成功回调后,查询一次资金和持仓,确认数据正常。
- 标记系统“就绪”,开始接收交易信号。
每一步之间一定要有回调确认,不能简单sleep等待。CTP是异步架构,你发出去的请求和收到的回调之间没有固定时序,这也意味着你无法用睡眠时间来决定下一步什么时候执行。
4.2 行情订阅与数据落地
CTP的行情处理有一个很多人忽略的细节:它是全推模式。订阅某个合约后,行情API会持续推送该合约的Tick数据,而不会去重。如果你同时订阅了10个合约,每个合约每秒推送多次快照,你的数据接收端可能会在高峰期收到相当数量的行情包,处理不过来就容易积压。
因此,一个可靠的CTP行情程序必须有高效的序列化和缓存策略。我一般用环形缓冲区或内存队列接收行情,由独立线程来消费。消费端做数据处理、入库、策略信号计算,生产端和消费端用无锁队列解耦。千万不要在行情回调里直接做策略计算,那样会把行情线程卡死,一旦回调阻塞过久,行情API会丢弃后续推送,造成数据缺失。
还有一个小技巧:CTP的行情回调OnRtnDepthMarketData里拿到的Volume是当日累计成交量,不是某个时间点的增量成交量。在做Tick级策略时要自己维护增量:delta = current_tick.Volume - last_tick.Volume。这个细节对做成交量和盘口异动策略的人来说特别重要,网上不少回测框架没注意这一点,结果模拟数据和实盘数据对不上。
4.3 报单、撤单与错误处理
CTP的下单需要构造CThostFtdcInputOrder对象,核心字段包括InstrumentID、Direction(买卖方向)、CombOffsetFlag(开平标志)、LimitPrice、VolumeTotalOriginal等。其中CombOffsetFlag非常容易出错:开仓填'0',平仓填'1',平今填'3'(不同期货公司可能有差异),如果填错会被柜台拒单。
CThostFtdcInputOrder req = {}; strcpy(req.InstrumentID, "rb2410"); req.Direction = THOST_FTDC_D_Buy; req.CombOffsetFlag[0] = THOST_FTDC_OF_Open; // 开仓 req.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation; req.LimitPrice = 3800.00; req.VolumeTotalOriginal = 1; req.OrderPriceType = THOST_FTDC_OPT_LimitPrice; req.TimeCondition = THOST_FTDC_TC_GFD; req.VolumeCondition = THOST_FTDC_VC_AV; req.ContingentCondition = THOST_FTDC_CC_Immediately;CTP的报单和撤单都会通过OnRspOrderInsert和OnRtnOrder回调反馈。OnRspOrderInsert是报单请求的语法和权限校验结果,OnRtnOrder才是订单被交易所接受后的状态变化。很多新人在OnRspOrderInsert里看到错误码非零了还在等OnRtnOrder,这是不对的——前者报错的话,订单根本没提交到交易所。
撤单上有一个很重要的经验:不要用“撤一遍不行就再撤一遍”的蛮力方式。你要先记录下单返回的OrderRef和FrontID,撤单时通过CThostFtdcInputOrderAction指定FrontID、SessionID和OrderRef,否则撤单请求可能被柜台拒绝。如果真的出现撤不掉的情况,通常是合约处于集合竞价阶段或涨停/跌停板位置,这时候系统性的连续撤单不仅没用,还可能被风控系统判定为异常交易行为。
4.4 CTPSDK的时区与日期处理
CTP的行情和交易时间戳大多是本地时间(北京时间),但部分字段也涉及到交易所的交易日概念。比如TradingDay参数返回的是当前交易日(夜间交易时段则返回下一个交易日),ActionDay则代表自然日。做日频统计和持仓计算时,如果不区分这两个字段,很容易在夜盘时段把日期算错。
我建议所有CTP相关代码在启动时就从OnFrontConnected回调里获取并记录TradingDay,在程序运行期间不做动态修改。跨日运行时(比如夜盘跨到第二天凌晨),不要依赖系统时间来判断交易日,直接读取行情/交易回调里的TradingDay字段最稳妥。
5. 数字货币API实战:签名、限频与订单可靠性
数字货币API虽然接入门槛低,但真正把它用在实盘策略里,还是有很多值得注意的细节。我用币安的API举例,因为它的文档最完整、生态最成熟,但同样的方法论可以沿用到其他主流交易所。
5.1 签名机制与安全实践
币安的REST API签名采用HMAC-SHA256。你需要把timestamp、recvWindow以及所有请求参数按字典序拼接成字符串,再用Secret Key做HMAC-SHA256,拿到签名后放到请求的signature参数里。
具体来说,比如查询账户信息:
GET /api/v3/account?timestamp=1700000000000&recvWindow=5000 Signature = HMAC_SHA256(secret_key, "timestamp=1700000000000&recvWindow=5000")在Python里可以直接用requests库,但在实际项目中我建议封装一层统一的签名客户端,把时间戳、签名、请求日志都管理起来。这样一方面减少重复代码,另一方面也好排查问题——数字货币API报错时,错误信息里经常会带上你自己的请求内容,但是如果你没有打印完整请求参数,排查会很痛苦。
安全方面我再唠叨一遍:API Key的权限一定要最小化。每个交易所对Key的权限控制粒度不同,有的支持“仅只读”模式,有的支持“禁止交易”模式。如果你只是需要行情数据,那就用不带交易权限的Key;如果你需要程序化交易,务必开启IP白名单,只允许你服务器IP访问。不要在任何代码仓库、配置文件或聊天工具里保存Secret Key,建议用环境变量或专门的密钥管理服务来加载。
5.2 行情接入:WebSocket是主力,REST做兜底
数字货币的行情接入优先走WebSocket。它的实时性最好,能主动推送Tick、K线、成交明细等数据。我在实际使用中采用双通道策略:WebSocket作为主行情源,同时每3秒或5秒用REST拉一次最新价格做对账。如果WebSocket推送中断,策略能靠REST数据兜底,不至于完全失明。
WebSocket接入最关键的坑是心跳。交易所一般会每隔一段固定时间发送一个Ping帧,客户端必须正确响应Pong帧,否则连接会被断开。币安是每隔20秒发一次Ping,收到后得立刻返回Pong。如果你用的是第三方库,要确认库有没有自动处理Ping/Pong;如果是自己写WebSocket客户端,一定要单独开一个协程来处理心跳,不能和业务处理耦合在一起。
断线重连也是必做的功能。我的经验是断线后采用“指数退避”重连策略:第一次立即重连,如果失败则等1秒,再失败等2秒、4秒、8秒,最多不超过30秒。重连成功后还要主动重新订阅之前的行情频道,并且清掉断线期间可能错过的所有未确认状态。
5.3 下单可靠性:幂等、超时与对账
数字货币交易所的API偶尔会出现请求超时或返回状态不明的情况——请求发出去之后网络断了,订单到底有没有成交,你完全不知道。所以下单接口必须设计成幂等的:每个订单都带上客户端自定义的newClientOrderId,如果重复提交同一个ID,交易所会返回已有订单的信息,而不会创建新订单。这个功能非常实用,我在多个交易所上都验证过。
下单之后,要建立一个订单状态轮询机制:先依赖推送的orderUpdate,如果推送丢失或延迟,就靠REST轮询/api/v3/order接口来确认最终状态。轮询频率不要太激进,否则容易触发限频。我一般1秒轮询一次,配合推送基本能做到秒级同步。
数字货币API还有一个特殊现象:某些操作因为“资金不足”或“价格超出允许范围”会被拒绝,但这类拒绝的错误码不统一,有的交易所返回-1013,有的返回`-2011》。写代码时不要只对特定错误码处理,建议有一个兜底分支,把未知错误码也记录到日志里,而不是直接忽略或直接重试。
if response["code"] == -2011: logger.error("余额不足或订单状态异常") elif response["code"] == -1013: logger.error("下单参数异常") else: logger.error("未知错误码: %s", response) // 人工介入前先不自动重试,防止重复下单这是我踩过大坑后的教训:之前某个策略遇到未知错误码自动重试,结果把一笔订单下了两遍,事后对账才发现仓位对不上。从那以后凡是未知错误,我一律停止自动操作,报警等人工处理。
5.4 资金费率与合约特有逻辑
数字货币永续合约和传统期货有很多不同,比如资金费率、标记价格、梯度维持保证金等。每8小时会结算一次资金费率,如果你的策略是不看资金费率的现货逻辑直接搬到合约上,可能会在结算时收到意外的资金费用支出。
对于高频或套利策略,建议在策略内部单独维护合约的持仓成本、已实现盈亏和未实现盈亏,不要完全依赖交易所返回的unrealizedProfit字段。原因是交易所的未实现盈亏计算方式(标记价格、最新价格、合理价格)在不同币种和不同时间点可能变化,不利于做策略内的风控。
6. 实盘接入前后,建议你反复检查的细节清单
写代码是最后一步,真正的工程难点在实盘切换前后的检查上。我整理了一份我在每次接入新接口前都会过一遍的清单,照着做能省去很多半夜被电话叫醒的麻烦。
6.1 账户与权限类检查
- 实盘账号是否已开通对应交易权限?XTP和CTP的实盘账号权限不是自动继承模拟盘的。
- 期货账户的CTP登录密码和交易密码是否一致?很多期货公司默认是同一个,但有的会区分。
- 数字货币API的Key权限是否为最小化,IP白名单是否设置了服务器出口IP?
- 是否知道当日交易日的准确日期?夜盘时段接入CTP时,尤其要确认
TradingDay字段。
6.2 系统健壮性检查
- 断线重连是否完整覆盖了所有组件的状态恢复?比如XTP的API重连后不仅要重新Connect,还要重新登录和等待就绪。
- 订单状态机是否覆盖了所有可能的回报路径?比如部分成交后撤单、拒单后自动处理、超时后状态未知等。
- 是否有完善的日志记录?建议每笔订单、每次成交、每次错误都带上本地时间戳和交易所回报原始数据的完整上下文。
- 对账逻辑是否跑通过?至少要做一次:把你本地记录的成交和交易所的成交记录做比对,确保一致。
6.3 风控与应急类检查
- 是否设置了单笔订单上限、单日累计亏损上限和最大持仓限制?
- 程序异常崩溃后,重启流程能否自动恢复正确状态?最容易出错的是重启后加载昨天的持仓或订单状态,必须从交易所端重新同步。
- 网络异常时,策略是否会暂停开新仓?如果策略还在继续发单而连接已断,订单只会在本地堆积,一旦恢复全部涌入,可能瞬间打爆仓位。
这些检查项不一定都需要自动化,但至少要形成制度。我个人经历中,很多重大交易事故的根因并不在策略逻辑本身,而在接口层的小细节——比如一个重连状态没处理好,或者一笔订单超时重复提交。程序化交易的利润本来就是靠系统和纪律一点点挤出来的,接口层做得越稳,策略层才有发挥空间。
7. 三类接口的核心差异速查表
| 对比维度 | CTP | XTP | 数字货币API |
|---|---|---|---|
| 适用市场 | 国内期货、期权 | 沪深A股、两融、ETF | 加密货币现货、合约 |
| 官方语言 | C++ | C++ | REST + WebSocket |
| 连接方式 | 前置机直连 | 前置机直连 | 公网API |
| 认证方式 | UserID + 密码 | AppID + RSA密钥 | API Key + Secret签名 |
| 登录后是否立即可交易 | 需先确认结算单 | 需等待前端就绪 | 签名通过即可 |
| 行情推送方式 | 全推模式 | 推送模式 | WebSocket推送 + REST拉取 |
| 实盘权限门槛 | 需期货公司开通 | 需券商开通 | 注册即可申请 |
| 典型坑点 | 结算单未确认、开平仓标志混淆 | 未就绪就下单、AppID并发冲突 | 时间戳偏差、签名参数顺序错误、限频触发 |
这个表你可以在选型复盘时直接拿去用。如果仍然不确定自己的业务适合走哪条路线,那就回到问题本身:你的交易标的是什么、交易频率多高、资金量级多大、合规通道是哪个。答案自然会浮出水面。