好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

CTP综合交易平台教程.pdf

16页
  • 卖家[上传人]:鲁**
  • 文档编号:570917353
  • 上传时间:2024-08-07
  • 文档格式:PDF
  • 文档大小:221.35KB
  • / 16 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • CTP综合交易平台教程基本介绍一、系统简介交易托管系统 API 是一个基于 C++ 的类库 , 通过使用和扩展类库提供的接口来实现相关交易功能,包括报单与报价的录入、报单与报价的撤销、报单与报价的挂起、报单与报价的激活、报单与报价的修改、报单与报价的查询、成交单查询、投资者查询、投资者持仓查询、合约查询、交易日获取等支持 MS VC 6.0 ,MS VC.NET 2003 编译器需要打开多线程编译选项/MT 二、体系结构交易员 API 使用建立在 TCP 协议之上 FTD 协议与交易托管系统进行通讯,交易托管系统负责投资者的交易业务处理2.1. 通讯模式FTD 协议中的所有通讯都基于某个通讯模式通讯模式实际上就是通讯双方协同工作的方式FTD 涉及的通讯模式共有三种:l 对话通讯模式l 私有通讯模式l 广播通讯模式对话通讯模式是指由会员端主动发起的通讯请求该请求被交易所端接收和处理,并给予响应例如报单、查询等这种通讯模式与普通的客户/服务器模式相同私有通讯模式是指交易所端主动,向某个特定的会员发出的信息例如成交回报等。

      广播通讯模式是指交易所端主动,向市场中的所有会员都发出相同的信息例如公告、市场公共信息等通讯模式和网络的连接不一定存在简单的一对一的关系也就是说,一个网络连接中可能传送多种不同通讯模式的报文,一种通讯模式的报文也可以在多个不同的连接中传送无论哪种通讯模式,其通讯过程都如图 1 所示 本接口暂时没有使用广播通信方式2.2. 数据流交易托管系统支持对话通讯模式、私有通讯模式、广播通讯模式:对话通讯模式下支持对话数据流和查询数据流:对话数据流是一个双向数据流,交易托管系统发送交易请求,交易系统反馈应答交易系统不维护对话流的状态系统故障时,对话数据流会重置,通讯途中的数据可能会丢失查询数据流是一个双向数据流,交易托管系统发送查询请求,交易系统反馈应答交易系统不维护查询流的状态系统故障时,查询数据流会重置,通讯途中的数据可能会丢失私有通讯 模式下支持私有数据流:私有流是一个单向数据流,由交易系统发向交易托管系统,用于传送交易员私有的通知和回报信息私有流是一个可靠的数据流,交易系统维护每个交易托管系统的私有流,在一个交易日内,交易托管系统断线后恢复连接时,可以请求交易系统发送指定序号之后的私有流数据。

      私有数据流向交易托管系统提供报单状态报告、成交回报更等信息广播通讯模式下支持公共数据流:公共数据流是一个单向数据流,由交易系统发向交易托管系统,用于发送市场公共信息;公共数据流也是一个可靠的数据流,交易系统维护整个系统的公共数据流,在一个交易日内,交易托管系统断线恢复连接时,可以请求交易系统发送指定序号之后的公共数据流数据接口模式交易 员 API 提供 了二 个接口,分别为 CThostFtdcTraderApi 和 CThostFtdcTraderSpi 这两个接口对 FTD 协议进行了封装,方便客户端应用程序的开发客户端应用程序可以通过CThostFtdcTraderApi 发出操作请求,通继承CThostFtdcTraderSpi 并重载回调函数来处理后台服务的响应1. 对话流和查询流编程接口通过对话流进行通讯的编程接口通常如下:请求: int CThostFtdcTraderApi::ReqXXX(CThostFtdcXXXField *pReqXXX,int nRequestID) 响应: void CThostFtdcTraderSpi::OnRspXXX(CThostFtdcXXXField *pRspXXX,CThostFtdcRspInfoField *pRspInfo,int nRequestID,bool bIsLast) 其中请求接口第一个参数为请求的内容,不能为空。

      第二个参数为请求号请求号由客户端应用程序负责维护,正常情况下每个请求的请求号不要重复在接收交易托管系统的响应时,可以得到当时发出请求时填写的请求号,从而可以将响应与请求对应起来当收到后台服务应答时, CThostFtdcTraderSpi 的回调函数会被调用如果响应数据不止一个,则回调函数会被多次调用回调函数的第一个参数为响应的具体数据,如果出错或没有结果有可能为NULL第二个参数为处理结果,表明本次请求的处理结果是成功还是失败在发生多次回调时,除了第一次回调,其它的回调该参数都可能为 NULL第三个参数为请求号,即原来发出请求时填写的请求号第四个参数为响应结束标志,表明是否是本次响应的最后一次回调2. 私有流编程接口私有流中的数据中会员的私有信息,包括报单回报、成交回报等通过私有流接收回报的编程接口通常如下: void CThostFtdcTraderSpi::OnRtnXXX(CThostFtdcXXXField *pXXX) 或 void CThostFtdcTraderSpi::OnErrRtnXXX(CThostFtdcXXXField *pXXX,CThostFtdcRspInfoField *pRspInfo) 当收到交易托管系统通过私有流发布的回报数据时,CThostFtdcTraderSpi的回调函数会被调用。

      回调函数的参数为回报的具体内容运行模式工作线程交易员客户端应用程序至少由两个线程组成,一个是应用程序主线程,一个是交易员API 工作线程应用程序与交易系统的通讯是由 API 工作线程驱动的CThostFtdcTraderApi 提供的接口是线程安全的,可以有多个应用程序线程同时发出请求CThostFtdcTraderSpi 提供的接口回调是由 API 工作线程驱动,通过实现 SPI 中的接口方法,可以从交易托管系统收取所需数据如果重载的某个回调函数阻塞,则等于阻塞了 API 工作线程, API 与交易系统的通讯会停止因此,在 CThostFtdcTraderSpi 派生类的回调函数中,通常应迅速返回,可以利用将数据放入缓冲区或通过 Windows 的消息机制来实现 本地文件交易员 API 在 运 行 过程 中 , 会 将 一 些 数据 写 入本 地 文件 中 调 用CreateFtdcTraderApi 函数,可以传递一个参数,指明存贮本地文件的路径该路径必须在运行前已创建好本地文件的扩展名都是".con" 开发接口通用规则客户端和交易托管系统的通讯过程分为 2 个阶段:初始化阶段和功能调用阶段。

      在初始化阶段,程序必须完成如下步骤(具体代码请参考开发实例): 1, 产生一个 CThostFtdcTraderApi 实例2, 产生一个事件处理的实例3, 注册一个事件处理的实例4, 订阅私有流5, 订阅公共流6, 设置交易托管服务的地址在功能调用阶段,程序可以任意调用交易接口中的请求方法,如 ReqOrderInsert 等同时按照需要响应回调接口中的其他注意事项:1,API 请求的输入参数不能为 NULL 2,API 请求的返回参数,0 表示正确,其他表示错误,详细错误编码请查表CThostFtdcTraderSpi 接口CThostFtdcTraderSpi实现了事件通知接口用户必需派生CThostFtdcTraderSpi接口,编写事件处理方法来处理感兴趣的事件由于回调函数众多,在此不一一举例,只说明几个经典函数的功能与用法,其它函数可举一反三1.OnFrontConnected 方法当客户端与交易托管系统建立起通信连接时(还未登录前),该方法被调用函数原形: void OnFrontConnected();本方法在完成初始化后调用,可以在其中完成用户登录任务2.OnFrontDisconnected 方法当客户端与交易托管系统通信连接断开时,该方法被调用。

      当发生这个情况后,API 会自动重新连接,客户端可不做处理自动重连地址,可能是原来注册的地址,也可能是系统支持的其它可用的通信地址,它由程序自动选择函数原形: void OnFrontDisconnected (int nReason);参数: nReason:连接断开原因 0x1001 网络读失败0x1002 网络写失败0x2001 接收心跳超时0x2002 发送心跳失败0x2003 收到错误报文3.OnRspUserLogin 方法当客户端发出登录请求之后,交易托管系统返回响应时,该方法会被调用,通知客户端登录是否成功函数原形: void OnRspUserLogin( CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) ;参数: pRspUserLogin :返回用户登录信息的地址用户登录信息结构:struct CThostFtdcRspUserLoginField {/// 交易日TThostFtdcDateTypeTradingDay; /// 登录成功时间TThostFtdcTimeTypeLoginTime; /// 经纪公司代码TThostFtdcBrokerIDTypeBrokerID; /// 用户代码TThostFtdcUserIDType UserID; /// 交易系统名称TThostFtdcSystemNameTypeSystemName; }; pRspInfo :返回用户响应信息的地址。

      特别注意在有连续的成功的响应数据时,中间有可能返回 NULL,但第一次不会,以下同错误代码为 0 时,表示操作成功,以下同响应信息结构:struct CThostFtdcRspInfoField {/// 错误代码TThostFtdcErrorIDType ErrorID; /// 错误信息TThostFtdcErrorMsgType ErrorMsg; }; nRequestID :返回用户登录请求的 ID,该 ID 由用户在登录时指定bIsLast :指示该次返回是否为针对 nRequestID 的最后一次返回4.OnRspOrderInsert 方法报单录入应答当客户端发出过报单录入指令后,交易托管系统返回响应时,该方法会被调用函数原形: void OnRspOrderInsert( CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) ;参数: pInputOrder :指向报单录入结构的地址,包含了提交报单录入时的输入数据,和后台返回的报单编号。

      输入报单结构:struct CThostFtdcInputOrderField { /// 经纪公司代码TThostFtdcBrokerIDTypeBrokerID; /// 投资者代码TThostFtdcInvestorIDTypeInvestorID; /// 合约代码TThostFtdcInstrumentIDTypeInstrumentID; /// 报单引用TThostFtdcOrderRefTypeOrderRef; /// 用户代码TThostFtdcUserIDType UserID; /// 报单价格条件 TThostFtdcOrderPriceTypeTypeOrderPriceType; /// 买卖方向TThostFtdcDirectionTypeDirection; /// 组合开平标志TThostFtdcCombOffsetFlagType CombOffsetFlag; /// 组合投机套保标志TThostFtdcCombHedgeFlagType CombHedgeFlag; /// 价格TThostFtdcPriceTypeLimitPrice; /// 数量TThostFtdcVolumeType VolumeTotalOriginal; /// 有效期类型TThostFtdcTimeConditionTypeTimeCondition; ///GTD 日期TThostFtdcDateTypeGTDDate; /// 成交量类型TThostFtdcVolumeConditionType VolumeCondition; /// 最小成交量TThostFtdcVolumeType MinVolume; /// 触发条件TThostFtdcContingentConditionTypeContingentCondition; /// 止损价TThostFtdcPriceTypeStopPrice; /// 强平原因TThostFtdcForceCloseReasonTypeForceCloseReason; /// 自动挂起标志TThostFtdcBoolTypeIsAutoSuspend; /// 业务单元TThostFtdcBusinessUnitTypeBusinessUnit; /// 请求编号TThostFtdcRequestIDTypeRequestID;}; pRspInfo :指向响应信息结构的地址。

      响应信息结构:struct CThostFtdcRspInfoField{ /// 错误代码TThostFtdcErrorIDType ErrorID; /// 错误信息TThostFtdcErrorMsgTypeErrorMsg; }; nRequestID :返回报单录入操作请求的 ID ,该 ID 由用户在报单录入时指定bIsLast :指示该次返回是否为针对 nRequestID 的最后一次返回5.OnRspOrderAction 方法/// 报单操作请求响应virtual void OnRspOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {}; 6./// 请求查询交易通知响应virtual void OnRspQryTradingNotice(CThostFtdcTradingNoticeField *pTradingNotice, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {}; 7./// 请求查询交易通知响应virtual void OnRspQryTradingNotice(CThostFtdcTradingNoticeField *pTradingNotice, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {}; CThostFtdcTraderApi接口CThostFtdcTraderApi 接口提供给用户的功能包括,报单与报价的录入、报单与报价的撤销、报单与报价的挂起、报单与报价的激活、报单与报价的修改、报单与报价的查询、成交单查询、会员客户查询、会员持仓查询、客户持仓查询、合约查询、合约交易状态查询、交易所公告查询等功能。

      以下简单举些例子说明函数的用法,其它函数可举一反三1.CreateFtdcTraderApi方法 产生一个 CThostFtdcTradeApi的一个实例,不能通过 new 来产生函数原形:static CThostFtdcTradeApi *CreateFtdcTradeApi(const char *pszFlowPath = ""); 参数:pszFlowPath :常量字符指针,用于指定一个文件目录来存贮交易托管系统发布消息的状态默认值代表当前目录返回值:返回一个指向 CThostFtdcTradeApi 实例的指针2.ReqUserLogin 方法用户发出登陆请求函数原形:int ReqUserLogin(CThostFtdcReqUserLoginField *pReqUserLoginField,int nRequestID);参数:pReqUserLoginField :指向用户登录请求结构的地址用户登录请求结构:struct CThostFtdcReqUserLoginField { /// 交易日TThostFtdcDateTypeTradingDay; /// 经纪公司代码TThostFtdcBrokerIDTypeBrokerID; /// 用户代码TThostFtdcUserIDType UserID; /// 密码TThostFtdcPasswordTypePassword; /// 用户端产品信息TThostFtdcProductInfoType UserProductInfo; /// 接口端产品信息TThostFtdcProductInfoType InterfaceProductInfo; /// 协议信息 TThostFtdcProtocolInfoType ProtocolInfo; }; nRequestID :用户登录请求的 ID ,该 ID 由用户指定,管理。

      用户需要填写 UserProductInfo 字段,即客户端的产品信息,如软件开发商、版本号等,例如:SFITTraderV100 InterfaceProductInfo 和 ProtocolInfo 只须占位,不必有效赋值0,代表成功1,表示网络连接失败;-2,表示未处理请求超过许可数;-3,表示每秒发送请求数超过许可数3.ReqOrderAction 方法客户端发出报单操作请求,包括报单的撤销、报单的挂起、报单的激活、报单的修改函数原形:int ReqOrderAction(CThostFtdcOrderActionField *pOrderAction,int nRequestID);参数:pOrderAction :指向报单操作结构的地址报单操作结构:/// 报单操作struct CThostFtdcOrderActionField { /// 经纪公司代码TThostFtdcBrokerIDType BrokerID; /// 投资者代码TThostFtdcInvestorIDType InvestorID; /// 报单操作引用TThostFtdcOrderActionRefType OrderActionRef; /// 报单引用TThostFtdcOrderRefType OrderRef; /// 请求编号TThostFtdcRequestIDType RequestID; /// 前置编号TThostFtdcFrontIDType FrontID; /// 会话编号TThostFtdcSessionIDType SessionID; /// 交易所代码TThostFtdcExchangeIDType ExchangeID; /// 报单编号TThostFtdcOrderSysIDType OrderSysID; /// 操作标志TThostFtdcActionFlagType ActionFlag; /// 价格TThostFtdcPriceType LimitPrice; /// 数量变化TThostFtdcVolumeType VolumeChange; /// 操作日期TThostFtdcDateType ActionDate; /// 操作时间TThostFtdcTimeType ActionTime; /// 交易所交易员代码TThostFtdcTraderIDType TraderID; /// 安装编号TThostFtdcInstallIDType InstallID; /// 本地报单编号TThostFtdcOrderLocalIDType OrderLocalID; /// 操作本地编号TThostFtdcOrderLocalIDType ActionLocalID; /// 会员代码TThostFtdcParticipantIDType ParticipantID; /// 客户代码TThostFtdcClientIDType ClientID; /// 业务单元TThostFtdcBusinessUnitType BusinessUnit; /// 报单操作状态 TThostFtdcOrderActionStatusType OrderActionStatus; /// 用户代码TThostFtdcUserIDType UserID; /// 状态信息TThostFtdcErrorMsgType StatusMsg; /// 合约代码TThostFtdcInstrumentIDType InstrumentID; }; nRequestID :用户报单操作请求的 ID ,该 ID 由用户指定,管理。

      返回值:0,代表成功1,表示网络连接失败;-2,表示未处理请求超过许可数;-3,表示每秒发送请求数超过许可数4.ReqQryInstrument方法请求查询合约函数原形:int ReqQryInstrument(CThostFtdcQryInstrumentField *pQryInstrument,int nRequestID);参数:pQryInstrument:指向查询查询合约结构的地址查询合约结构:struct CThostFtdcQryInstrumentField { /// 合约代码TThostFtdcInstrumentIDType InstrumentID; /// 交易所代码TThostFtdcExchangeIDType ExchangeID; /// 合约在交易所的代码 TThostFtdcExchangeInstIDType ExchangeInstID; /// 产品代码TThostFtdcInstrumentIDType ProductID; }; nRequestID :合约查询请求的 ID ,该 ID 由用户指定,管理返回值:0,代表成功1,表示网络连接失败;-2,表示未处理请求超过许可数;-3,表示每秒发送请求数超过许可数CTP 平台的特点综合交易平台(Comprehensive Transaction Platform)是专门为期货公司开发的一套期货经纪业务管理系统,由交易、风险控制和结算三大系统组成,交易系统主要负责订单处理、行情转发及银期转账业务,结算系统负责交易管理、帐户管理、经纪人管理、资金管理、费率设置、日终结算、信息查询以及报表管理等,风控系统则主要在盘中进行高速的实时试算,以及时揭示并控制风险。

      系统能够同时连通国内四家期货交易所,支持国内商品期货和股指期货的交易结算业务,并能自动生成、报送保证金监控文件和反洗钱监控文件综合交易平台借鉴代表了目前国际衍生品领域交易系统先进水平的上期所“ 新一代交易所系统”的核心技术,采用的创新的完全精确重演的分布式体系架构,其保证所有输入经系统分布式并行处理后均有确定结果,并能自适应 UDP 可靠多播通讯技术,构建交易系统的核心信息总线,改进了内存数据库的多重索引技术、直接外键技术和高效事务管理技术,并首创了多业务主机同时工作、互为备份和自由加入的集群容错可靠性保障机制,攻克了性能和可靠性关键技术难关,获得 5 项软件著作权系统并发处理能力强大,委托性能超过 2000 笔/秒,软件本身可达 8000 笔/秒,支持同时客户并发数为 1 万个客户 /秒,且可以通过增加前置机进一步扩充系统主要面向期货公司,也可用于基金公司、投资公司等进行期货交易毫秒字段变动提示 最近, CTP 接收的行情里面,毫秒字段由原来的0 和 500 变成 300 和 800,这将给部分投资者的策略造成影响解决办法:一般情况,之所以有毫秒字段,是为了区分同一秒的两笔行情,在程序里面不需将毫秒的值写成固定值,可以用该字段是否相等,或对比大小来解决。

      追单操作需等到撤单成功后再执行有时候,发的委托单未成交,需要先撤单,然后再重新发委托,最好不要撤单后,不等撤单成功信息返回就追单,有时候如果资金不足,会造成无法追单,因为未撤掉的单子,还是有占用保证金的撤单后,可以在报单通知函数OnRtnOrder() 里面监测是否已经撤单成功,当报单状态order->OrderStatus等于 5 时,表示撤单成功,此时再进行重新下单操作。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.