Trade.cpp的代码跟MdApi.cpp的差不多。
//Trade.cpp
#include <iostream>
#include "Trade.h"
extern CThostFtdcTraderApi* TradeApi;
int tdRequestID = 0;
using namespace std;
void Trade::OnFrontConnected() {
cout << "网络链接链接成功" << endl;
//建议连接成功后要进行认证
CThostFtdcReqAuthenticateField req;
memset(&req, 0, sizeof(req));
strcpy(req.BrokerID, "0000");
strcpy(req.UserID, "888888");
strcpy(req.AppID, "123456");
strcpy(req.AuthCode, "000000");
strcpy(req.UserProductInfo, "mytest");
int iResult = TradeApi->ReqAuthenticate(&req, tdRequestID++);
}
void Trade::OnRspAuthenticate(CThostFtdcRspAuthenticateField* pRspAuthenticateField, CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast)
{
//int errorid = pRspInfo->ErrorID;
if (!isErrorRspInfo(pRspInfo))
{
MessageBox(NULL, TEXT("认证成功"), TEXT("认证成功"), 0);
}
else
{
MessageBoxA(NULL, pRspInfo->ErrorMsg, pRspInfo->ErrorMsg, 0);
}
//开始登录
CThostFtdcReqUserLoginField req;
memset(&req, 0, sizeof(req));
strcpy(req.BrokerID, "0198");
strcpy(req.UserID, "161797");
strcpy(req.Password, "!QAZ1qaz");
static int iRequestID = 0;
int iResult = TradeApi->ReqUserLogin(&req, iRequestID++);
if (!iResult)
cout << "发送登录请求成功" << endl;
else
cerr << "发送登录请求失败" << endl;
}
void Trade::OnRspUserLogin(CThostFtdcRspUserLoginField* pRspUserLogin, CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast)
{
bool bResult = pRspInfo && (pRspInfo->ErrorID != 0);
if (!bResult) {
cout << "账户登录成功" << endl;
cout << "交易日: " << pRspUserLogin->TradingDay << endl;
}
else
cerr << "返回错误--->>> ErrorID=" << pRspInfo->ErrorID << ", ErrorMsg=" << pRspInfo->ErrorMsg << endl;
}
bool Trade::isErrorRspInfo(CThostFtdcRspInfoField* pRspInfo)
{
bool bResult = pRspInfo && (pRspInfo->ErrorID != 0);
if (bResult)
std::cerr << "返回错误--->>> ErrorID=" << pRspInfo->ErrorID << ", ErrorMsg=" << pRspInfo->ErrorMsg << std::endl;
return bResult;
}
//main.cpp
CThostFtdcTraderApi* TradeApi;
void TradeConnect()
{
TradeApi = CThostFtdcTraderApi::CreateFtdcTraderApi();
cout << "CTP API Version: " << CThostFtdcTraderApi::GetApiVersion() << endl;
CThostFtdcTraderSpi* TradeSpi = new Trade;//建立了一个Spi实例--->TradeSpi,Trade-->指的是Trade.h里建立的class Trade : public CThostFtdcTraderSpi
TradeApi->RegisterSpi(TradeSpi);
TradeApi->RegisterFront("tcp://180.168.146.187:10201");//Trade Front:180.168.146.187:10201 24小时:180.168.146.187:10130
TradeApi->SubscribePrivateTopic(THOST_TERT_QUICK);
TradeApi->SubscribePublicTopic(THOST_TERT_QUICK);
TradeApi->Init();
}
第一部分我们先完成登录和认证功能,这一块跟行情接口是类似的。在程序中新建Trade.cpp和Trade.h。在Trade.h中加了一个能收到错误信息的函数,在cpp中会用到。
//Trade.h
#pragma once
#include"../sdk/ThostFtdcTraderApi.h"
#include"../sdk/ThostFtdcMdApi.h"
#include <stdio.h>
#include <Windows.h>
#pragma comment (lib, "thostmduserapi_se.lib")
#pragma comment (lib, "thosttraderapi_se.lib")
#pragma warning(disable : 4996)
extern int tdRequestID;
using namespace std;
class Trade : public CThostFtdcTraderSpi
{
public:
// 当客户端与交易后台建立起通信连接时(还未登录前,也就是在Init()之后),该方法被调用。
void OnFrontConnected();
//在发送登录请求之后,还需要重载回调函数 OnRspUserLogin 接收登陆信息。
void OnRspUserLogin(CThostFtdcRspUserLoginField* pRspUserLogin, CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast);
//客户端认证响应,当执行ReqAuthenticate后,该方法被调用
void OnRspAuthenticate(CThostFtdcRspAuthenticateField* pRspAuthenticateField, CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast);
// 是否收到错误信息
bool isErrorRspInfo(CThostFtdcRspInfoField* pRspInfo);
};
先写到这里了,剩下的好多功能等simnow开放了再写,要不然写完了测试不了。
文章为作者独立观点,不代表股票交易接口观点