发布时间:2018-09-25
技术:C++11,动态库的制作

概述

CTP的接入Demo

详细

代码下载:http://www.demodashi.com/demo/14125.html

本文档不介绍CTP的具体流程,具体流程请参考上海期货交易所文档(下载).

一、概述

1.CTP是上期技术,提供的国内期货行情和交易的接口,自推出以来,各大券商均架设了CTP技术的接入,引入策略算法便可以初步形成一个自动交易的系统,这也就吸引了很多对自动交易,策略交易感兴趣的各路高人来使用。

2.CTP难点在于,一个库提供了行情和交易两套接口,各自均有一套业务流程,而且两者在业务上还存在部分业务关联,也就是说还要处理两套之间的业务同步问题,没有一些C++基础的人很难开发好用的CTP库。

3.本Demo目标是,在Windows环境下做两个程序:

一个封装CTP行情和交易接口成一个库,尽可能在高内聚低耦合的情况下,保持代码清晰,通俗尽可能让;

一个执行程序很容易的去调用这个库,这里没有使用MFC或QT,直接采用控制台程序,很清晰的展示使用库。

二、准备环境

1.开发工具:visual studio 2015或以上版本(下载)

本Demo采用Visual studio 2015 专业版 update 3

Windows7 64位

2.下载上期CTP库(下载)

综合交易平台API下载,下载列表中的windows下64位库(最新(2015-05-15)),解压如下:

3.申请模拟账号(申请)

主页右上角,注册账号,例子中方便开箱即用,会使用我自己申请好的,请自行换成自己的帐号。

三、程序介绍

1.先看下Demo的运行效果。

2.程序目录结构

①Show all files模式下,VS工程目录结构如下图:

共两个项目,CTPSample和CTPServer,CTPSample为封装交易所CTP的动态库,CTPServer为使用库的UI程序。

②代码目录结构

bin64

-----CTP CTP产生的共享文件

-----Log 日志文件

config.cfg 配置文件

build

CTPServer.sln 存放工程文件

Src

------CTPSample DLL代码

------CTPServer UI代码

------Framwork 框架代码,避免复杂,不做公开(这里主要提供日志,数据定义,可自己替换)

说明:confg.cfg主要保存了CTP的地址(其他均为非本Demo演示的主要功能):

[info]

CTPFront.trade1 = tcp://180.168.146.187:10030

CTPFront.quote1 = tcp://180.168.146.187:10031

CTPFront.trade2 = tcp://180.168.146.187:10001

CTPFront.quote2 = tcp://180.168.146.187:10011

CTPFront.trade3 = tcp://218.202.237.33:10002

CTPFront.quote3 = tcp://ctp1-md11.citicsf.com:41213

3.模块介绍

CTPSample模块

CTPBase.h 动态库的导出定义

MyCTPQuote.h/MyCTPQuote.CPP 交易的封装

MyCTPQuote.h/MyCTPQuote.cpp 行情的封装

CTPServer模块

TradeManager.h/TradeManager.cpp UI主逻辑

CTPServer.cpp main启动

四、程序解析

1. CTPSample模块之MyCTPQuote.h

//定义一个管理器,管理行情接受
class   CTPSAMPLE_EXPORT MyCTPQuote
{//嵌入行情回报类class  MyRecv : public  CThostFtdcMdSpi{public:MyRecv():m_Parent(nullptr) {};~MyRecv() {};void Bind(MyCTPQuote  *Parent) { m_Parent = Parent; }public:///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。virtual void OnFrontConnected() { m_Parent->OnFrontConnected(); }///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。///@param nReason 错误原因///        0x1001 网络读失败///        0x1002 网络写失败///        0x2001 接收心跳超时///        0x2002 发送心跳失败///        0x2003 收到错误报文virtual void OnFrontDisconnected(int nReason) { m_Parent->OnFrontDisconnected(nReason); }///心跳超时警告。当长时间未收到报文时,该方法被调用。///@param nTimeLapse 距离上次接收报文的时间virtual void OnHeartBeatWarning(int nTimeLapse) { m_Parent->OnHeartBeatWarning(nTimeLapse); }///登录请求响应virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { m_Parent->OnRspUserLogin(pRspUserLogin, pRspInfo, nRequestID, bIsLast); }///登出请求响应virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast){ m_Parent->OnRspUserLogout(pUserLogout, pRspInfo,  nRequestID,  bIsLast); }///错误应答virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { m_Parent->OnRspError(pRspInfo, nRequestID,  bIsLast); }///订阅行情应答virtual void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { m_Parent->OnRspSubMarketData(pSpecificInstrument, pRspInfo, nRequestID, bIsLast); }///取消订阅行情应答virtual void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast){ m_Parent->OnRspUnSubMarketData(pSpecificInstrument, pRspInfo, nRequestID,  bIsLast); }///订阅询价应答virtual void OnRspSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { m_Parent->OnRspSubForQuoteRsp(pSpecificInstrument, pRspInfo,  nRequestID,  bIsLast); }///取消订阅询价应答virtual void OnRspUnSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast){ m_Parent->OnRspUnSubForQuoteRsp(pSpecificInstrument, pRspInfo,  nRequestID,  bIsLast); }///深度行情通知virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData) { m_Parent->OnRtnDepthMarketData(pDepthMarketData); }///询价通知virtual void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp) { m_Parent->OnRtnForQuoteRsp(pForQuoteRsp); }public:MyCTPQuote  *m_Parent;};//thread
public:MyCTPQuote( );~MyCTPQuote();void    setMainWidget(void *widget);// 订阅广播报文void Subscribe(CPacketReceiver *pPacketReceiver);// 取消广播报文订阅void Unsubscribe(CPacketReceiver *pPacketReceiver);static  MyCTPQuote *Instance();void  Init(const char  *User, const  char  *pswd, const  char  *broker, const char *pszAddress);void  FinishQryInstrument();void  setLog(const string&  str);bool      m_bLoginSuccessed;
public:///请求类函数,提供主要逻辑,供外部使用///用户登录请求int ReqUserLogin(CThostFtdcReqUserLoginField *pReqUserLoginField, int nRequestID) { return m_reqApi->ReqUserLogin(pReqUserLoginField, nRequestID );}///登出请求int ReqUserLogout(CThostFtdcUserLogoutField *pUserLogout, int nRequestID) { return m_reqApi->ReqUserLogout(pUserLogout, nRequestID); }///获取当前交易日///@retrun 获取到的交易日///@remark 只有登录成功后,才能得到正确的交易日const char *GetTradingDay() { return m_reqApi->GetTradingDay(); }///订阅行情。///@param ppInstrumentID 合约ID  ///@param nCount 要订阅/退订行情的合约个数///@remark int SubscribeMarketData(char *ppInstrumentID[], int nCount) { return m_reqApi->SubscribeMarketData(ppInstrumentID, nCount); }///退订行情。///@param ppInstrumentID 合约ID  ///@param nCount 要订阅/退订行情的合约个数///@remark int UnSubscribeMarketData(char *ppInstrumentID[], int nCount) { return m_reqApi->UnSubscribeMarketData(ppInstrumentID, nCount); }public:///回报类函数,收到数据,更新本地行情信息///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。void OnFrontConnected();///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。///@param nReason 错误原因///        0x1001 网络读失败///        0x1002 网络写失败///        0x2001 接收心跳超时///        0x2002 发送心跳失败///        0x2003 收到错误报文void OnFrontDisconnected(int nReason);///心跳超时警告。当长时间未收到报文时,该方法被调用。///@param nTimeLapse 距离上次接收报文的时间void OnHeartBeatWarning(int nTimeLapse);///登录请求响应void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);///登出请求响应void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);///错误应答void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);///订阅行情应答void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);///取消订阅行情应答void OnRspUnSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);///订阅询价应答void OnRspSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);///取消订阅询价应答void OnRspUnSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);///深度行情通知void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData);///询价通知void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp);private:CThostFtdcMdApi* m_reqApi;MyRecv         *m_RecvSpi;map<string /*InstrumentID*/, CThostFtdcInstrumentField>                       m_mapInstrument;//合约ID,合约信息map<string /*InstrumentID*/,CThostFtdcDepthMarketDataField /*Quotation*/>  m_mapInstrumentQuote;//保存  合约ID-最新行情  对,合约ID唯一。vector<string /*InstrumentID*/> m_vecInstrumentId;//合约IDint         requestID;string   m_TradingDay;int    m_session ;int    m_frontId ;string  OrderRef ;mutex m_mutex;///用户登录信息CThostFtdcReqUserLoginField  *m_userLoginInfo;bool m_bQryInstrumentOK;//用于给上层订阅typedef vector<CPacketReceiver*> VPKTRECEIVER;VPKTRECEIVER            m_vPketReceiver;};

主要功能点:

①模块管理:

CTP的行情模块分两块,一个是同步查询API(CThostFtdcMdApi),一个是异步回报API(CThostFtdcMdSpi),这里定义了一个包装类,来管理这两类API,即

MyRecv来封装CThostFtdcMdSpi,CThostFtdcMdApi直接使用。

②给UI回报接口

本模块提供给上层的接口,定义了一个虚基类:

class  CPacketReceiver
{
public:virtual void Receive(CBroadcastPacket &pkt) = 0;
};这里运用到actor模式,接受UI订阅:
typedef vector<CPacketReceiver*> VPKTRECEIVER;VPKTRECEIVER            m_vPketReceiver;

③数据保存

数据收集,定义几个map

 map<string /*InstrumentID*/, CThostFtdcInstrumentField>                      m_mapInstrument;//合约ID,合约信息map<string /*InstrumentID*/,CThostFtdcDepthMarketDataField /*Quotation*/>  m_mapInstrumentQuote;//保存  合约ID-最新行情  对,合约ID唯一。vector<string /*InstrumentID*/> m_vecInstrumentId;//合约ID

2. CTPSample模块之MyCTPTrade.h

//定义一个管理器,管理行情接受
class  CTPSAMPLE_EXPORT  MyCTPTrade
{//嵌入行情回报类class  MyRecv : public  CThostFtdcTraderSpi{public:MyRecv():m_Parent(nullptr), m_nRequestId(0){};~MyRecv() {};void Bind(MyCTPTrade  *Parent) { m_Parent = Parent; }public:///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。virtual void OnFrontConnected() { m_Parent->OnFrontConnected(); }///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。///@param nReason 错误原因///        0x1001 网络读失败///        0x1002 网络写失败///        0x2001 接收心跳超时///        0x2002 发送心跳失败///        0x2003 收到错误报文virtual void OnFrontDisconnected(int nReason) { m_Parent->OnFrontDisconnected(nReason); }///客户端认证响应virtual void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { m_Parent->OnRspAuthenticate(pRspAuthenticateField,pRspInfo, nRequestID, bIsLast); }///心跳超时警告。当长时间未收到报文时,该方法被调用。///@param nTimeLapse 距离上次接收报文的时间virtual void OnHeartBeatWarning(int nTimeLapse) { m_Parent->OnHeartBeatWarning(nTimeLapse); }///登录请求响应virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { m_Parent->OnRspUserLogin(pRspUserLogin, pRspInfo, nRequestID, bIsLast); }///登出请求响应virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) { m_Parent->OnRspUserLogout(pUserLogout, pRspInfo,  nRequestID,  bIsLast); }///错误应答virtual void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {m_Parent->OnRspError(pRspInfo, nRequestID, bIsLast);}/*///用户口令更新请求响应virtual void OnRspUserPasswordUpdate(CThostFtdcUserPasswordUpdateField *pUserPasswordUpdate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///资金账户口令更新请求响应virtual void OnRspTradingAccountPasswordUpdate(CThostFtdcTradingAccountPasswordUpdateField *pTradingAccountPasswordUpdate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///报单录入请求响应virtual void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///预埋单录入请求响应virtual void OnRspParkedOrderInsert(CThostFtdcParkedOrderField *pParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///预埋撤单录入请求响应virtual void OnRspParkedOrderAction(CThostFtdcParkedOrderActionField *pParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///报单操作请求响应virtual void OnRspOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///查询最大报单数量响应virtual void OnRspQueryMaxOrderVolume(CThostFtdcQueryMaxOrderVolumeField *pQueryMaxOrderVolume, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///投资者结算结果确认响应virtual void OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///删除预埋单响应virtual void OnRspRemoveParkedOrder(CThostFtdcRemoveParkedOrderField *pRemoveParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///删除预埋撤单响应virtual void OnRspRemoveParkedOrderAction(CThostFtdcRemoveParkedOrderActionField *pRemoveParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///执行宣告录入请求响应virtual void OnRspExecOrderInsert(CThostFtdcInputExecOrderField *pInputExecOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///执行宣告操作请求响应virtual void OnRspExecOrderAction(CThostFtdcInputExecOrderActionField *pInputExecOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///询价录入请求响应virtual void OnRspForQuoteInsert(CThostFtdcInputForQuoteField *pInputForQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///报价录入请求响应virtual void OnRspQuoteInsert(CThostFtdcInputQuoteField *pInputQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///报价操作请求响应virtual void OnRspQuoteAction(CThostFtdcInputQuoteActionField *pInputQuoteAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///批量报单操作请求响应virtual void OnRspBatchOrderAction(CThostFtdcInputBatchOrderActionField *pInputBatchOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///期权自对冲录入请求响应virtual void OnRspOptionSelfCloseInsert(CThostFtdcInputOptionSelfCloseField *pInputOptionSelfClose, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///期权自对冲操作请求响应virtual void OnRspOptionSelfCloseAction(CThostFtdcInputOptionSelfCloseActionField *pInputOptionSelfCloseAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///申请组合录入请求响应virtual void OnRspCombActionInsert(CThostFtdcInputCombActionField *pInputCombAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询报单响应virtual void OnRspQryOrder(CThostFtdcOrderField *pOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询成交响应virtual void OnRspQryTrade(CThostFtdcTradeField *pTrade, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询投资者持仓响应virtual void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询资金账户响应virtual void OnRspQryTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询投资者响应virtual void OnRspQryInvestor(CThostFtdcInvestorField *pInvestor, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询交易编码响应virtual void OnRspQryTradingCode(CThostFtdcTradingCodeField *pTradingCode, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询合约保证金率响应virtual void OnRspQryInstrumentMarginRate(CThostFtdcInstrumentMarginRateField *pInstrumentMarginRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询合约手续费率响应virtual void OnRspQryInstrumentCommissionRate(CThostFtdcInstrumentCommissionRateField *pInstrumentCommissionRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询交易所响应virtual void OnRspQryExchange(CThostFtdcExchangeField *pExchange, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询产品响应virtual void OnRspQryProduct(CThostFtdcProductField *pProduct, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
*////请求查询合约响应virtual void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {m_Parent->OnRspQryInstrument(pInstrument, pRspInfo, nRequestID, bIsLast);};
/*///请求查询行情响应virtual void OnRspQryDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询投资者结算结果响应virtual void OnRspQrySettlementInfo(CThostFtdcSettlementInfoField *pSettlementInfo, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询转帐银行响应virtual void OnRspQryTransferBank(CThostFtdcTransferBankField *pTransferBank, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询投资者持仓明细响应virtual void OnRspQryInvestorPositionDetail(CThostFtdcInvestorPositionDetailField *pInvestorPositionDetail, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询客户通知响应virtual void OnRspQryNotice(CThostFtdcNoticeField *pNotice, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询结算信息确认响应virtual void OnRspQrySettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询投资者持仓明细响应virtual void OnRspQryInvestorPositionCombineDetail(CThostFtdcInvestorPositionCombineDetailField *pInvestorPositionCombineDetail, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///查询保证金监管系统经纪公司资金账户密钥响应virtual void OnRspQryCFMMCTradingAccountKey(CThostFtdcCFMMCTradingAccountKeyField *pCFMMCTradingAccountKey, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询仓单折抵信息响应virtual void OnRspQryEWarrantOffset(CThostFtdcEWarrantOffsetField *pEWarrantOffset, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询投资者品种/跨品种保证金响应virtual void OnRspQryInvestorProductGroupMargin(CThostFtdcInvestorProductGroupMarginField *pInvestorProductGroupMargin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询交易所保证金率响应virtual void OnRspQryExchangeMarginRate(CThostFtdcExchangeMarginRateField *pExchangeMarginRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询交易所调整保证金率响应virtual void OnRspQryExchangeMarginRateAdjust(CThostFtdcExchangeMarginRateAdjustField *pExchangeMarginRateAdjust, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询汇率响应virtual void OnRspQryExchangeRate(CThostFtdcExchangeRateField *pExchangeRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询二级代理操作员银期权限响应virtual void OnRspQrySecAgentACIDMap(CThostFtdcSecAgentACIDMapField *pSecAgentACIDMap, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询产品报价汇率virtual void OnRspQryProductExchRate(CThostFtdcProductExchRateField *pProductExchRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询产品组virtual void OnRspQryProductGroup(CThostFtdcProductGroupField *pProductGroup, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询做市商合约手续费率响应virtual void OnRspQryMMInstrumentCommissionRate(CThostFtdcMMInstrumentCommissionRateField *pMMInstrumentCommissionRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询做市商期权合约手续费响应virtual void OnRspQryMMOptionInstrCommRate(CThostFtdcMMOptionInstrCommRateField *pMMOptionInstrCommRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询报单手续费响应virtual void OnRspQryInstrumentOrderCommRate(CThostFtdcInstrumentOrderCommRateField *pInstrumentOrderCommRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询资金账户响应virtual void OnRspQrySecAgentTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询二级代理商资金校验模式响应virtual void OnRspQrySecAgentCheckMode(CThostFtdcSecAgentCheckModeField *pSecAgentCheckMode, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询期权交易成本响应virtual void OnRspQryOptionInstrTradeCost(CThostFtdcOptionInstrTradeCostField *pOptionInstrTradeCost, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询期权合约手续费响应virtual void OnRspQryOptionInstrCommRate(CThostFtdcOptionInstrCommRateField *pOptionInstrCommRate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询执行宣告响应virtual void OnRspQryExecOrder(CThostFtdcExecOrderField *pExecOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询询价响应virtual void OnRspQryForQuote(CThostFtdcForQuoteField *pForQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询报价响应virtual void OnRspQryQuote(CThostFtdcQuoteField *pQuote, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询期权自对冲响应virtual void OnRspQryOptionSelfClose(CThostFtdcOptionSelfCloseField *pOptionSelfClose, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询投资单元响应virtual void OnRspQryInvestUnit(CThostFtdcInvestUnitField *pInvestUnit, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询组合合约安全系数响应virtual void OnRspQryCombInstrumentGuard(CThostFtdcCombInstrumentGuardField *pCombInstrumentGuard, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询申请组合响应virtual void OnRspQryCombAction(CThostFtdcCombActionField *pCombAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询转帐流水响应virtual void OnRspQryTransferSerial(CThostFtdcTransferSerialField *pTransferSerial, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询银期签约关系响应virtual void OnRspQryAccountregister(CThostFtdcAccountregisterField *pAccountregister, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///报单通知virtual void OnRtnOrder(CThostFtdcOrderField *pOrder) {};///成交通知virtual void OnRtnTrade(CThostFtdcTradeField *pTrade) {};///报单录入错误回报virtual void OnErrRtnOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo) {};///报单操作错误回报virtual void OnErrRtnOrderAction(CThostFtdcOrderActionField *pOrderAction, CThostFtdcRspInfoField *pRspInfo) {};///合约交易状态通知virtual void OnRtnInstrumentStatus(CThostFtdcInstrumentStatusField *pInstrumentStatus) {};///交易所公告通知virtual void OnRtnBulletin(CThostFtdcBulletinField *pBulletin) {};///交易通知virtual void OnRtnTradingNotice(CThostFtdcTradingNoticeInfoField *pTradingNoticeInfo) {};///提示条件单校验错误virtual void OnRtnErrorConditionalOrder(CThostFtdcErrorConditionalOrderField *pErrorConditionalOrder) {};///执行宣告通知virtual void OnRtnExecOrder(CThostFtdcExecOrderField *pExecOrder) {};///执行宣告录入错误回报virtual void OnErrRtnExecOrderInsert(CThostFtdcInputExecOrderField *pInputExecOrder, CThostFtdcRspInfoField *pRspInfo) {};///执行宣告操作错误回报virtual void OnErrRtnExecOrderAction(CThostFtdcExecOrderActionField *pExecOrderAction, CThostFtdcRspInfoField *pRspInfo) {};///询价录入错误回报virtual void OnErrRtnForQuoteInsert(CThostFtdcInputForQuoteField *pInputForQuote, CThostFtdcRspInfoField *pRspInfo) {};///报价通知virtual void OnRtnQuote(CThostFtdcQuoteField *pQuote) {};///报价录入错误回报virtual void OnErrRtnQuoteInsert(CThostFtdcInputQuoteField *pInputQuote, CThostFtdcRspInfoField *pRspInfo) {};///报价操作错误回报virtual void OnErrRtnQuoteAction(CThostFtdcQuoteActionField *pQuoteAction, CThostFtdcRspInfoField *pRspInfo) {};///询价通知virtual void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp) {};///保证金监控中心用户令牌virtual void OnRtnCFMMCTradingAccountToken(CThostFtdcCFMMCTradingAccountTokenField *pCFMMCTradingAccountToken) {};///批量报单操作错误回报virtual void OnErrRtnBatchOrderAction(CThostFtdcBatchOrderActionField *pBatchOrderAction, CThostFtdcRspInfoField *pRspInfo) {};///期权自对冲通知virtual void OnRtnOptionSelfClose(CThostFtdcOptionSelfCloseField *pOptionSelfClose) {};///期权自对冲录入错误回报virtual void OnErrRtnOptionSelfCloseInsert(CThostFtdcInputOptionSelfCloseField *pInputOptionSelfClose, CThostFtdcRspInfoField *pRspInfo) {};///期权自对冲操作错误回报virtual void OnErrRtnOptionSelfCloseAction(CThostFtdcOptionSelfCloseActionField *pOptionSelfCloseAction, CThostFtdcRspInfoField *pRspInfo) {};///申请组合通知virtual void OnRtnCombAction(CThostFtdcCombActionField *pCombAction) {};///申请组合录入错误回报virtual void OnErrRtnCombActionInsert(CThostFtdcInputCombActionField *pInputCombAction, CThostFtdcRspInfoField *pRspInfo) {};///请求查询签约银行响应virtual void OnRspQryContractBank(CThostFtdcContractBankField *pContractBank, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询预埋单响应virtual void OnRspQryParkedOrder(CThostFtdcParkedOrderField *pParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询预埋撤单响应virtual void OnRspQryParkedOrderAction(CThostFtdcParkedOrderActionField *pParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询交易通知响应virtual void OnRspQryTradingNotice(CThostFtdcTradingNoticeField *pTradingNotice, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询经纪公司交易参数响应virtual void OnRspQryBrokerTradingParams(CThostFtdcBrokerTradingParamsField *pBrokerTradingParams, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询经纪公司交易算法响应virtual void OnRspQryBrokerTradingAlgos(CThostFtdcBrokerTradingAlgosField *pBrokerTradingAlgos, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///请求查询监控中心用户令牌virtual void OnRspQueryCFMMCTradingAccountToken(CThostFtdcQueryCFMMCTradingAccountTokenField *pQueryCFMMCTradingAccountToken, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///银行发起银行资金转期货通知virtual void OnRtnFromBankToFutureByBank(CThostFtdcRspTransferField *pRspTransfer) {};///银行发起期货资金转银行通知virtual void OnRtnFromFutureToBankByBank(CThostFtdcRspTransferField *pRspTransfer) {};///银行发起冲正银行转期货通知virtual void OnRtnRepealFromBankToFutureByBank(CThostFtdcRspRepealField *pRspRepeal) {};///银行发起冲正期货转银行通知virtual void OnRtnRepealFromFutureToBankByBank(CThostFtdcRspRepealField *pRspRepeal) {}; ///期货发起银行资金转期货通知virtual void OnRtnFromBankToFutureByFuture(CThostFtdcRspTransferField *pRspTransfer) {};///期货发起期货资金转银行通知virtual void OnRtnFromFutureToBankByFuture(CThostFtdcRspTransferField *pRspTransfer) {};///系统运行时期货端手工发起冲正银行转期货请求,银行处理完毕后报盘发回的通知virtual void OnRtnRepealFromBankToFutureByFutureManual(CThostFtdcRspRepealField *pRspRepeal) {};///系统运行时期货端手工发起冲正期货转银行请求,银行处理完毕后报盘发回的通知virtual void OnRtnRepealFromFutureToBankByFutureManual(CThostFtdcRspRepealField *pRspRepeal) {};///期货发起查询银行余额通知virtual void OnRtnQueryBankBalanceByFuture(CThostFtdcNotifyQueryAccountField *pNotifyQueryAccount) {};///期货发起银行资金转期货错误回报virtual void OnErrRtnBankToFutureByFuture(CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo) {};///期货发起期货资金转银行错误回报virtual void OnErrRtnFutureToBankByFuture(CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo) {};///系统运行时期货端手工发起冲正银行转期货错误回报virtual void OnErrRtnRepealBankToFutureByFutureManual(CThostFtdcReqRepealField *pReqRepeal, CThostFtdcRspInfoField *pRspInfo) {};///系统运行时期货端手工发起冲正期货转银行错误回报virtual void OnErrRtnRepealFutureToBankByFutureManual(CThostFtdcReqRepealField *pReqRepeal, CThostFtdcRspInfoField *pRspInfo) {};///期货发起查询银行余额错误回报virtual void OnErrRtnQueryBankBalanceByFuture(CThostFtdcReqQueryAccountField *pReqQueryAccount, CThostFtdcRspInfoField *pRspInfo) {};///期货发起冲正银行转期货请求,银行处理完毕后报盘发回的通知virtual void OnRtnRepealFromBankToFutureByFuture(CThostFtdcRspRepealField *pRspRepeal) {};///期货发起冲正期货转银行请求,银行处理完毕后报盘发回的通知virtual void OnRtnRepealFromFutureToBankByFuture(CThostFtdcRspRepealField *pRspRepeal) {};///期货发起银行资金转期货应答virtual void OnRspFromBankToFutureByFuture(CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///期货发起期货资金转银行应答virtual void OnRspFromFutureToBankByFuture(CThostFtdcReqTransferField *pReqTransfer, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///期货发起查询银行余额应答virtual void OnRspQueryBankAccountMoneyByFuture(CThostFtdcReqQueryAccountField *pReqQueryAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};///银行发起银期开户通知virtual void OnRtnOpenAccountByBank(CThostFtdcOpenAccountField *pOpenAccount) {};///银行发起银期销户通知virtual void OnRtnCancelAccountByBank(CThostFtdcCancelAccountField *pCancelAccount) {};///银行发起变更银行账号通知virtual void OnRtnChangeAccountByBank(CThostFtdcChangeAccountField *pChangeAccount) {};
*/public://保证唯一int      m_nRequestId;int     GetRequestId() {return ++m_nRequestId;   }MyCTPTrade  *m_Parent;};//thread
public:MyCTPTrade();~MyCTPTrade();static  MyCTPTrade *Instance();void    setMainWidget(void *widget);void  Init(const char  *User, const  char  *pswd, const  char  *broker, const char *pszAddress);map<string, CThostFtdcInstrumentField>&      GetMapInstrument();void setLog(const string&  str);bool      m_bLoginSuccessed;
public:///请求类函数,提供主要逻辑,供外部使用///用户登录请求int ReqUserLogin(CThostFtdcReqUserLoginField *pReqUserLoginField, int nRequestID) { return m_reqApi->ReqUserLogin(pReqUserLoginField, nRequestID );}///登出请求int ReqUserLogout(CThostFtdcUserLogoutField *pUserLogout, int nRequestID) { return m_reqApi->ReqUserLogout(pUserLogout, nRequestID); }public:///回报类函数,收到数据,更新本地行情信息///当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。void OnFrontConnected();///当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。///@param nReason 错误原因///        0x1001 网络读失败///        0x1002 网络写失败///        0x2001 接收心跳超时///        0x2002 发送心跳失败///        0x2003 收到错误报文void OnFrontDisconnected(int nReason);///心跳超时警告。当长时间未收到报文时,该方法被调用。///@param nTimeLapse 距离上次接收报文的时间void OnHeartBeatWarning(int nTimeLapse);void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);///登录请求响应void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);///登出请求响应void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);public:atomic<bool>
m_bQryIns;// 是否正在查询合约,如果正在查询,行情服务就不自己主动去订阅行情,因为查询合约完成后,会有订阅行情的动作atomic
<bool>
m_bQryInsOK;// 是否查询合约成功,成功订阅行情的动作private:CThostFtdcTraderApi* m_reqApi;MyRecv         *m_RecvSpi;//vector
<string /*InstrumentID*/>
m_vecInstrumentId;//合约ID//int         requestID;string   m_TradingDay;int    m_session ;int    m_frontId ;string  m_serverOrderRef ;int     m_nOrderRef;///用户登录信息CThostFtdcReqUserLoginField  *m_userLoginInfo;mutex    m_getInstru;void     *mainHandle;// 保存合约map<string, CThostFtdcInstrumentField> m_mapInstrument;//合约ID,合约信息map<wstring, map<wstring, map<wstring, CThostFtdcInstrumentField>>>    m_mapInstrument2;//交易所,板块,合约信息CConfigImpl*     m_pConfig;
};

①模块管理:

与CTP提供的行情库类似,这里定义了API和封装的回报API,如下:

CThostFtdcTraderApi* m_reqApi;
MyRecv         *m_RecvSpi;

②与UI通信

由于交易API用的比较频繁,而回报主要在初始化阶段和数据更新,没有定义回报接口,定义的是全局单例模式,直接共上层使用。

③数据管理

// 保存合约
map<string, CThostFtdcInstrumentField>                    m_mapInstrument;//合约ID,合约信息
map<wstring, map<wstring, map<wstring, CThostFtdcInstrumentField>>>   m_mapInstrument2;//交易所,板块,合约信息

3.程序注意点

①UI初始化:

调用TradeManager::InitCTP启动CTP模块,主模块会订阅注册:

MyCTPQuote::Instance()->Subscribe(this);

②交易模块与行情模块通信

当交易模块登陆成功后(通能说原子操作,来判断多条件满足),来调用行情的完成函数,已便行情模块来进行行情合约订阅

    int Qry   = atomic_exchange(&MyCTPTrade::Instance()->m_bQryIns, false);int QryOK = atomic_exchange(&MyCTPTrade::Instance()->m_bQryInsOK, true);if(!Qry && QryOK)FinishQryInstrument();

③行情回报

收到行情回报,会调用下函数:

void MyCTPQuote::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)

并组织结构,向订阅派发:

CBroadcastPacket   pack;
///深度行情通知
///每秒两次行情
void MyCTPQuote::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)
{if (pDepthMarketData->OpenPrice >= LDBL_MAX)pDepthMarketData->OpenPrice = 0;if (pDepthMarketData->HighestPrice >= LDBL_MAX)pDepthMarketData->HighestPrice = 0;if (pDepthMarketData->LowestPrice >= LDBL_MAX)pDepthMarketData->LowestPrice = 0;if (pDepthMarketData->ClosePrice >= LDBL_MAX)pDepthMarketData->ClosePrice = 0;if (pDepthMarketData->PreClosePrice >= LDBL_MAX)pDepthMarketData->PreClosePrice = 0;string str = "Quote SDK 接收行情信息:InstrumentID:";str  += pDepthMarketData->InstrumentID ;str += " TradingDay:";   str += pDepthMarketData->TradingDay;str += " LastPrice:"; str += to_string(pDepthMarketData->LastPrice);str += " Volume:"; str += to_string(pDepthMarketData->Volume);str += " OpenPrice:"; str += to_string(pDepthMarketData->OpenPrice);str += " HighestPrice:"; str += to_string(pDepthMarketData->HighestPrice);str += " LowestPrice:";  str += to_string(pDepthMarketData->LowestPrice);str += " ClosePrice:"; str += to_string(pDepthMarketData->ClosePrice);str += " PreClosePrice:"; str += to_string(pDepthMarketData->PreClosePrice);str += " UpdateTime:"; str += pDepthMarketData->UpdateTime;CRLog(E_APPINFO, str.c_str());//本地保存//转发到界面//CThostFtdcDepthMarketDataField  DepthMarketData;//memcpy_s(&DepthMarketData, sizeof(DepthMarketData) ,pDepthMarketData , sizeof(CThostFtdcDepthMarketDataField));//m_mapInstrumentQuote[pDepthMarketData->InstrumentID] = DepthMarketData;m_mapInstrumentQuote[pDepthMarketData->InstrumentID] = *pDepthMarketData;pack.SetParameter("InstrumentId", pDepthMarketData->InstrumentID);pack.SetParameter("TradingDay", pDepthMarketData->TradingDay);pack.SetParameter("OpenPrice", pDepthMarketData->OpenPrice);pack.SetParameter("HighestPrice", pDepthMarketData->HighestPrice);pack.SetParameter("LowestPrice", pDepthMarketData->LowestPrice);pack.SetParameter("ClosePrice", pDepthMarketData->ClosePrice);pack.SetParameter("PreClosePrice", pDepthMarketData->PreClosePrice);pack.SetParameter("UpperLimitPrice", pDepthMarketData->UpperLimitPrice);pack.SetParameter("LowerLimitPrice", pDepthMarketData->LowerLimitPrice);pack.SetParameter("AskPrice1", pDepthMarketData->AskPrice1);pack.SetParameter("AskVolume1", pDepthMarketData->AskVolume1);pack.SetParameter("BidPrice1", pDepthMarketData->BidPrice1);pack.SetParameter("BidVolume1", pDepthMarketData->BidVolume1);pack.SetParameter("LastPrice", pDepthMarketData->LastPrice);pack.SetParameter("Volume", pDepthMarketData->Volume);//给上层转发// 广播报文for (VPKTRECEIVER::iterator it = m_vPketReceiver.begin(); it < m_vPketReceiver.end(); it++){(*it)->Receive(pack);}}

④界面处理回报数据

收到数据可以按照自己的逻辑处理,本Demo进行了写共享队列。

QUOTATION quo = { 0 };
void TradeManager::Receive(CBroadcastPacket &pkt)
{unsigned int  nLen = 0;const char* pcBuf = pkt.Encode(nLen);//分发给相应队列处理quo.Decode(pcBuf, nLen);int uiCount = 0;string sXQueName, sTmp;for (vector< CXQueueIo<QUOTATION>* >::iterator it = m_vecQueueIo.begin(); it != m_vecQueueIo.end(); ++it){uiCount++;if (0 != *it){(*it)->Enque(quo);sXQueName = "XQUE" + strutils::ToString<unsigned int>(uiCount);sXQueName += ".XQUE_NAME";if (0 == m_pConfig->GetProperty(sXQueName, sTmp))sXQueName = sTmp;CRLog(E_APPINFO, "共享队列XQueue[%s]写完成", sXQueName.c_str());}}//end for}

4.注意

内嵌Framwork所生成的动态库为本Demo提供日志和共享内存队列以及行情数据定义,可以自行定义替换,不存在bug,不影响演示,代码由于版权问题,暂不能公开,若有需要,请联系作者。

代码下载:http://www.demodashi.com/demo/14125.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

转载于:https://www.cnblogs.com/demodashi/p/10486866.html

上海期货交易所CTP行情和交易接入相关推荐

  1. 免费提供基于backtrader的中国期货ctp行情以及交易接口

    免费提供基于backtrader的中国期货ctp行情以及交易接口. https://github.com/backtradercn/backtrader_cn_api_example 本安装包默认包含 ...

  2. C++连接CTP接口实现简单量化交易(行情、交易、k线、策略)

    对于量化交易来说,量化策略和技术系统缺一不可,为了知其所以然,本文实现了一个C++连接CTP接口进行仿真交易的demo,从接收行情.下订单.数据处理到添加策略.挂载运行交易等多个环节来看一下量化交易的 ...

  3. 分布式期货行情交易系统-行情及交易模块分析

    文章目录 目录 文章目录 前言 一.交易模块 1.用户管理 2.虚拟客户端 二.行情模块 1.实时数据采集 2.K线生成 3.K线服务 三 .云条件单模块 总结 前言 期货行情交易系统包含两个主要模块 ...

  4. ctp服务器的出版文件在那里,ctp行情服务器地址

    ctp行情服务器地址 内容精选 换一换 本文主要介绍了在华为云上如何使用弹性云服务器的Linux实例手工部署GitLab.GitLab是一个开源的版本管理系统,使用Git作为代码管理工具.该指导具体操 ...

  5. 上海期货计算机公司排名,双创实践行 ——记2017级计算机与金融工程实验班同学参观上海期货交易所...

    2018年10月25日,为进一步推进落实南京大学工程管理学院与上海期货交易所战略合作协议,学院副院长俞红海老师和教务员蔡睿璇老师带领2017级计算机与金融工程实验班全体同学赴上海期货交易所交流学习. ...

  6. 上海期货交易所数据备份软件项目前景与范围文档

    1.  业务需求 1.1 应用背景 期货交易所,是从事期货交易的人按照法律所组成的一种非营利性的会员制的团体的组织.期货交易所成立的目的,在于提供交易场所及其所需的设备和各种服务,制定交易规则,维护公 ...

  7. python获取期货行情_GitHub - lyymee/tqsdk-python: 期货行情/历史数据/交易 开发包

    Introduction TqSdk 是一套依托 DIFF协议 (Differential Information Flow for Finance) 的开源 python 框架. 它支持用户使用较少 ...

  8. Hello CTP(三)——CTP行情API

    一.期货行情数据 Tick数据一般指市场上的逐笔数据,例如一笔委托会产生一笔行情,一笔成交也会产生一笔行情.目前国内期货交易所还不支持推送逐笔数据,只推送切片(快照)数据. 切片数据是指将一定时间内的 ...

  9. 【邢不行|量化小讲堂系列47-实战篇】解密股票Level-2行情——高频交易的基础

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总]请点击此处 [必读文章]EOS期现 ...

最新文章

  1. 2016-11-17试题解题报告
  2. 安装 node-sass 时报错
  3. 蛋白结构建模与优化_最终幻想: 无中生有的蛋白质从头设计
  4. 递归 与 动态规划 区别
  5. mfc 子窗体 按钮不触发_资深程序员用c++开发MFC银行排队叫号系统,小白看了也能学会...
  6. ActiveReports 报表应用教程 (15)---报表换肤
  7. 并发问题的解决思路以及Go语言调度器工作原理
  8. 实用的pythondjango项目_推荐10个django开发过程中比较好用的第三方包
  9. AD下安装Exchange及简单收发邮件【视频】
  10. Chrome扩展程序开发文档(中文译文)
  11. RBF神经网络——案例一
  12. 【开源】EasyDarwin编译全过程:Linux系统下编译运行最新版EasyDarwin的步骤介绍
  13. Linux dos攻击服务器,Linux服务器如何防止DoS攻击
  14. 硬核干货,史上最强获取GitHub所有仓库内容数据分析教程
  15. 中山大学2021级研究生学术道德规范在线考试学习资料
  16. 在选择人员定位系统是应该注意什么?
  17. 【渝粤题库】广东开放大学 公共政策学 形成性考核
  18. Win10家庭版开启Administrator超级管理员账号 + Win10将中文用户文改为英文名
  19. 如何用Endnote插入网页资源作为参考文献
  20. Linux系统根目录各文件夹的含义

热门文章

  1. php微信支付结果通知接收,浅析PHP微信支付通知的处理方式
  2. 程序员述说阿里HR的恐怖:晚上11点接到面试电话
  3. 华为U8860刷机包 CM11 Andorid 4.4.4 稳定流畅 推荐长期使用
  4. 宏基linux连不上wifi,宏基电脑连不上无线网络怎么回事
  5. React入门小册(三)组件
  6. “互联网女皇”发趋势报告:移动互联网仍处起步
  7. HCIP H12-222 题库
  8. win10电脑桌面html,详细教您win10如何显示我的电脑在桌面
  9. 海量辅助无限多开 就在新浪页游助手
  10. 在PS2主机上使用OPL通过网络加载PC上的ISO玩游戏