来源:互联网转载 | 更新日期:2023-09-04 08:40:31
1.1 CTP简介
综合交易平台CTP(Comprehensive Transaction Platform)是由上海期货信息技术有限公司(上海期货交易所的全资子公司)开发的期货交易平台,CTP平台以“新一代交易所系统”的核心技术为基础,构建了稳定、高速、开放式的接口,适合程序化交易软件运用和短线炒单客户使用。投资者可直接用CTP的API开发交易程序,连到期货公司的CTP系统交易。
1.2 使用前的准备
1.2.1 登录信息
想要在客户端调用API接入CTP柜台进行程序化交易,需要以下基本信息才能登录(使用行情API只需要IP地址信息,其他均可为空):
1.2.2 simnow模拟交易
没有期货账户的用户可以在simnow平台【白天才能上】进行模拟开户,其中InvestorID和Password在官网注册后获得,其他登录需要的信息如下:
1.3 API介绍
1.3.1 API文件
Windows版本的API有8个文件,作用分别为:
1.3.2 API内容
2.1 行情API使用
在主函数中创建行情API对象,并为其注册MdSpi对象,连接到行情IP地址后登录,登录完成后即可订阅行情(代码中只展示了部分.cpp文件的内容)。
// main.cpp int main(int argc, char* argv[]) {CThostFtdcMdApi* mdapi = CThostFtdcMdApi::CreateFtdcMdApi("./md_file/");MdSpi* mdspi = new MdSpi(mdapi);mdapi->RegisterSpi(mdspi);mdapi->RegisterFront("tcp://180.168.146.187:10131");mdapi->Init();mdapi->Join();return 0; }//MdSpi.cpp void MdSpi::OnFrontConnected() {cout << "=========已连接上,请求登录==========" << endl;loginField = new CThostFtdcReqUserLoginField();strcpy(loginField->BrokerID, BROKER_ID.c_str());strcpy(loginField->UserID, NULL_STR.c_str());strcpy(loginField->Password, NULL_STR.c_str());mdapi->ReqUserLogin(loginField, loginRequestID++); }void MdSpi::OnRspUserLogin(CThostFtdcRspUserLoginField* pRspUserLogin, CThostFtdcRspInfoField* pRspInfo,int nRequestID, bool bIsLast) {cout << "==============登录请求响应===============" << endl;if (pRspInfo != nullptr || pRspInfo->ErrorID == 0) {cout << "登陆成功!!!" << endl;cout << "交易日:" << pRspUserLogin->TradingDay << endl;cout << "登陆成功时间:" << pRspUserLogin->LoginTime << endl;cout << "经纪公司代码:" << pRspUserLogin->BrokerID << endl;cout << "用户代码:" << pRspUserLogin->UserID << endl;//订阅行情char* instrumentID[] = { "au2110" }; //订阅一个合约所以数量为1mdapi->SubscribeMarketData(instrumentID, 1);} }void MdSpi::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField* pDepthMarketData) {cout << "==============深度行情通知==============" << endl;//cout << " 交易日:" << pDepthMarketData->TradingDay << endl;//cout << "合约代码:" << pDepthMarketData->InstrumentID << endl;//cout << "最新价:" << pDepthMarketData->LastPrice << endl;//cout << "最后修改时间" << pDepthMarketData->UpdateTime << endl;//cout << "最后修改毫秒" << pDepthMarketData->UpdateMillisec << endl;//cout << "申买价一:" << pDepthMarketData->BidPrice1 << endl;//cout << "申买量一:" << pDepthMarketData->BidVolume1 << endl;//cout << "申卖价一:" << pDepthMarketData->AskPrice1 << endl;//cout << "申卖量一:" << pDepthMarketData->AskVolume1 << endl;//cout << "本次结算价格:" << pDepthMarketData->SettlementPrice << endl;//cout << "成交金额:" << pDepthMarketData->Turnover << endl;//cout << "持仓量:" << pDepthMarketData->OpenInterest << endl; }2.2 交易API使用
在主函数中创建交易API对象,并为其注册TdSpi对象,订阅共有流和私有流,连接到交易IP地址后,依次进行验证、登录、结算确认,完成后即可发出交易API请求(代码中只展示了部分.cpp文件的内容)。
// main.cpp int main(int argc, char* argv[]) {TdApi* tdApi = new TdApi();while (true){int x;cout << "0退出;1验证;2登录;3结算确认;4查询持仓;5查询资金;6查询报单;7查询成交;8查询手续费;9报单;10撤单" << endl;cout << "输入:" << endl;cin >> x;if (x == 0) break;else if (x == 1) tdApi->Authenticate();else if (x == 2) tdApi->Login();else if (x == 3) tdApi->Confirm();else if (x == 4) tdApi->QueryPosition();else if (x == 5) tdApi->QueryAccount();else if (x == 6) tdApi->QueryOrder();else if (x == 7) tdApi->QueryTrade();else if (x == 8) {cout << "输入合约代码:";string instrumentID;cin >> instrumentID;tdApi->QueryCommission(instrumentID);}else if (x == 9) {cout << "输入合约代码:";string instrumentID;cin >> instrumentID;cout << "输入报单价格:";double limitPrice;cin >> limitPrice;cout << "输入报单数量:";int volume;cin >> volume;tdApi->InsertOrder(instrumentID, limitPrice, volume);}else if (x == 10) {tdApi->WithdrawOrder();}}return 0; }//TdApi.cpp TdApi::TdApi() {tdapi = CThostFtdcTraderApi::CreateFtdcTraderApi("./trader_file/");tdspi = new TdSpi();tdapi->RegisterSpi(tdspi);tdapi->SubscribePublicTopic(THOST_TERT_RESTART);tdapi->SubscribePrivateTopic(THOST_TERT_RESTART);//tdapi->RegisterFront("tcp://218.202.237.33:10203");tdapi->RegisterFront("tcp://180.168.146.187:10130");tdapi->Init(); }TdApi::~TdApi() {tdapi->RegisterSpi(nullptr);tdapi->Release();tdapi = nullptr;delete tdspi;tdspi = nullptr; }int TdApi::Authenticate() {CThostFtdcReqAuthenticateField* pReqAuthenticateField = new CThostFtdcReqAuthenticateField();strcpy(pReqAuthenticateField->BrokerID, BROKER.c_str());strcpy(pReqAuthenticateField->UserID, USER_ID.c_str());strcpy(pReqAuthenticateField->AuthCode, AUTH_CODE.c_str());strcpy(pReqAuthenticateField->AppID, APP_ID.c_str());cout << "RequestID:" << nRequestID << endl;return tdapi->ReqAuthenticate(pReqAuthenticateField, nRequestID++); }int TdApi::Login() {CThostFtdcReqUserLoginField* pReqUserLoginField = new CThostFtdcReqUserLoginField();strcpy(pReqUserLoginField->BrokerID, BROKER.c_str());strcpy(pReqUserLoginField->UserID, USER_ID.c_str());strcpy(pReqUserLoginField->Password, PASS.c_str());cout << "RequestID:" << nRequestID << endl;return tdapi->ReqUserLogin(pReqUserLoginField, nRequestID++); }int TdApi::Confirm() {CThostFtdcSettlementInfoConfirmField* pSettlementInfoConfirm = new CThostFtdcSettlementInfoConfirmField();strcpy(pSettlementInfoConfirm->BrokerID, BROKER.c_str());strcpy(pSettlementInfoConfirm->InvestorID, USER_ID.c_str());cout << "RequestID:" << nRequestID << endl;return tdapi->ReqSettlementInfoConfirm(pSettlementInfoConfirm, nRequestID++); }int TdApi::InsertOrder(string instrumentID, double limitPrice, int volume) {CThostFtdcInputOrderField* pInputOrder = new CThostFtdcInputOrderField();strcpy_s(pInputOrder->BrokerID, BROKER.c_str());strcpy_s(pInputOrder->InvestorID, USER_ID.c_str());strcpy_s(pInputOrder->ExchangeID, "SHFE");strcpy_s(pInputOrder->InstrumentID, instrumentID.c_str());pInputOrder->OrderPriceType = THOST_FTDC_OPT_LimitPrice;//限价pInputOrder->Direction = THOST_FTDC_D_Buy;//买pInputOrder->CombOffsetFlag[0] = THOST_FTDC_OF_Open;//开pInputOrder->CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;//投机pInputOrder->LimitPrice = limitPrice;pInputOrder->VolumeTotalOriginal = volume;pInputOrder->TimeCondition = THOST_FTDC_TC_GFD;///当日有效pInputOrder->VolumeCondition = THOST_FTDC_VC_AV;///任意数量pInputOrder->MinVolume = 1;pInputOrder->ContingentCondition = THOST_FTDC_CC_Immediately;pInputOrder->StopPrice = 300.0;pInputOrder->ForceCloseReason = THOST_FTDC_FCC_NotForceClose;pInputOrder->IsAutoSuspend = 0;pInputOrder->IsSwapOrder = 0;cout << "RequestID:" << nRequestID << endl;return tdapi->ReqOrderInsert(pInputOrder, nRequestID++); }2.3 API使用中的常见问题
3.1 确定报单的唯一性
3.2 报单状态编号OrderStatus
报单的状态编号由交易所返回,由枚举值标识,常见状态有:
3.3 查询与交易流控
使用客户端进行CTP交易时,可能会受到【CTP底层动态库、CTP柜台系统、交易所】对查询和交易的频率限制。
3.3.1 CTP底层动态库流控
目前底层动态库中的流控只针对查询,即API中所有以ReqQry开头的函数,此处流控分为两种:
3.3.2 CTP柜台系统流控
3.3.3 交易所流控
一般是报单时可能会触发该流控,该流控是区分交易所的,有的交易所会有此流控,有的交易所没有,遇到得比较少。受到交易所流控后会触发OnRtnOrder,在StatusMsg中报“CTP:交易所每秒发送请求数超过许可数”或者“CTP:交易所未处理请求超过许可数”。
上一篇:python代码大全
Copyright © 网站出售-网站交易平台 版权信息
网站备案号:黔ICP备2023004141号