1.1 CTP简介
综合交易平台CTP(Comprehensive Transaction Platform)是由上海期货信息技术有限公司(上海期货交易所的全资子公司)开发的期货交易平台,CTP平台以“新一代交易所系统”的核心技术为基础,构建了稳定、高速、开放式的接口,适合程序化交易软件运用和短线炒单客户使用。投资者可直接用CTP的API开发交易程序,连到期货公司的CTP系统交易。
1.2 使用前的准备
1.2.1 登录信息
1.2.2 simnow模拟交易
没有期货账户的用户可以在【白天才能上】进行模拟开户,其中InvestorID和Password在官网注册后获得,其他登录需要的信息如下:
1.3 API介绍
1.3.1 API文件
Windows版本的API有8个文件,作用分别为:
typedef
为现有类型创建同义字1.3.2 API内容
2.1 行情API使用
// 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" }; //订阅一个合约所以数量为1
mdapi->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使用
// 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:交易所未处理请求超过许可数”。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务