# 概述

# MdApi工作流程

MdApi是CTP的行情接口,主要实现订阅、接收行情的功能。MdApi的工作流程可以概况为以下八步:

  • 第一步,用CreateFtdcMdApi创建CThostFtdcMdApi实例,例如_api。

  • 第二步,创建CThostFtdcMdSpi实例,例如_spi,用RegisterSpi将_spi注册到_api中。

  • 第三步,用RegisterFront将行情前置地址注册到_api中。

  • 第四步,用Init()初始化_api,初始化的过程就是与服务建立连接的过程。

  • 第五步,与服务器成功建立连接时,回调函数OnFrontConnect会收到通知,此时用ReqUserLogin登录账户。

  • 第六步,账户登录成功时,回调函数OnRspUserLogin会收到通知,此时用SubscribeMarketData订阅行情,用SubscribeForQuoteRsp订阅询价。此后,MdApi就可以正常工作了。

  • 第七步,MdApi正常工作时,交易者需要在回调函数OnRtnDepthMarketData/OnRtnForQuoteRsp会收到最新行情通知时进行数据处理或者分发。

  • 第八步,MdApi的本质是个子进程,所以需要调用Join方法,让主进程等待,才能正常运行。如果遇到连接成功后立即触发OnFrontDisconnected,错误代码8193,就可能是没有调用Join方法。

一般情况下,量化交易框架都会对第一至六步,以及第八步的操作进行封装,交易者只需要传递相关参数即可。需要交易者真正关心的是第七步,涉及到数据处理和数据分发。

# TraderApi工作流程

TraderApi是CTP的交易口,主要实现(买卖开平撤)报单及查询的功能。TraderApi的工作流程可以概况为以下十步:

  • 第一步,用CreateFtdcTraderApi创建CThostFtdcTraderApi实例,例如_api。

  • 第二步,创建CThostFtdcTraderSpi实例,例如_spi,用RegisterSpi将_spi注册到_api中。

  • 第三步,用SubscribePrivateTopic订阅私有流,用SubscribePublicTopic订阅公有流。

  • 第四步,用RegisterFront将交易前置地址注册到_api中。

  • 第五步,用Init()初始化_api,初始化的过程就是与服务建立连接的过程。

  • 第六步,与服务器成功建立连接时,回调函数OnFrontConnect会收到通知,此时用ReqUserAuthMethod认证客户端。

  • 第七步,客户端认证成功时,回调函数OnRspUserAuthMethod会收到通知,此时用ReqUserLogin登录账户。

  • 第八步,账户登录成功,回调函数OnRspUserLogin会收到通知,此时标记状态。此后,TraderApi就可以正常工作了。

  • 第九步,TraderApi正常工作时,交易者根据需要用Req开头的请求函数进行(买卖开平撤)报单及查询,对应的以On开头的回调函数会收到结果通知。

  • 第十步,TraderApi的本质也是个子进程,所以也需要调用Join方法,让主进程等待,才能正常运行。

# Api函数命名规则

除了初始化Api环境时用到的函数之外,其他功能函数可以根据前缀分为以下几类:

  • Req,执行请求。例如,确认结算单ReqSettlementInfoConfirm,录入报单ReqOrderInsert,录入撤单ReqOrderAction等。

  • OnRsp,请求结果的通知。除(买卖开平撤)报单之外的请求,在执行成功之后获得通知,例如确认结算单通知OnRspSettlementInfoConfirm表示已成功确认结算单。(买卖开平撤)报单请求,在该请求通过交易前置时获得通知,此通知仅代表请求被交易前置接受,后续还需要进入交易队列、被执行等过程。例如,录入报单通知OnRspOrderInsert表示请求被前置接受情况。

  • OnRtn,(买卖开平撤)报单请求的状态变化通知,或者公有流通知。以报单为例,报单状态每次发生变化,都会在OnRtnOrder中收到通知,当报单成交时,还会在OnRtnTrade中收到通知。OnRtnInstrumentStatus就是公有流通知的例子。

  • OnErrRtn,执行错误结果的通知。例如上期所品种今/昨仓不足。未到交易所的错误结果在OnRsp中获得通知,只有到了交易所被执行时的错误,才在OnErrRtn中通知。

  • ReqQry,查询请求。例如,查询报单ReqQryOrder,查询成交ReqQryTrade。

  • OnRspQry,查询结果的通知。查询结果通知比较简单,一般就是一个查询请求对应一个查询结果。