ReqUserLogout ctp行情 java 源代码ctp 有没有登出功能?

[转载]CTP初次接触四:网友的可实盘DEMO
有网友,在前两个Demo的基础上,开发了一个可实盘的Demo,刚好有代码,就一并学习一下。
同样是VC++的控制台程序,程序可以实现一个品种的交易,如果连续TICK数据创新高的话,实现开仓,以及相应的止赢和止损。
我们看文件,除了红色外,其余都是在前面两个Demo里认识的。所以,重点在于Common.h,DataSniffer.h和MyTrader.h文件,Common.h定义了一些共用函数,DataSniffer负责交易数据的处理和计算(tick或是K线),并给出开仓信号。MyTrader是交易处理,开平仓和止赢止损。
还要做点准备工作,先申请一个模拟帐户,我可不想直接用实盘来测试。
上海期货信息技术有限公司 提供的仿真注册地址
这样,我可以获得CTP需要的一些地址、用户名、密码。注册后要第二天,才能正常测试登陆。
char& FRONT_ADDR_3A[] =
"tcp://180.168.146.187:10000";&//
前置地址3交易:模拟交易
char& FRONT_ADDR_3B[] =
"tcp://180.168.146.187:10010";&// 前置地址3行情:模拟交易
//我的模拟号
TThostFtdcBrokerIDType&BROKER_ID =
"9999";&&&&&&&//
经纪公司代码:模拟
TThostFtdcInvestorIDType INVESTOR_ID =
"******";&&&&&&//
投资者代码:模拟
TThostFtdcPasswordType& PASSWORD =
"******";&&&&&&&//
用户密码:模拟
我们要看看他们是如何工作的。程序入口在AutoTrader.cpp
一:先起来打扫卫生:Erasefiles,清理流文件(临时文件,存放系统数据),然后休息了一下&Sleep(2000)。
二:生成CThostFtdcTraderApiCTraderSpi交易类实体,CThostFtdcMdApiCThostFtdcMdSpi行情类实体
三:读取一些默认的配置信息,ReadConfiguration,初始化工作完成。
四:然后进入行情跟踪,&&Sniffer(),数据、信息的处理应该在这里,策略和信号也写在这里;
五:进入交易处理,Trading(),委托下单等处理在这里;
&Erasefiles();
&Sleep(2000);
"---&&& " && "Welcom MyAutoTrader System!" &&
&cerr && "---&&& " &&
"Version 1.0.0!" &&
&// 初始化UserApi
&pUserApi =
CThostFtdcTraderApi::CreateFtdcTraderApi("./thosttraderapi.dll");&&&//
创建UserApi//"./thosttraderapi.dll"
&CTraderSpi* pUserSpi = new CTraderSpi();
&pUserApi-&RegisterSpi((CThostFtdcTraderSpi*)pUserSpi);&&&//
注册事件类
&pUserApi-&SubscribePublicTopic(THOST_TERT_RESTART);&&&&//
注册公有流
&pUserApi-&SubscribePrivateTopic(THOST_TERT_RESTART);&&&//
注册私有流
&pUserApi-&RegisterFront(FRONT_ADDR_1A);&&&&&&&//
&pUserApi-&Init();
&cerr && "---&&& " &&
"Initialing UserApi" &&
初始化MdApi
CThostFtdcMdApi::CreateFtdcMdApi("./thostmduserapi.dll");&&&&&//
创建MdApi//"./thostmduserapi.dll"
&CThostFtdcMdSpi* pMdSpi = new CMdSpi();
&pMdApi-&RegisterSpi(pMdSpi);&&&&&&&&&//
注册事件类
&pMdApi-&RegisterFront(FRONT_ADDR_1B);&&&&&&&//
connect&&优先行情地址
&pMdApi-&RegisterFront(FRONT_ADDR_2B);&&&&&&&//
connect&&备用行情地址,1B断开,自动连接2B地址
&pMdApi-&Init();
&cerr && "---&&& " &&
"Initialing MdApi" &&
&//pMdApi-&Join();
&//pMdApi-&Release();
&Sleep(6000);
&ReadConfiguration("./AutoTrader.dat");&&&//自定义数据,如持仓数据等均可
&cerr && "---&&& " &&
"初始化完成!" &&
&&//指标计算,下面只是个简单例子
&&//可自建函数,进行复杂处理&
见DataSniffer.h
&&Sniffer();
&&//下单控制
&&//可自建函数,单独复杂处理&见MyTrader.h
&&Trading();
&&Sleep(050);
我们看看Sniffer的行情处理,相当于计算行情出交易信号,Sniffer在DataSniffer.h里。这个函数里,写了一个高频策略,他取得3次的TICK数据,如果连续3个TICK上涨,他认为是一次好的买入机会,把某个标志改成“需要买入”状态。同理,还有“需要卖出”状态。
Sniffer()&//监听Tick数据已经指标计算
&if (RunMode
&& Q_BarTime_2&=0.1500 && CloseAll==false)
&&cerr && "---&&&
" &&TradingDay&&"准备收盘!" &&
&&cerr && "---&&&
" &&"WriteConfiguration!" &&
&&WriteConfiguration("./AutoTrader.cfg");&&&&//备份数据
&&Sleep(3000);
&&//ErasingTradeConfiguration();
&&cerr && "---&&&
" &&TradingDay&&"收盘!" &&
&&CloseAll=
(TickAPrice[0]&TickAPrice[1] &&
TickAPrice[1]&TickAPrice[2] &&
TickAPrice[2]&TickAPrice[3])
&&&TickABS=1;&//连续3个TICK涨,buy
&&else if (TickAPrice[0]
&&&TickABS=2;&//连续3个TICK跌,Sell
&&&TickABS=0;
我们看看Trading的交易处理,根据行情信号Sniffer,进行下单Trading。
1、他先看看,前面有没有单了,如果有单子,看看是否需要止赢和止损不。StopLoss(),里面代码的细节和我们平时说的止赢止损是一样的;
2、然后他就读了前面Sniffer给出的买卖信号。以买信息为例:先看看有没有空单,有的话,先平掉SendOrder(INSTRUMENT_ID,
0, 3)。买平成功后,下买开仓委托单:SendOrder(INSTRUMENT_ID, 0,
3、sendorder是一个在Common.h里自定义的一个函数。根据参数不同,他可以实现买开、卖开、买平、卖平这些功能。它相当于对CTP-API的ReqOrderInsert封装吧,这个函数参数很复杂,封装起来使用方便多了。
至此,代码一个循环就结束了。系统继续监测行情的变化、判断计算信息、并做出交易处理。
几个细节,我们需要再看一下。
细节1、之前行情处理时,用到3个tick数据的比较,这些数据存在一个数组里TickAPrice[]。CMdSpi类在接到服务器的数据后,会触发函数OnRtnDepthMarketData,这个函数将最新的tick数据保存到数组里,并将之前3个tick的数据也保存起来,供后面策略进行tick数据比较。
同时,将tick数据保存到了txt文件里。./TickData/ag2.txt
o_file(TickFileWritepaths,ios::app);
&o_file &&......&&
细节2、OnRtnDepthMarketData这个函数还做了一件重要的事情,就是生成了1分钟K线,这个demo没有保存1分钟数据。在第三方交易平台上,使用K线数据是很自然的事情,但是自已开发的平台,则需要自己维护K线数据了,这是一件很基础、很重要、很繁琐的事情。
细节3、因为软件是控制台的程序,所以需要下载一个快期的交易程序进行对比,看看下单、交易是否正常。
控制台程序跑起来的样子
控制台下单时的输出情况
快期的交易程序进行对比,控制台下单后,快期就可以看到持仓(数据太快了,下了委托直接就成交了)
注:我没有深入调试他开仓和止赢止损的代码,执行结果看,有些不太如意的地方。但这不妨碍我们理解这个demo。
如果我们想对下单、撤单等等交易动作有深入了解,那就得进入细节,了解DLL里有哪些功能和函数了。某论坛的ID"用python的交易员"说了函数的分类,
Api类包括的主动函数通常分为以下三种:
1、Create…,类的静态方法,用于创建API对象,传入参数是用来保存API通讯.con文件的文件夹路径。
2、Req…开头的函数,可以由用户主动调用的业务逻辑请求,传入参数通常包括2个:业务请求结构体指针和一个请求号的整数。
3、其他非Req…开头的函数,包括初始化、订阅数据流等等参数较为简单的功能,传入参数的数量和类型视乎函数功能不一定。
Spi(包括MdSpi和TraderSpi)类的回调函数基本上可以分为以下四种:
1、以On…开头,这种回调函数通常是返回API连接相关的信息内容,与业务逻辑无关,返回值(即回调函数的参数)通常为空或是简单的整数类型。
2、以OnRsp…开头,这种回调函数通常是针对用户的某次特定业务逻辑操作返回信息内容,返回值通常会包括4个参数:业务逻辑相关结构体的指针,错误信息结构体的指针,本次操作的请求号整数,是否是本次操作最后返回信息的布尔值。其中OnRspError主要用于一些通用错误信息的返回,因此返回的值中不包含业务逻辑相关结构体指针,只有3个返回值。
3、以OnRtn…开头,这种回调函数返回的通常是由柜台向用户主动推送的信息内容,如客户报单状态的变化、成交情况的变化、市场行情等等,因此返回值通常只有1个参数,为推送信息内容结构体的指针。
4、以OnErrRtn…开头,这种回调函数通常由于用户进行的某种业务逻辑操作请求(挂单、撤单等等)在交易所端触发了错误,如用户发出撤单指令、但是该订单在交易所端已经成交,返回值通常是2个参数,即业务逻辑相关结构体的指针和错误信息的指针。
至此,我们大致了解这个程序的逻辑。它实现了:用CTP登陆服务器、获取和保存tick数据、实现了tick策略,计算1分钟K线、下单和止赢止损。已经很不错了。
1、策略原代码在这里下载
2、模拟帐号在这里申请
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。基于CTP的程序化交易系统开发(一)
基于CTP的程序化交易系统开发(一)
自从综合交易平台(CTP)的API开放以来,很多人开始编写自己的程序化交易系统,今天我想说说自己的一些看法。
首先解读一下CTP的接口说明,CTP的API使用建立在TCP协议之上FTD协议(《期货交易数据交换协议》)与交易托管系统进行通讯,而交易托管系统负责投资者的交易业务处理。FTD 协议中规定了所有的通讯都基于某一种通讯模式。
交易涉及的通讯模式共有三种:
1.对话通讯模式,是指由会员端主动发起的通讯请求。该请求被交易所端接收和处理,并给予响应。例如报单、查询等。这种通讯模式与普通的客户/服务器模式相同。
2.私有通讯模式,是指交易所端主动,向某个特定的会员发出的信息。例如成交
3.广播通讯模式,是指交易所端主动,向市场中的所有会员都发出相同的信息。
例如公告、市场公共信息等。
CTP的交易API提供了两个接口,分别为CThostFtdcTraderApi 和CThostFtdcTraderSpi
我们自己开发的交易系统通过CThostFtdcTraderApi向CTP发送操作请求,通过CThostFtdcTraderSpi接收CTP的任何响应。
现在把主要的业务举例在下表中
行情涉及的通讯模式共有两种:
1.对话通讯模式,同交易一样,是指由会员端主动发起的通讯请求。该请求被交易所端接收和处理,并给予响应。例如登录,退订等。
2.广播通讯模式,主要是行情订阅,当订阅行情后交易所端主动向会员连续主动发出行情信息。
CThostFtdcMdApi
CThostFtdcMdSpi
ReqUserLogin
OnRspUserLogin
SubscribeMarketData
OnRspQryDepthMarketData
UnSubMarketData
OnRspUnSubMarketData
可见,通过CTP提供的接口,我们可以向CTP发送业务申请,也不断的按照三种通讯模式中的其中一种接收CTP的响应。因此我们写的交易系统中至少就应该有两个线程,一个称其为主业务线程,负责对CTP发出业务申请;另一个线程为API工作线程,负责接收CTP通过广播通讯模式,对话通讯模式,私有通讯模式其中一种模式对交易系统的响应。
综上所述,我们的程序化交易系统需要完成的业务可以划分为:
1.基本操作,比如登录,订阅等;
2.行情操作,比如对行情数据的接收,存储等
3.订单操作,比如报单;对报单,成交状况的查询;报单,成交状况的私有回报等。
4.数据监听和处理操作,比如接收到新数据之后的统计处理,满足统计条件后的报单处理(其实这里就是我们的策略所在)
那么,我建议将我们的程序化交易系统分为四个线程,分别处理上述业务。程序的主线程就可以完成基本操作,完成登入,订阅等初始化工作。
其它三个线程工作关系如下图所示:
程序化交易系统是一个复杂的多线程网络程序,在开发过程中要特别注意处理很多的线程互斥、数据处理造成的网络丢包等一系列棘手问题。另外,对于CTP开发的资料,大家可以留言给我,我尽量提供,也欢迎大家多多讨论。
发表评论:
馆藏&34466
TA的推荐TA的最新馆藏[转]&基于CTP的程序化交易系统开发
&&&&自从综合交易平台(CTP)的API开放以来,很多人开始编写自己的程序化交易系统,今天我想说说自己的一些看法。 &&&&首先解读一下CTP的接口说明,CTP的API使用建立在TCP协议之上FTD协议(《期货交易数据交换协议》)与交易托管系统进行通讯,而交易托管系统负责投资者的交易业务处理。FTD&协议中规定了所有的通讯都基于某一种通讯模式。
交易涉及的通讯模式共有三种:
1.对话通讯模式,是指由会员端主动发起的通讯请求。该请求被交易所端接收和处理,并给予响应。例如报单、查询等。这种通讯模式与普通的客户/服务器模式相同。
2.私有通讯模式,是指交易所端主动,向某个特定的会员发出的信息。例如成交
3.广播通讯模式,是指交易所端主动,向市场中的所有会员都发出相同的信息。
例如公告、市场公共信息等。
CTP的交易API提供了两个接口,分别为CThostFtdcTraderApi&和CThostFtdcTraderSpi
我们自己开发的交易系统通过CThostFtdcTraderApi向CTP发送操作请求,通过CThostFtdcTraderSpi接收CTP的任何响应。
现在把主要的业务举例在下表中
CThostFtdcTraderApi
CThostFtdcTraderSpi
ReqUserLogin
OnRspUserLogin
ReqOrderInsert
OnRspOrderInsert
ReqQryOrder
OnRspQryOrder
ReqQryTrade
OnRspQryTrade
OnRtnOrder
OnRtnTrade
行情涉及的通讯模式共有两种:
1.对话通讯模式,同交易一样,是指由会员端主动发起的通讯请求。该请求被交易所端接收和处理,并给予响应。例如登录,退订等。
2.广播通讯模式,主要是行情订阅,当订阅行情后交易所端主动向会员连续主动发出行情信息。
CThostFtdcMdApi
CThostFtdcMdSpi
ReqUserLogin
OnRspUserLogin
SubscribeMarketData
OnRspQryDepthMarketData
UnSubMarketData
OnRspUnSubMarketData
可见,通过CTP提供的接口,我们可以向CTP发送业务申请,也不断的按照三种通讯模式中的其中一种接收CTP的响应。因此我们写的交易系统中至少就应该有两个线程,一个称其为主业务线程,负责对CTP发出业务申请;另一个线程为API工作线程,负责接收CTP通过广播通讯模式,对话通讯模式,私有通讯模式其中一种模式对交易系统的响应。
&&&&综上所述,我们的程序化交易系统需要完成的业务可以划分为:
1.基本操作,比如登录,订阅等;
2.行情操作,比如对行情数据的接收,存储等
3.订单操作,比如报单;对报单,成交状况的查询;报单,成交状况的私有回报等。
4.数据监听和处理操作,比如接收到新数据之后的统计处理,满足统计条件后的报单处理(其实这里就是我们的策略所在)
&&&&那么,我建议将我们的程序化交易系统分为四个线程,分别处理上述业务。程序的主线程就可以完成基本操作,完成登入,订阅等初始化工作。
&&&&其它三个线程工作关系如下图所示:
程序化交易系统是一个复杂的多线程网络程序,在开发过程中要特别注意处理很多的线程互斥、数据处理造成的网络丢包等一系列棘手问题。另外,对于CTP开发的资料,大家可以留言给我,我尽量提供,也欢迎大家多多讨论。
&&&&本文开始先说说CTP给开发者提供了什么。CTP提供给开发者的文件一共有4个头文件 ThostFtdcTraderApi.h,ThostFtdcMdApi.h,ThostFtdcUserApiStruct.h,ThostFtdcUserApiDataType.h 和2个dll:thosttraderapi.dll,thostmduserapi.dll(动态链接库,如果是静态库则是thosttraderapi.lib,thostmduserapi.lib)。 &&&&其中ThostFtdcTraderApi.h定义了交易请求接口CThostFtdcUserApi和交易事件处理接口CThostFtdcUserSpi; &&&&ThostFtdcMdApi.h定义了行情请求接口CThostFtdcMdApi,行情事件处理接口CThostFtdcMdSpi; &&&&ThostFtdcUserApiStruct.h定义了接口方法中用到的数据结构。 &&&&ThostFtdcUserApiDataType.h定义了数据结构中用到数据类型,枚举描述。 &&&&开发者通过CThostFtdcUserApi就可以完成交易接口的初始化,登入,确认结算结果,查询合约,查询资金,查询持仓,报单,撤单等业务操作;通过CThostFtdcUserSpi获取相应回报 &&&&开发者也可以通过CThostFtdcMdApi完成行情接口的初始化,登入,订阅,收行情等业务;通过CThostFtdcMdSpi获取相应的行情业务操作的回报。 &&&上文提到了基于CTP的程序化交易系统开发最好要有四个线程: 1.完成初始化及退出操作的主线程; 2.行情接受和处理线程; 3.新行情数据监听和处理线程; 4.订单管理线程 现在先讨论一下主线程的初始化工作。初始化工作包括交易接口和行情接口两部分,对于交易接口的初始化,程序必须完成如下步骤: 1, 产生一个CThostFtdcTraderApi实例 2, 产生一个事件处理的实例 3, 注册一个事件处理的实例 4, 订阅私有流 5, 订阅公共流 6, 设置交易托管服务的地址。 初始化过程的时序图如下:
对于行情接口的初始化工作要简单一些,因为接口默认就订阅了公有流和私有流,初始化过程的时序图如下:
&&&&接下来就是行情接收和处理线程,行情的接收是通过CThostFtdcMdApi::SubscribeMarketData()完成对行情的订阅,通过CThostFtdcMdSpi::OnRtnDepthMarketData()完成对于行情数据的接收。此线程的工作主要要完成如下三个方面: 1.行情数据的存储:由于SubscribeMarketData()可以对多个合约行情进行订阅,所以在接收到数据后的处理首先要考虑对不同合约的数据分别以合适的方式(这里合适的方式是指存取,遍历,查询,增删等操作最为稳定快速的算法)存储。 2.行情数据的补齐:这是一个相当重要的问题。当tick数据为空的时候,必须以合适的方式补齐(因为缺失的数据对后来的统计指标计算有较大的影响,所以数据补齐是相当考究的)。 3.最新行情数据到来时向数据监听线程发出信号。 &&&在下一文中我将讨论一下剩余的数据监听和处理线程和订单管理线程。
&&&最近比较忙,好容易今天事情少点,赶紧继续写博客,谢谢大家的关注。 &&&接到上篇说哈,本文讨论一下数据监听线程和订单管理线程做些什么。 &&&一,数据监听线程 &&&数据监听线程,当行情处理线程接收到新的行情数据时,也就是每当一个tick到来时,就向数据监听线程发出信号,触发此线程启动,然后依次进行: 1.各种指标计算, 2.然后进行策略计算, 3.最后在满足策略时进行交易。 &&&指标计算,就是指根据新到来的数据以及历史数据进行某些统计值的计算,比如常见的MA,MACD,RSI等,当然也可以自己构造出某个统计值。这里需要提到的是数据周期的问题(我在之前的博文中曾解释过)。如果指标计算是基于数据周期,那么对于行情数据就要进行数据的拼装,也就是说将每一tick数据(500毫秒)拼装成你所需要的数据周期(也就是拼装成K线),然后将每个周期(每根k线)中的open,high,low,close计算出来,以便进行统计值的计算。 &&&策略计算就是将你的计算出来的指标,按照你自己的交易思想,交易策略进行逻辑的组合,然后在满足策略逻辑的时候进行交易。 &&&这里我建议一下架构,就是不要将指标计算和策略计算以及交易写到一个函数里面,而是将每一个指标计算写成一个函数,然后分别用函数指针指向它;然后策略计算以及交易写成一个函数,然后用函数指针指向它,并将其压入一个堆栈,此后每添加一个指标,就将指标对应的函数指针压入堆栈;
当每次数据监听线程启动时就依次弹出每个指标并计算,最后完成策略函数。 &&二,订单管理线程 &&&&订单管理线程,主要是用于处理订单管理中的两个问题: &&&&1.订单队列的管理,一般按照报单的时间先后顺序用数组等数据结构进行管理,原则是每一个业务请求要准确对应其回报,每一组请求和回报要准确的对应其归属的订单。其关键就在于2.订单的各种状态的管理:在回报中,订单的状态有很多种,请参考,我建议根据其含义归纳为这五种状态:报单中,已成交,撤单中,已撤单,出错,因为这五种状态对于策略逻辑的完成是至关重要的。 &&&&下面说一下订单交易的机制与时序。先给出一个时序图:
&&&&其中,报单响应和回报的机制是当Thost收到报单指令,如果没有通过参数校验,拒绝接受报单指令。用户就会收到OnRspOrderInsert消息,其中包含了错误编码和错误消息。如果Thost接受了报单指令,用户不会收到OnRspOrderInser,而会收到OnRtnOrder,用来更新委托状态。交易所收到报单后,通过校验。用户会收到OnRtnOrder、OnRtnTrade。如果交易所认为报单错误,用户就会收到OnErrRtnOrder。 &&&&撤单响应和回报和报单响应和回报相似。当Thost收到撤单指令,如果没有通过参数校验,拒绝接受撤单指令。用户就会收到OnRspOrderAction消息,其中包含了错误编码和错误消息。如果Thost接受了撤单指令,用户不会收到OnRspOrderAction,而会收到OnRtnOrder,用来更新委托状态。交易所收到撤单后,通过校验,执行了撤单操作。用户会收到OnRtnOrder。如果交易所认为报单错误,用户就会收到OnErrRtnOrderAction。
本分类共有文章2篇,更多信息详见
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";
/*爱悠闲底部960*75*/
var cpro_id = "u1888128";金融(32)
CTP修改密码分为修改登录密码和修改资金密码,不支持修改银行账户密码。
一、修改密码
1、修改登录密码:
CThostFtdcUserPasswordUpdateField req = {0};
strcpy(req.BrokerID, m_BrokerID);
strcpy(req.UserID, m_UserID);
req.OldPassword,41);
req.NewPassword,41);
ReqUserPasswordUpdate(&req,reqInfo.nRequestID);
2、修改资金密码
CThostFtdcTradingAccountPasswordUpdateField req = {0};
strcpy(req.BrokerID, m_BrokerID);
strcpy(req.AccountID, m_TradingAccounts[reqInfo.lAccIdx].AccountID);
req.CurrencyID;
ReqTradingAccountPasswordUpdate(&req,reqInfo.nRequestID);
二、登出:
CThostFtdcUserLogoutField req = {0};
memcpy(req.BrokerID, m_BrokerID, sizeof(m_BrokerID));
memcpy(req.UserID, m_UserID, sizeof(m_UserID));
ReqTdUserLogout(&req,nRequestID);
以上都比较简单,不做过多解释了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:84647次
积分:1566
积分:1566
排名:第18063名
原创:65篇
转载:82篇
评论:16条
阅读:3563
(7)(12)(2)(4)(7)(1)(8)(8)(1)(1)(1)(1)(1)(2)(1)(5)(1)(3)(4)(4)(12)(3)(1)(2)(7)(7)(4)(3)(1)(3)(11)(2)(10)(6)1276人阅读
VC2008 的环境配置好了之后,交易系统终于可以运行了。当按下程序,看着一个黑框蹦出来了的那一刻,心里不禁无穷的欢喜。
当然不知道这个输出的结果是个什么意思,要仔细研究也要花上不少的精力。内心里还是很想弄明白程序的整个操作过程,但此时天色已经很晚了,脑袋昏昏的,看那些文字材料不知道要看到什么时候。看到《综合交易平台交易API特别说明》后面有一段代码挺不错的,很想将代码的实现过程弄清楚。可能硬着头皮看,不知道什么时候能看完。于是我打算一边打代码,一边揣摩每段代码的含义。花了差不多一个小时的时间,我敲完了代码,并对代码要实现的东西进行了一些总结。
现将代码贴出如下:
// tradeapitest.cpp
// 一个简单的例子, 介绍CThostFtdcTraderApi和CThostFtdcTraderSpi接口的使用
//本例将演示一个报单录入操作的过程
//CThostFtdcTraderApi : Api对象
//CThostFtdcTraderSpi : 事件处理对象
#include &stdio.h&
#include &windows.h&
#include &.\ThostTraderApi\ThostFtdcTraderApi.h&
//保单录入操作是否完成的标志
//Create a manual reset event with no signal
HANDLE g_hEvent = CreateEvent(NULL,true,false,NULL);
//会员代码
TThostFtdcBrokerIDType g_chBrokerID;
//交易用户代码
TThostFtdcUserIDType g_chUserID;
class CSimpleHandler : public CThostFtdcTraderSpi
//构造函数,需要一个有效的指向CThostFtdcMduserApi实例的指针
CSimpleHandler(CThostFtdcTraderApi *pUserApi) : m_pUserApi(pUserApi){}
~CSimpleHandler(){}
//当客户端与交易托管系统建立起通信连接,客户端需要进行登录
virtual void OnFrontConnected()
CThostFtdcReqUserLoginField reqUserL
//get BrokerID
printf(&BrokerID: &);
scanf(&%s&, &g_chBrokerID);
strcpy(reqUserLogin.BrokerID,g_chBrokerID);
//get userid
printf(&userid: &);
scanf(&%s&,&g_chUserID);
strcpy(reqUserLogin.UserID,g_chUserID);
//get password
printf(&password:&);
scanf(&%s&, &reqUserLogin.Password);
//发出登录请求
m_pUserApi-&ReqUserLogin(&reqUserLogin,0);
virtual void OnFrontDisconnected(int nReason)
//当发生这个情况后,API会自动重新连接,客户端可不做处理
printf(&OnFrontDisconnected.\n&);
//当客户端发出登录请求之后,该方法会被调用,通知客户端登录是否成功
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo,int nRequestID, bool bIsLast)
printf(&OnRspUserLogin:\n&);
printf(&ErrorCode=[%d], ErrorMsg=[%s]\n&,pRspInfo-&ErrorID, pRspInfo-&ErrorMsg);
printf(&RequestID=[%d],Chain=[%d]\n&,nRequestID,bIsLast);
if(pRspInfo-&ErrorID != 0){
//登录失败,客户端需要进行错误处理
printf(&Failed to login, errorcode = %d errormsg= %s requestid = %d chain = %d&, pRspInfo-&ErrorID, pRspInfo-&ErrorMsg, nRequestID, bIsLast);
//登录成功,发出保单录入请求
CThostFtdcInputOrderFiel
memset(&ord, 0, sizeof(ord));
//经纪公司代码
strcpy(ord.BrokerID, g_chBrokerID);
//投资者代码
strcpy(ord.InvestorID, &12345&);
//合约代码
strcpy(ord.InstrumentID,&cn0601&);
//报单引用
strcpy(ord.OrderRef,&&);
//用户代码
strcpy(ord.UserID, g_chUserID);
//报单价格条件
ord.OrderPriceType = THOST_FTDC_OPT_LimitP
//买卖方向
ord.Direction = THOST_FTDC_D_B
//组合开平标志
bOffsetFlag,&0&);
//组合投机套保标志
bHedgeFlag,&1&);
//价格
ord.LimitPrice = 50000;
ord.VolumeTotalOriginal = 10;
//有效期类型
ord.TimeCondition = THOST_FTDC_TC_GFD;
strcpy(ord.GTDDate,&&);
//成交量类型
ord.VolumeCondition = THOST_FTDC_VC_AV;
//最小成交量
ord.MinVolume = 0;
//触发条件
ord.ContingentCondition = THOST_FTDC_CC_I
ord.StopPrice = 0;
//强平原因
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceC
//自动挂起标志
ord.IsAutoSuspend =0;
m_pUserApi-&ReqOrderInsert(&ord,1);
//保单录入应答
virtual void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
//输出保单录入结果
printf(&ErrorCode=[%d],ErrorMsg=[%s]\n&,pRspInfo-&ErrorID, pRspInfo-&ErrorMsg);
//通知保单录入完成
SetEvent(g_hEvent);
//保单回报
virtual void OnRtnOrder(CThostFtdcOrderField *pOrder)
printf(&OnRtnOrder:\n&);
printf(&OrderSysID=[%s]\n&, pOrder-&OrderSysID);
//针对用户请求的出错通知
virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
printf(&OnRspError:\n&);
printf(&ErrorCode=[%d],ErrorMsg=[%s]\n&,pRspInfo-&ErrorID,pRspInfo-&ErrorMsg);
printf(&RequestID=[%d],Chain=[%d]\n&,nRequestID,bIsLast);
//客户端需要进行错误处理
//客户端的错误处理
//指向CThostFtdcMduserApi实例的指针
CThostFtdcTraderApi *m_pUserA
int main()
//产生一个CThostFtdcTraderApi实例
CThostFtdcTraderApi *pUserApi = CThostFtdcTraderApi::CreateFtdcTraderApi();
//产生一个事件处理的实例
CSimpleHandler sh(pUserApi); //相当于将sh依附于pUserApi
//注册一个事件处理的实例
pUserApi-&RegisterSpi(&sh); //pUserApi发生的一切事件都会调用sh中的处理函数
//订阅私有流
// TERT_RESTART: 从本交易日开始重传
// TERT_RESUME: 从上次收到的续传
// TERT_QUICK: 只传送登录后私有流的内容
pUserApi-&SubscribePrivateTopic(THOST_TERT_RESUME);
//订阅公共流
// TERT_RESTART:从本交易日开始重传
// TERT_RESUME: 从上次收到的续传
// TERT_QUICK: 只传送登录后公共流的内容
pUserApi-&SubscribePublicTopic(THOST_TERT_RESUME);
//设置交易托管系统服务的地址,可以注册多个地址备用
pUserApi-&RegisterFront(&tcp://172.16.0.31:57205&);
//使客户端开始与后台服务器建立连接
pUserApi-&Init();
//客户端等待报单操作完成
WaitForSingleObject(g_hEvent,INFINITE);
//释放API实例
pUserApi-&Release();
整个函数的重点在于新建立的CSimpleHandler是如何实现CThostFtdcTraderSpi的各个虚函数的,正是这种个性话的操作才让程序化控制交易流程得以实现. 这些虚函数和回调函数很像,有点像是模拟窗口程序的特点。
另外main函数实现了这样一个流程:创建Api对象(pUserApi)-& 注册事件处理对象 (sh)
-& 订阅共有流(SubscribePublicTopic)
-& 订阅私有流(SubscribePrivateTopic)
-& 注册前置机(RegisterFront)
-& 初始化Api(Init)。至于初始化过程后面的内容,以后再慢慢研究了^_^
通过对CSimpleHandler的观察,不难得出交易系统处理报单大致是这样一个流程:
另外从网上流传的一个交易开发流程的实例里面可以看出CThostFtdcTraderSpi应该不止这样六个虚函数,从网上收集了一下,至少有这些虚函数需要去实现:
1. OnFrontConnected : 当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。
2. OnRspUserLogin : 登录请求响应, 当连接成功之后会调用这个函数
3. OnRspSettlementInfoConfirm: 投资者结算结果确认响应
4. OnRspQryInstrument: 请求查询合约响应
5. OnRspQryTradingAccount: 请求查询资金账户响应
6. OnRspQryInvestorPosition: 请求查询投资者持仓响应
7. OnRspOrderInsert : 报单录入请求响应, 可以在OnRspUserLogin后面就下单,当然什么时候下单都可以,看程序怎么调了。程序员可以自行安排下单的时间和顺序。
8. OnRspOrderAction : 报单操作请求响应
9. OnRspError : 错误应答
10. OnFrontDisconnected : 当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。
11. OnHeartBeatWarning : 心跳超时警告。当长时间未收到报文时,该方法被调用。
12. OnRtnOrder : 报单通知,也叫报单回报。 应该是交易所回传过来的报单信息
13. OnRtnTrade : 成交通知
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:109243次
积分:1316
积分:1316
排名:千里之外
转载:154篇
评论:10条
(1)(2)(3)(1)(8)(1)(2)(2)(6)(2)(6)(7)(4)(3)(2)(9)(9)(6)(17)(7)(26)(31)

我要回帖

更多关于 ctp行情服务器地址 的文章

 

随机推荐