交易接口

CTP-API

交易接口


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;
}

< 前页 回目录 后页 >