交易接口
◇ 1.说明
交易员API提供了两个接口,分别为CThostFtdcTraderApi和CThostFtdcTraderSpi。这两个接口对FTD协议进行了封装,方便客户端应用程序的开发。客户端应用程序可以通过CThostFtdcTraderApi发出操作请求,通过继承CThostFtdcTraderSpi并重载回调函数来处理后台服务的响应。
交易员客户端应用程序至少由两个线程组成,一个是应用程序主线程,一个是交易员API工作线程。应用程序与交易系统的通讯是由 API工作线程驱动的。CThostFtdcTraderApi提供的接口是线程安全的,可以有多个应用程序线程同时发出请求。CThostFtdcTraderSpi提供的接口回调是由API工作线程驱动,通过实现SPI中的接口方法,可以从交易托管系统收取所需数据。如下图所示:
如果重载的某个回调函数阻塞,则等于阻塞了API工作线程,API与交易系统的通讯会停止。因此,在 CThostFtdcTraderSpi 派生类的回调函数中,通常应迅速返回,可以利用将数据放入缓冲区或通过Windows的消息机制来实现。
交易员 API 在运行过程中,会将一些数据写入本地文件中。调用CreateFtdcTraderApi函数,可以传递一个参数,指明存贮本地文件的路径。该路径必须在运行前已创建好。本地文件的扩展名都是”.con”。
注意以下事项:
在CThostFtdcTraderSpi 派生类的回调函数中应及时返回,不要阻塞。
API请求的输入参数不能为 NULL。
API请求的返回参数,0表示正确,其他表示错误,详细错误编码请查error.xml。
◇ 2.代码示例
//tradehandler.h
#include "ThostFtdcTraderApi.h"
#include "traderApi.h"
#include <string.h>
#include <stdio.h>
#include <Windows.h>
class CTraderHandler : public CThostFtdcTraderSpi
{
private:
CThostFtdcTraderApi *m_ptraderapi;
public:
void connect()
{
//创建API实例
m_ptraderapi = CThostFtdcTraderApi::CreateFtdcTraderApi("flow/"); //必须提前创建好flow目录
m_ptraderapi->RegisterSpi(this);
m_ptraderapi->SubscribePublicTopic(THOST_TERT_QUICK);
m_ptraderapi->SubscribePrivateTopic(THOST_TERT_QUICK); //设置私有流订阅模式
m_ptraderapi->RegisterFront("tcp://127.0.0.1:41205");
m_ptraderapi->Init();
//输出API版本信息
printf("%s\n", m_ptraderapi->GetApiVersion());
}
//释放
void release()
{
m_ptraderapi->Release();
}
//登陆
void login()
{
CThostFtdcReqUserLoginField t = {0};
strcpy_s(t.BrokerID, "1701");
strcpy_s(t.UserID, "1701_admin");
strcpy_s(t.Password, "1701_admin");
while (m_ptraderapi->ReqUserLogin(&t, 1)!=0) Sleep(1000);
}
//结算单确认
void settlementinfoConfirm()
{
CThostFtdcSettlementInfoConfirmField t = {0};
strcpy_s(t.BrokerID, "1701");
strcpy_s(t.InvestorID, "00001");
while (m_ptraderapi->ReqSettlementInfoConfirm(&t, 2)!=0) Sleep(1000);
}
//报单
void orderinsert()
{
CThostFtdcInputOrderField t = { 0 };
strcpy_s(t.BrokerID, "9999");
strcpy_s(t.InvestorID, "00001");
strcpy_s(t.UserID, "00001");
t.Direction = THOST_FTDC_D_Buy;
t.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
t.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
t.ContingentCondition = THOST_FTDC_CC_Immediately;
strcpy_s(t.InstrumentID, "sc1807");
t.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
t.LimitPrice = 490;
t.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
t.VolumeCondition = THOST_FTDC_VC_AV;
t.TimeCondition = THOST_FTDC_TC_GFD;
t.VolumeTotalOriginal = 1;
strcpy_s(t.OrderRef, "0000001");
while (m_ptraderapi->ReqOrderInsert(&t, 3) != 0) Sleep(1000);
}
//查询合约
void qryInstrument()
{
CThostFtdcQryInstrumentField t = { 0 };
strcpy_s(t.ExchangeID, "SHFE");
strcpy_s(t.InstrumentID, "zn1803");
while (m_ptraderapi->ReqQryInstrument(&t, 4) != 0) Sleep(1000);
}
//前置连接响应
void OnFrontConnected()
{
printf("OnFrontConnected\n");
}
//登陆请求响应
void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
printf("OnRspUserLogin\n");
}
//结算单确认响应
void OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
printf("OnRspSettlementInfoConfirm\n");
}
//查询合约响应
void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
printf("OnRspQryInstrument\n");
}
//报单通知
void OnRtnOrder(CThostFtdcOrderField *pOrder)
{
printf("OnRtnOrder\n");
}
//成交通知
void OnRtnTrade(CThostFtdcTradeField *pTrade)
{
printf("OnRtnTrade\n");
}
//报单录入请求响应
void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
printf("OnRspOrderInsert\n");
}
//错误应答
void OnRspError(CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
printf("OnRspError\n");
}
};
#include "tradehandler.h"
int main(int argc, char *argv[])
{
CTraderHandler *trader = new CTraderHandler();
trader->connect();
Sleep(2000);
trader->login();
Sleep(2000);
trader->settlementinfoConfirm();
Sleep(2000);
trader->qryInstrument();
Sleep(2000);
trader->orderinsert();
Sleep(INFINITE);
return 1;
}