1 对内核部分的分层讲解:量化投资系统最底层的这部分,一般是用C语言编写(当然也有其他语言)的用于获取实时数据,下单等与期货交易所交换信息的内核部分,很像一台电脑的CPU部分。
2 当今的金融证券的交易模式已经是“电子化”交易的模式了。身在世界各地只要打开电脑,连接上网络就能做交易这件事情。
3 中国期货交易市场有4个市场(别说那些外盘,这里指合法坑人的市场)。上海期货交易所、中国金融期货交易所、郑州商品期货交易所、大连商品期货交易所。没了!别在冒出个其他交易所来!国家不承认!
4 2说现在是电子化交易的时代了。这些期货交易所当然都有自己开发的交易系统(这里说的交易系统不是你打开各大期货公司交易软件,期货公司的各大交易软件是以这些期货交易所系统为基础上开发的,所以必须要知道这些交易系统,我们平时接触到这些交易系统都是以API形式存在,这个东西叫接口,就跟买个手机卡一样,你先要入人家的网络)。
5 期货接口哪家强?!--不要问蓝翔!
这里借用一篇比较权威的文章结合实际进行分析:
期货接口那较强?问题是这些期货交易所格子开发了一套交易接口(就不能统一一样,当然这里面有什么原因?这里只能呵呵了),列出如下:
上期所产品用的是CTP
中金所产品用的是飞马
大商所产品用的是飞创
郑商所产品用的是易盛。
备注:CTP接口是唯一(现在不知道)确认同时支持四家期货交易所期权和期货交易报价的系统,其他三套系统是否全支持不太清楚,可能不是待验证。
先看看各个系统在发一笔报价,撤一笔报价,和成交时分别收到的回调函数的数量。综合来看,飞创和易盛相对高效,CTP冗余回报最多。综合起来最精简的接口应该是发一笔报价2条回报,撤一笔报价2条回报,成交时1条回报。飞创在撤的时候多了1条,易盛在成交的时候多了1条,飞马用了正好多了一倍数量的回报,而CTP一半以上的回报其实可以被精简掉。
报价
撤报价
成交
CTP
4条OnRtnOrder
2条OnRtnQuote
2条OnRtnQuote
2条OnRtnOrder
1条OnRtnOrder
1条OnRtnTrade
飞马
1条OnRspQuoteInsert
2条OnRtnOrder
1条OnRtnQuote
1条OnRspQuoteAction
2条OnRtnOrder
1条OnRtnQuote
1条OnRtnOrder
1条OnRtnTrade
飞创
1条OnRspQuoteInsert
1条OnRtnQuoteInsert
1条OnRspQuoteCancel
2条OnRtnQuoteCancel
1条OnRtnQuoteMatchedInfo
易盛
2条OnRtnOrder
2条OnRtnOrder
1条OnRtnOrder
1条OnRtnFill
再看看各家在收到回报时如何查找报单,换言之如何确定唯一报单号。
确定唯一报单
CTP
FrontID+SessionID+OrderRef(字符串)
或ExchangeID+OrderSysID(字符串)
飞马
UserID+UserOrderLocalID(字符串)
或ExchangeID+OrderSysID(字符串)
飞创
sessionID+localOrderID(整型)
或spdOrderID(整型)
易盛
SessionID(整型)
或ServerFlag+OrderNo(字符串)
CTP和飞马属于同一类,使用了效率比较低的字符串,处理字符串耗时可以是处理整型耗时的数倍。而且字符串要求递增,相信不少CTP和飞马的程序猿掉进过这个坑,strcmp(“10”,“9”) 结果是小于0的,然后你就得到一个“重复的报单”的错误,但是找了半天也没发现到底是哪个号重复了。
另外,CTP的OnRtnTrade回报里只有OrderRef,没有FrontID和SessionID,因此只能依靠ExchangeID和OrderSysID来确定唯一报单,此时OrderRef纯属多余。
飞马也有自己独特的问题,理论上飞马确定唯一报单的方法应该是UserID+UserOrderLocalID,但是实际上所有回报里的UserID都是登录的UserID,目前只能将这两个合
并成一个UserOrderLocalID或者使用用户自定义字段,据说飞马后续版本会修复这一问题。飞创全部使用整型,同时每个回报都有sessionID,localOrderID和spdOrderID,完全保持一致,因此效率最高。易盛混用了整型和字符串,每个回报都有ServerFlag+OrderNo保持一致性,效率居中。
最后我们来看看四家里最高效的飞创和国外交易所相比还有哪些差距。下面以NASDAQ的SQF接口为例。
总结如下:从做市商角度来看,四家系统按照效率来排名是:飞创===>>易盛===>>飞马===>>CTP。即使相对最高效的非常和国外交易所的简洁接口相比,仍然有一定差距。
5 ctpcom接口的安装和账户的预配置
这里的com接口是已经封装好的,直接注册在MATLAB当中调用即可。
1) 程序化交易API接口安装:
把ctpcom_demo下面的ctpcom复制到C盘根目录底下
打开ctpcomRegsvr32.bat注册
ctpcom注册成功。
2) 账号券商端口的安装:
找到相关券商交易端口并安装。
3) .xml文件的配置:
3.1 .xml文件是交易端口的链接信息
内容都为一致,如果需要需要添加新的券商,根据里面的样本剪切复制即可。
另外,内容其他内容不需要更改。只需要把.xml文件中的:
BrokerID:
交易前置:
行情前置:
这三个部分配置属于具体券商的端口即可。
如果没有特别要求,其这部分三方面的信息可在安装的"账户券商端口"配置内进行查看。
样本举例:注意不同期货公司的网络,电信,联通的ID IP不一样
交易前置:180.168.146.187:10003
行情前置:180.168.146.187:10013
BrokerID:9999
<server address="180.168.146.187" port="10003" type="trade" enabled="true" provider="电信" /> 交易前置对应IP配置信息,并对应相关网络。
<server address="180.168.146.187" port="10013" type="md" enabled="true" provider="电信" /> 行情前置对应IP配置信息,并对应相关网络。
<server address="180.168.146.187" port="10003" type="trade" enabled="true" provider="联通" /> 交易前置对应IP配置信息,并对应相关网络。
<server address="180.168.146.187" port="10013" type="md" enabled="true" provider="联通" /> 行情前置对应IP配置信息,并对应相关网络。
3.2 如平时使用交易开拓者:
在交易开拓者可以找到所有的ip
在config里面的brokers
4)电脑注意是安装32位的matlab
6 Cptcom收发信息封装函数的详细内容:
注册ctp组件方法先解压到D盘,然后命令行输入cmd,输入 Regsvr32.exe D:ctpcomctpcom.dll 回车即可
%% 函数调用
actctp=actxserver('ctpcom.ICTPClientAPI');%注册服务器;
verify=Login(actctp,'海通期货.xml','00000044','123456');登陆账号,verify=0表示登陆成功;
OrderID=Buy(actctp,'ag1506',1,0);Buy(actctp,'ag1506',1,3500);%开多
OrderID=Sell(actctp,'ag1506',1,0); %平多
OrderID=Short(actctp,'ag1506',1,0);%开空
OrderID=Cover(actctp,'ag1506',1,0);%平空
OrderID=PlaceOrder(actctp,'ag1506',1,1,1,0);%对指定的合约买入平仓;
CancelID=CancelOrder(actctp,OrderID);%对指定的报单进行撤单操作;
SubscribeMD(actctp,'ag1506');%订阅行情
[LongPos PositionPrice]=GetLongPos(actctp,'ag1506');%返回某个合约的多头(买持)仓位。
[ShortPos PositionPrice]=GetLongPos(actctp,'ag1506');%返回某个合约的空头(卖持)仓位。
LongClosable=GetLongClosable(actctp,'ag1506');%返回某个合约的多头(买持)可平仓位。
ShortClosable=GetShortClosable(actctp,'ag1506');%返回某个合约的空头(卖持)可平仓位。
IsOpen=IsOrderOpen(actctp,OrderID);%判断某个报单是否处于可撤状态。
[YdClose YdSettlement Open Last Bid1 Ask1 Bid1Volume Ask1Volume Highest Lowest TradedVolume TradedAmmount]
=GetMarketData(actctp,'ag1506');%获取一个合约当前最新行情数据。
[Balance Available]= GetAccount(actctp);%获取当前帐户的用户权益和可用资金。
[ppIns,Count]=GetInstruments(actctp);%获取所有合约列表;不可用
[Multiply PriceUnit]= GetInstrumentInfo(actctp,'ag1506');%获得一个合约的乘数和最小价格变动单位
[MarginRate ExpireDate]= GetMarginRate(actctp,'ag1506');%获得一个合约的保证金率乘数和到期日
CreateKBars(actctp,'ag1506',0,1);% 创建一个Bar序列,之后,COM会通过OnBar事件将生成的Bar推送出来。不可用
%% 1.4 COM触发事件
OnAccount –当投资者账户信息发生变化时,此事件被触发;
参数:
PreBalance期初用户权益
Balance 当前用户权益
Available 当前可用资金
Commission 今日以发生手续费
FrozenCommission 今日冻结手续费
Margin 占用保证金
FrozenMargin 今日冻结保证金
CloseProfit 今日平仓盈亏
PositionProfit 持仓盈亏
OnMarketData- 当某个合约有新行情到达时,此事件被触发;
参数:
InstrumentID 合约编号
BidPrice1 买一价
BidVolume1买一量
AskPrice1卖一价
AskVolume1 卖一量
OpenPrice 开盘价
HighestPrice 最高价
LowestPrice 最低价
LastPrice 最新价
OpenInterest 持仓量
Volume 成交量
UpperLimitPrice 涨停价
LowerLimitPrice 跌停价
PreSettlementPrice 昨结算价
AveragePrice 今日平均价
UpdateTime行情更新时间
UpdateMilliSecond更新毫秒数为0或500
OnOrder – 当某个报单信息发生变化时,此事件被触发;
参数:
OrderID 报单编号
InstrumentID 和约编号
IsBuy 是否为买,非0为买,否则为卖;
IsOpen 是否开仓,非0为开仓,否则为平仓
Volume 委托数量
Price 委托价格
TradedVolume已成交数量
AvgTradePrice 成交均价
OrderStatus 报单当前状态
OrderSysID 交易所报单号
InsertTime 委托时间
StatusMsg 状态信息,如果该报单失败,则为失败原因。
?
OnOrderCanceled - 当出现报单错误或者报单被撤时,此事件被触发;
参数:
OrderID-报单编号
ErrorID-当为错单时的错误编号;
ErrorMsg-当为错单时的错误信息;
OnOrderFinished – 当某个报单全部成交后,此事件被触发;此事件总是在一个报单的所有OnTrade事件之后发生。
参数:
OrderID 报单编号
OnPosition – 当某个合约的仓位信息发生变化时,此事件被触发;
参数:
InstrumentID-合约代码
IsLong- 是否为多仓
Volume-持仓量
CloseProfit-今日平仓盈亏
PositionProfit 持仓盈亏
AvgPositionPrice 持仓均价 昨仓,是结算之后的均价;
AvgOpenPrice 开仓均价;按开仓价计算的均价;
TotalClosable 总可平量
TodayClosable 今日可平量
OnTrade - 当所发出的报单有成交时,此事件被触发;
参数:
OrderID 报单编号
InstrumentID 合约代码
IsBuy 是否为买,非0为买,否则为卖;
IsOpen 是否开仓,非0为开,否则为平;
ThisTradeVolume 本次成交数量
ThisTradePrice 本次成交均价
TradeTime 成交时间;
OnTradeConnected - 当交易连线后,此事件被触发;
OnTradeDisconnected - 当交易断线后,此事件被触发;
OnMDConnected - 当行情连线后,此事件被触发;
OnMDDisconnected - 当行情断线后,此事件被触发;
OnOrderActionFailed([in] long OrderID,[in] int ErrorID);当撤单失败时,此事件被触发;
?
OnInstrumentStatus – 交易所状态信息通知
参数:
InstrumentID – 交易所随机选择的一个合约;
ExchangeID – 交易所代码: CFFEX 中金所;
SHFE 上期所;
EnterTime – 进入本状态时间;
NewState – 当前状态;其值如下所示:
//开盘前
#define THOST_FTDC_IS_BeforeTrading '0'
///非交易
#define THOST_FTDC_IS_NoTrading '1'
///连续交易
#define THOST_FTDC_IS_Continous '2'
///集合竞价报单
#define THOST_FTDC_IS_AuctionOrdering '3'
///集合竞价价格平衡
#define THOST_FTDC_IS_AuctionBalance '4'
///集合竞价撮合
#define THOST_FTDC_IS_AuctionMatch '5'
///收盘
#define THOST_FTDC_IS_Closed '6'
OnInitFinished – 相关初始化工作完成,在这个事件通知之后,可以通过GetInstruments方法获得所有合约列表。
OnMarginRate
Desc:
Fired when an instruments’ margin rate was queried back.
Params:
InstrumentID
longMarginRate
shortMarginRate
? OnCommissionRate
Desc:
Fired when an instruments’ commission rate was queried back.
Params:
InstrumentID
OpenCommissionRateByMoney
OpenCommissionRateByVolume
CloseCommissionRateByMoney
CloseCommissionRateByVolume CloseTodayCommissionRateByMoney CloseTodayCommissionRateByVolume
?
OnBar – 新创建了Bar或者某个Bar被关闭;
参数:
InstrumentID – 合约编号;
BeginTime – 本Bar的开始时间;
Period – 周期类型,0 – 分钟线;1 – 小时线;
Interval – 周期大小;
Open – 本Bar的开盘价,
High– 本Bar的最高价;
Low- 本Bar的最低价;
Close – 本Bar的收盘价;
Volume- 本bar时间内的成交量;
Position- 本Bar结束时的持仓量;
Status – 本Bar的状态,0-未关闭,1 – 关闭;
注1:接口中涉及到的ErrorID和ErrorMsg参见发布包中的error.xml;
注2: OrderStatus的取值如下:
///全部成交
#define THOST_FTDC_OST_AllTraded '0'
///部分成交还在队列中
#define THOST_FTDC_OST_PartTradedQueueing '1'
///部分成交不在队列中
#define THOST_FTDC_OST_PartTradedNotQueueing '2'
///未成交还在队列中
#define THOST_FTDC_OST_NoTradeQueueing '3'
///未成交不在队列中
#define THOST_FTDC_OST_NoTradeNotQueueing '4'
///撤单
#define THOST_FTDC_OST_Canceled '5'
///未知
#define THOST_FTDC_OST_Unknown 'a'
///尚未触发
#define THOST_FTDC_OST_NotTouched 'b'
///已触发
#define THOST_FTDC_OST_Touched 'c'