目录
- main.h,main.cpp
- traderApi.h
- traderApi.cpp
- traderSpi.h
- traderSpi.cpp
main.h
#pragma once
#include "stdafx.h"
#include <list>
#include <iostream>
#include <string>
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include "ThostFtdcTraderApi.h"
#include "ThostFtdcMdApi.h"
#include "DataCollect.h"
#include <conio.h>
#include "getconfig.h"
#include "traderApi.h"
#include "define.h"
#include "traderSpi.h"
#include <vector>
#include <map>
using namespace std;
FILE *logfile;
// 报单录入操作是否完成的标志
// Create a manual reset event with no signal
HANDLE g_hEvent = CreateEvent(NULL, false, false, NULL);
/// 会员代码
TThostFtdcBrokerIDType g_chBrokerID;
/// 交易用户代码
TThostFtdcUserIDType g_chUserID;
/// 交易用户密码
TThostFtdcPasswordType g_chPassword;
/// 交易所代码
TThostFtdcExchangeIDType g_chExchangeID;
///合约代码
TThostFtdcInstrumentIDType g_chInstrumentID;
///投资者代码
TThostFtdcInvestorIDType g_chInvestorID;
///预埋撤单编号
TThostFtdcParkedOrderActionIDType g_chParkedOrderActionID1;
///预埋报单编号
TThostFtdcParkedOrderIDType g_chParkedOrderID1;
///报单引用
TThostFtdcOrderRefType g_chOrderRef;
///前置编号
TThostFtdcFrontIDType g_chFrontID;
///会话编号
TThostFtdcSessionIDType g_chSessionID;
///报单编号
TThostFtdcOrderSysIDType g_chOrderSysID;
///止损价
TThostFtdcPriceType g_chStopPrice;
///报价引用
TThostFtdcOrderRefType g_chQuoteRef;
int FrontID = 0;
int SessionID = 0;
int Limitprice = 0;
int nRequestID = 0;
int chioce_action = 0;//为0则全部报
vector<string> vector_OrderSysID;
vector<string> vector_ExchangeID;
vector<string> vector_InstrumentID;
vector<string> md_InstrumentID;
int action_number;
///执行宣告引用
TThostFtdcOrderRefType g_NewExecOrderRef;
///执行宣告编号
TThostFtdcExecOrderSysIDType g_NewExecOrderSysID;
///前置编号
TThostFtdcFrontIDType g_NewFrontID;
///会话编号
TThostFtdcSessionIDType g_NewSessionID;
//期权自对冲响应通知
///期权自对冲编号
TThostFtdcOrderSysIDType g_chOptionSelfCloseSysID;
///期权自对冲引用
TThostFtdcOrderRefType g_chOptionSelfCloseRef;
///用户端产品信息
TThostFtdcProductInfoType g_chUserProductInfo;
///认证码
TThostFtdcAuthCodeType g_chAuthCode;
///App代码
TThostFtdcAppIDType g_chAppID;
HANDLE xinhao = CreateEvent(NULL, false, false, NULL);
CTraderApi *pUserApi = new CTraderApi;
//行情类
class CSimpleMdHandler : public CThostFtdcMdSpi
{
public:
// 构造函数,需要一个有效的指向CThostFtdcMduserApi实例的指针
CSimpleMdHandler(CThostFtdcMdApi *pUserApi) : m_pUserMdApi(pUserApi) {}
~CSimpleMdHandler() {}
// 当客户端与交易托管系统建立起通信连接,客户端需要进行登录
virtual void OnFrontConnected()
{
/*strcpy_s(g_chBrokerID, getConfig("config", "BrokerID").c_str());
strcpy_s(g_chUserID, getConfig("config", "UserID").c_str());
strcpy_s(g_chPassword, getConfig("config", "Password").c_str());*/
ReqUserLogin();
}
void ReqUserLogin()
{
CThostFtdcReqUserLoginField reqUserLogin;
int num = m_pUserMdApi->ReqUserLogin(&reqUserLogin, 0);
LOG("\tlogin num = %d\n", num);
}
// 当客户端与交易托管系统通信连接断开时,该方法被调用
virtual void OnFrontDisconnected(int nReason)
{
// 当发生这个情况后,API会自动重新连接,客户端可不做处理
LOG("<OnFrontDisconnected>\n");
LOG("\tnReason= = [%d]", nReason);
LOG("</OnFrontDisconnected>\n");
}
// 当客户端发出登录请求之后,该方法会被调用,通知客户端登录是否成功
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin,
CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
LOG("OnRspUserLogin:\n");
LOG("\tErrorCode=[%d], ErrorMsg=[%s]\n", pRspInfo->ErrorID,
pRspInfo->ErrorMsg);
LOG("\tRequestID=[%d], Chain=[%d]\n", nRequestID, bIsLast);
if (pRspInfo->ErrorID != 0) {
// 端登失败,客户端需进行错误处理
LOG("\tFailed to login, errorcode=%d errormsg=%s requestid=%d chain = %d",
pRspInfo->ErrorID, pRspInfo->ErrorMsg, nRequestID, bIsLast);
exit(-1);
}
SetEvent(xinhao);
//SubscribeMarketData();//订阅行情
//SubscribeForQuoteRsp();//询价请求
}
void SubscribeMarketData()//收行情
{
int md_num = 0;
//char *ppInstrumentID[] = { "ag1912" }; // 行情订阅列表
//int result = m_pUserMdApi->SubscribeMarketData(ppInstrumentID, 1);
//*
char **ppInstrumentID = new char*[5000];
for (int count1 = 0; count1 <= md_InstrumentID.size() / 500; count1++)
{
if (count1 < md_InstrumentID.size() / 500)
{
int a = 0;
for (a; a < 500; a++)
{
ppInstrumentID[a] = const_cast<char *>(md_InstrumentID.at(md_num).c_str());
md_num++;
}
int result = m_pUserMdApi->SubscribeMarketData(ppInstrumentID, a);
LOG((result == 0) ? "订阅行情请求1......发送成功\n" : "订阅行情请求1......发送失败,错误序号=[%d]\n", result);
}
else if (count1 = md_InstrumentID.size() / 500)
{
int count2 = 0;
for (count2; count2 < md_InstrumentID.size() % 500; count2++)
{
ppInstrumentID[count2] = const_cast<char *>(md_InstrumentID.at(md_num).c_str());
md_num++;
}
int result = m_pUserMdApi->SubscribeMarketData(ppInstrumentID, count2);
LOG((result == 0) ? "订阅行情请求2......发送成功\n" : "订阅行情请求2......发送失败,错误序号=[%d]\n", result);
}
}
//*/
}
///订阅行情应答
virtual void OnRspSubMarketData(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
LOG("<OnRspSubMarketData>\n");
if (pSpecificInstrument)
{
LOG("\tInstrumentID = [%s]\n", pSpecificInstrument->InstrumentID);
}
if (pRspInfo)
{
LOG("\tErrorMsg = [%s]\n", pRspInfo->ErrorMsg);
LOG("\tErrorID = [%d]\n", pRspInfo->ErrorID);
}
LOG("\tnRequestID = [%d]\n", nRequestID);
LOG("\tbIsLast = [%d]\n", bIsLast);
LOG("</OnRspSubMarketData>\n");
}
///深度行情通知
virtual void OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)
{
LOG("<OnRtnDepthMarketData>\n");
if (pDepthMarketData)
{
LOG("\tInstrumentID = [%s]\n", pDepthMarketData->InstrumentID);
LOG("\tExchangeID = [%s]\n", pDepthMarketData->ExchangeID);
LOG("\tLastPrice = [%.8lf]\n", pDepthMarketData->LastPrice);
LOG("\tPreSettlementPrice = [%.8lf]\n", pDepthMarketData->PreSettlementPrice);
LOG("\tOpenPrice = [%.8lf]\n", pDepthMarketData->OpenPrice);
LOG("\tVolume = [%d]\n", pDepthMarketData->Volume);
LOG("\tTurnover = [%.8lf]\n", pDepthMarketData->Turnover);
LOG("\tOpenInterest = [%d]\n", pDepthMarketData->OpenInterest);
}
LOG("</OnRtnDepthMarketData>\n");
}
///订阅询价请求
void SubscribeForQuoteRsp()
{
LOG("行情中订阅询价请求\n");
char **ppInstrumentID = new char*[50];
string g_chInstrumentID = getConfig("config", "InstrumentID");
ppInstrumentID[0] = const_cast<char *>(g_chInstrumentID.c_str());
int result = m_pUserMdApi->SubscribeForQuoteRsp(ppInstrumentID, 1);
}
///订阅询价应答
virtual void OnRspSubForQuoteRsp(CThostFtdcSpecificInstrumentField *pSpecificInstrument, CThostFtdcRspInfoField *pRspInfo,
int nRequestID, bool bIsLast)
{
LOG("<OnRspSubForQuoteRsp>\n");
if (pSpecificInstrument)
{
LOG("\tInstrumentID = [%s]\n", pSpecificInstrument->InstrumentID);
}
if (pRspInfo)
{
LOG("\tErrorMsg = [%s]\n", pRspInfo->ErrorMsg);
LOG("\tErrorID = [%d]\n", pRspInfo->ErrorID);
}
LOG("\tnRequestID = [%d]\n", nRequestID);
LOG("\tbIsLast = [%d]\n", bIsLast);
LOG("</OnRspSubForQuoteRsp>\n");
SetEvent(xinhao);
}
///询价通知
virtual void OnRtnForQuoteRsp(CThostFtdcForQuoteRspField *pForQuoteRsp)
{
LOG("<OnRtnForQuoteRsp>\n");
if (pForQuoteRsp)
{
LOG("\tTradingDay = [%s]\n", pForQuoteRsp->TradingDay);
LOG("\tInstrumentID = [%s]\n", pForQuoteRsp->InstrumentID);
LOG("\tForQuoteSysID = [%s]\n", pForQuoteRsp->ForQuoteSysID);
LOG("\tForQuoteTime = [%s]\n", pForQuoteRsp->ForQuoteTime);
LOG("\tActionDay = [%s]\n", pForQuoteRsp->ActionDay);
LOG("\tExchangeID = [%s]\n", pForQuoteRsp->ExchangeID);
}
LOG("</OnRtnForQuoteRsp>\n");
SetEvent(xinhao);
}
private:
// 指向CThostFtdcMduserApi实例的指针
CThostFtdcMdApi *m_pUserMdApi;
};
//交易类
class CSimpleHandler : public CTraderSpi
{
public:
CSimpleHandler(CThostFtdcTraderApi *pUserApi) :
m_pUserApi(pUserApi) {}
~CSimpleHandler() {}
virtual void OnFrontConnected()
{
strcpy_s(g_chBrokerID, getConfig("config", "BrokerID").c_str());
strcpy_s(g_chUserID, getConfig("config", "UserID").c_str());
strcpy_s(g_chPassword, getConfig("config", "Password").c_str());
strcpy_s(g_chInvestorID, getConfig("config", "InvestorID").c_str());
strcpy_s(g_chAuthCode, getConfig("config", "AuthCode").c_str());
strcpy_s(g_chAppID, getConfig("config", "AppID").c_str());
//strcpy_s(g_NewExecOrderRef, "");
//strcpy_s(g_NewExecOrderSysID, "");
g_NewFrontID = 0;
g_NewSessionID = 0;
//ReqUserLogin();
//ReqAuthenticate();
SetEvent(g_hEvent);
}
//客户端认证
void ReqAuthenticate()
{
//strcpy_s(g_chUserProductInfo, getConfig("config", "UserProductInfo").c_str());
strcpy_s(g_chAuthCode, getConfig("config", "AuthCode").c_str());
strcpy_s(g_chAppID, getConfig("config", "AppID").c_str());
CThostFtdcReqAuthenticateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
//strcpy_s(a.UserProductInfo, "");
strcpy_s(a.AuthCode, g_chAuthCode);
strcpy_s(a.AppID, g_chAppID);
int b = m_pUserApi->ReqAuthenticate(&a, 1);
printf("\t客户端认证 = [%d]\n", b);
}
///客户端认证响应
virtual void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo,
int nRequestID, bool bIsLast)
{
CTraderSpi::OnRspAuthenticate(pRspAuthenticateField, pRspInfo, nRequestID, bIsLast);
SetEvent(g_hEvent);
}
void RegisterFensUserInfo()
{
CThostFtdcFensUserInfoField pFensUserInfo = { 0 };
strcpy_s(pFensUserInfo.BrokerID, g_chBrokerID);
strcpy_s(pFensUserInfo.UserID, g_chUserID);
pFensUserInfo.LoginMode = THOST_FTDC_LM_Trade;
m_pUserApi->RegisterFensUserInfo(&pFensUserInfo);
}
/*virtual void OnFrontDisconnected(int nReason)
{
LOG("<OnFrontDisconnected>\n");
LOG("\tnReason = %d\n", nReason);
LOG("</OnFrontDisconnected>\n");
}*/
void ReqUserLogin()
{
CThostFtdcReqUserLoginField reqUserLogin = { 0 };
strcpy_s(reqUserLogin.BrokerID, g_chBrokerID);
strcpy_s(reqUserLogin.UserID, g_chUserID);
strcpy_s(reqUserLogin.Password, g_chPassword);
//strcpy_s(reqUserLogin.ClientIPAddress, "::c0a8:0101");
//strcpy_s(reqUserLogin.UserProductInfo, "123");
// 发出登陆请求
m_pUserApi->ReqUserLogin(&reqUserLogin, nRequestID++);
}
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin,
CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
FrontID = pRspUserLogin->FrontID;
SessionID = pRspUserLogin->SessionID;
CTraderSpi::OnRspUserLogin(pRspUserLogin, pRspInfo, nRequestID, bIsLast);
if (pRspInfo->ErrorID != 0)
//if (pRspInfo)
{
LOG("\tFailed to login, errorcode=[%d]\n \terrormsg=[%s]\n \trequestid = [%d]\n \tchain = [%d]\n",
pRspInfo->ErrorID, pRspInfo->ErrorMsg, nRequestID, bIsLast);
//exit(-1);
}
SetEvent(g_hEvent);
}
void ReqUserLogout()
{
CThostFtdcUserLogoutField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
m_pUserApi->ReqUserLogout(&a, nRequestID++);
}
///登出请求响应
virtual void OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
LOG("<OnRspUserLogout>\n");
if (pUserLogout)
{
LOG("\tBrokerID [%s]\n", pUserLogout->BrokerID);
LOG("\tUserID [%s]\n", pUserLogout->UserID);
}
if (pRspInfo)
{
LOG("\tErrorMsg [%s]\n", pRspInfo->ErrorMsg);
LOG("\tErrorID [%d]\n", pRspInfo->ErrorID);
}
LOG("\tnRequestID [%d]\n", nRequestID);
LOG("\tbIsLast [%d]\n", bIsLast);
LOG("</OnRspUserLogout>\n");
pUserApi->Release();
}
///请求确认结算单
void ReqSettlementInfoConfirm()
{
CThostFtdcSettlementInfoConfirmField Confirm = { 0 };
///经纪公司代码
strcpy_s(Confirm.BrokerID, g_chBrokerID);
///投资者代码
strcpy_s(Confirm.InvestorID, g_chUserID);
m_pUserApi->ReqSettlementInfoConfirm(&Confirm, nRequestID++);
}
///投资者结算结果确认响应
virtual void OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm,
CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
CTraderSpi::OnRspSettlementInfoConfirm(pSettlementInfoConfirm, pRspInfo, nRequestID, bIsLast);
SetEvent(g_hEvent);
}
///用户口令更新请求
void ReqUserPasswordUpdate()
{
string newpassword;
LOG("请输入新登录密码:\n");
cin >> newpassword;
CThostFtdcUserPasswordUpdateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
strcpy_s(a.OldPassword, g_chPassword);
strcpy_s(a.NewPassword, newpassword.c_str());
int b = m_pUserApi->ReqUserPasswordUpdate(&a, nRequestID++);
LOG((b == 0) ? "用户口令更新请求......发送成功\n" : "用户口令更新请求......发送失败,序号=[%d]\n", b);
}
///用户口令更新请求响应
virtual void OnRspUserPasswordUpdate(CThostFtdcUserPasswordUpdateField *pUserPasswordUpdate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
CTraderSpi::OnRspUserPasswordUpdate(pUserPasswordUpdate, pRspInfo, nRequestID, bIsLast);
SetEvent(g_hEvent);
}
///资金账户口令更新请求
void ReqTradingAccountPasswordUpdate()
{
string newpassword;
LOG("请输入新资金密码:\n");
cin >> newpassword;
CThostFtdcTradingAccountPasswordUpdateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.AccountID, g_chInvestorID);
strcpy_s(a.OldPassword, g_chPassword);
strcpy_s(a.NewPassword, newpassword.c_str());
strcpy_s(a.CurrencyID, "CNY");
int b = m_pUserApi->ReqTradingAccountPasswordUpdate(&a, nRequestID++);
LOG((b == 0) ? "资金账户口令更新请求......发送成功\n" : "资金账户口令更新请求......发送失败,序号=[%d]\n", b);
}
///资金账户口令更新请求响应
virtual void OnRspTradingAccountPasswordUpdate(CThostFtdcTradingAccountPasswordUpdateField *pTradingAccountPasswordUpdate, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
CTraderSpi::OnRspTradingAccountPasswordUpdate(pTradingAccountPasswordUpdate, pRspInfo, nRequestID, bIsLast);
SetEvent(g_hEvent);
}
///预埋单录入//限价单
void ReqParkedOrderInsert()
{
int limitprice = 0;
LOG("请输入限价单价格:(默认0)\n");
cin >> limitprice;
CThostFtdcParkedOrderField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.UserID, g_chUserID);
a.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
a.Direction = THOST_FTDC_D_Buy;
a.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
a.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
a.LimitPrice = limitprice;
a.VolumeTotalOriginal = 1;
a.TimeCondition = THOST_FTDC_TC_GFD;
a.VolumeCondition = THOST_FTDC_VC_AV;
a.MinVolume = 1;
a.ContingentCondition = THOST_FTDC_CC_Immediately;
a.StopPrice = 0;
a.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
a.IsAutoSuspend = 0;
strcpy_s(a.ExchangeID, g_chExchangeID);
int b = m_pUserApi->ReqParkedOrderInsert(&a, nRequestID++);
LOG((b == 0) ? "请求录入预埋单......发送成功\n" : "请求录入预埋单......发送失败,序号=[%d]\n", b);
}
///预埋撤单录入请求
void ReqParkedOrderAction()
{
CThostFtdcParkedOrderActionField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
//strcpy_s(a.OrderRef, " 15");
strcpy_s(a.ExchangeID, g_chExchangeID);
/*a.FrontID = 1;
a.SessionID = -287506422;*/
strcpy_s(a.OrderSysID, g_chOrderSysID);
strcpy_s(a.UserID, g_chUserID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
a.ActionFlag = THOST_FTDC_AF_Delete;
int b = m_pUserApi->ReqParkedOrderAction(&a, nRequestID++);
LOG((b == 0) ? "请求录入预埋撤单......发送成功\n" : "请求录入预埋撤单......发送失败,序号=[%d]\n", b);
}
///请求删除预埋单
void ReqRemoveParkedOrder()
{
CThostFtdcRemoveParkedOrderField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.ParkedOrderID, g_chParkedOrderID1);
int b = m_pUserApi->ReqRemoveParkedOrder(&a, nRequestID++);
LOG((b == 0) ? "请求删除预埋单......发送成功\n" : "请求删除预埋单......发送失败,序号=[%d]\n", b);
}
///请求删除预埋撤单
void ReqRemoveParkedOrderAction()
{
CThostFtdcRemoveParkedOrderActionField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.ParkedOrderActionID, g_chParkedOrderActionID1);
int b = m_pUserApi->ReqRemoveParkedOrderAction(&a, nRequestID++);
LOG((b == 0) ? "请求删除预埋撤单......发送成功\n" : "请求删除预埋撤单......发送失败,序号=[%d]\n", b);
}
///报单录入请求
void ReqOrderInsert_Ordinary()
{
system("cls");
string new_limitprice;
LOG("请输入指定价格:\n");
cin >> new_limitprice;
CThostFtdcInputOrderField ord = { 0 };
strcpy_s(ord.BrokerID, g_chBrokerID);
strcpy_s(ord.InvestorID, g_chInvestorID);
strcpy_s(ord.InstrumentID, g_chInstrumentID);
strcpy_s(ord.UserID, g_chUserID);
ord.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
int num1;
Direction:LOG("请选择买卖方向\t1.买\t2.卖\n");
cin >> num1;
if(num1==1){
ord.Direction = THOST_FTDC_D_Buy;//买
}
else if (num1 == 2) {
ord.Direction = THOST_FTDC_D_Sell;//卖
}
else {
LOG("输入错误请重新输入\n");
_getch();
goto Direction;
}
int num2;
CombOffsetFlag:LOG("请输入开平方向\t1.开仓\t2.平仓\t3.强平\t4.平今\t5.平昨\t6.强减\t7.本地强平\n");
cin >> num2;
if (num2 == 1) {
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
}
else if (num2 == 2) {
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Close;
}
else if (num2 == 3) {
ord.CombOffsetFlag[0] = THOST_FTDC_OF_ForceClose;
}
else if (num2 == 4) {
ord.CombOffsetFlag[0] = THOST_FTDC_OF_CloseToday;
}
else if (num2 == 5) {
ord.CombOffsetFlag[0] = THOST_FTDC_OF_CloseYesterday;
}
else if (num2 == 6) {
ord.CombOffsetFlag[0] = THOST_FTDC_OF_ForceOff;
}
else if (num2 == 7) {
ord.CombOffsetFlag[0] = THOST_FTDC_OF_LocalForceClose;
}
else {
LOG("输入错误请重新输入\n");
_getch();
goto CombOffsetFlag;
}
//ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
strcpy_s(ord.CombHedgeFlag, "1");
//ord.LimitPrice = atoi(getConfig("config", "LimitPrice").c_str());
ord.LimitPrice = atoi(new_limitprice.c_str());
ord.VolumeTotalOriginal = 1;
ord.TimeCondition = THOST_FTDC_TC_GFD;///当日有效
ord.VolumeCondition = THOST_FTDC_VC_CV;///全部数量
ord.MinVolume = 1;
ord.ContingentCondition = THOST_FTDC_CC_Immediately;
ord.StopPrice = 0;
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
ord.IsAutoSuspend = 0;
strcpy_s(ord.ExchangeID, g_chExchangeID);
int a = m_pUserApi->ReqOrderInsert(&ord, 1);
LOG((a == 0) ? "报单录入请求限价单......发送成功\n" : "报单录入请求限价单......发送失败,序号=[%d]\n", a);
}
///大商所止损单
void ReqOrderInsert_Touch()
{
int new_limitprice;
LOG("请输入指定价格limitprice:\n");
cin >> new_limitprice;
int new_StopPrice;
LOG("请输入指定价格stopprice:\n");
cin >> new_StopPrice;
CThostFtdcInputOrderField ord = { 0 };
strcpy_s(ord.BrokerID, g_chBrokerID);
strcpy_s(ord.InvestorID, g_chInvestorID);
strcpy_s(ord.InstrumentID, g_chInstrumentID);
strcpy_s(ord.UserID, g_chUserID);
//strcpy_s(ord.OrderRef, "");
ord.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
ord.Direction = THOST_FTDC_D_Buy;//买
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
//ord.LimitPrice = atoi(getConfig("config", "LimitPrice").c_str());
ord.LimitPrice = new_limitprice;
ord.VolumeTotalOriginal = 1;
ord.TimeCondition = THOST_FTDC_TC_GFD;///当日有效
ord.VolumeCondition = THOST_FTDC_VC_AV;///任何数量
ord.MinVolume = 1;
ord.ContingentCondition = THOST_FTDC_CC_Touch;
ord.StopPrice = new_StopPrice;
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
ord.IsAutoSuspend = 0;
strcpy_s(ord.ExchangeID, g_chExchangeID);
int a = m_pUserApi->ReqOrderInsert(&ord, 1);
LOG((a == 0) ? "报单录入请求限价单......发送成功\n" : "报单录入请求限价单......发送失败,序号=[%d]\n", a);
}
///大商所止盈单
void ReqOrderInsert_TouchProfit()
{
int new_limitprice;
LOG("请输入指定价格limitprice:\n");
cin >> new_limitprice;
int new_StopPrice;
LOG("请输入指定价格stopprice:\n");
cin >> new_StopPrice;
CThostFtdcInputOrderField ord = { 0 };
strcpy_s(ord.BrokerID, g_chBrokerID);
strcpy_s(ord.InvestorID, g_chInvestorID);
strcpy_s(ord.InstrumentID, g_chInstrumentID);
strcpy_s(ord.UserID, g_chUserID);
//strcpy_s(ord.OrderRef, "");
ord.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
ord.Direction = THOST_FTDC_D_Buy;//买
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
//ord.LimitPrice = atoi(getConfig("config", "LimitPrice").c_str());
ord.LimitPrice = new_limitprice;
ord.VolumeTotalOriginal = 1;
ord.TimeCondition = THOST_FTDC_TC_GFD;///当日有效
ord.VolumeCondition = THOST_FTDC_VC_AV;///全部数量
ord.MinVolume = 1;
ord.ContingentCondition = THOST_FTDC_CC_TouchProfit;
ord.StopPrice = new_StopPrice;
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
ord.IsAutoSuspend = 0;
strcpy_s(ord.ExchangeID, g_chExchangeID);
int a = m_pUserApi->ReqOrderInsert(&ord, 1);
LOG((a == 0) ? "报单录入请求限价单......发送成功\n" : "报单录入请求限价单......发送失败,序号=[%d]\n", a);
}
//全成全撤
void ReqOrderInsert_VC_CV()
{
int new_limitprice;
LOG("请输入指定价格:\n");
cin >> new_limitprice;
int insert_num;
LOG("请输入下单数量:\n");
cin >> insert_num;
CThostFtdcInputOrderField ord = { 0 };
strcpy_s(ord.BrokerID, g_chBrokerID);
strcpy_s(ord.InvestorID, g_chInvestorID);
strcpy_s(ord.InstrumentID, g_chInstrumentID);
strcpy_s(ord.UserID, g_chUserID);
//strcpy_s(ord.OrderRef, "");
ord.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
ord.Direction = THOST_FTDC_D_Buy;//买
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
//ord.LimitPrice = atoi(getConfig("config", "LimitPrice").c_str());
ord.LimitPrice = new_limitprice;
ord.VolumeTotalOriginal = insert_num;
ord.TimeCondition = THOST_FTDC_TC_GFD;///当日有效
ord.VolumeCondition = THOST_FTDC_VC_CV;///全部数量
ord.MinVolume = 1;
ord.ContingentCondition = THOST_FTDC_CC_Immediately;
ord.StopPrice = 0;
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
ord.IsAutoSuspend = 0;
strcpy_s(ord.ExchangeID, g_chExchangeID);
int a = m_pUserApi->ReqOrderInsert(&ord, 1);
LOG((a == 0) ? "报单录入请求限价单......发送成功\n" : "报单录入请求限价单......发送失败,序号=[%d]\n", a);
}
//部成部撤
void ReqOrderInsert_VC_AV()
{
int new_limitprice;
LOG("请输入指定价格:\n");
cin >> new_limitprice;
int insert_num;
LOG("请输入下单数量:\n");
cin >> insert_num;
CThostFtdcInputOrderField ord = { 0 };
strcpy_s(ord.BrokerID, g_chBrokerID);
strcpy_s(ord.InvestorID, g_chInvestorID);
strcpy_s(ord.InstrumentID, g_chInstrumentID);
strcpy_s(ord.UserID, g_chUserID);
//strcpy_s(ord.OrderRef, "");
ord.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
ord.Direction = THOST_FTDC_D_Buy;//买
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
//ord.LimitPrice = atoi(getConfig("config", "LimitPrice").c_str());
ord.LimitPrice = new_limitprice;
ord.VolumeTotalOriginal = insert_num;
ord.TimeCondition = THOST_FTDC_TC_GFD;///当日有效
ord.VolumeCondition = THOST_FTDC_VC_AV;///任何数量
ord.MinVolume = 1;
ord.ContingentCondition = THOST_FTDC_CC_Immediately;
ord.StopPrice = 0;
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
ord.IsAutoSuspend = 0;
strcpy_s(ord.ExchangeID, g_chExchangeID);
int a = m_pUserApi->ReqOrderInsert(&ord, 1);
LOG((a == 0) ? "报单录入请求限价单......发送成功\n" : "报单录入请求限价单......发送失败,序号=[%d]\n", a);
}
//市价单
void ReqOrderInsert_AnyPrice()
{
CThostFtdcInputOrderField ord = { 0 };
strcpy_s(ord.BrokerID, g_chBrokerID);
strcpy_s(ord.InvestorID, g_chInvestorID);
strcpy_s(ord.InstrumentID, g_chInstrumentID);
strcpy_s(ord.UserID, g_chUserID);
//strcpy_s(ord.OrderRef, "");
ord.OrderPriceType = THOST_FTDC_OPT_AnyPrice;
ord.Direction = THOST_FTDC_D_Buy;//买
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
//ord.LimitPrice = atoi(getConfig("config", "LimitPrice").c_str());
//ord.LimitPrice = new_limitprice;
ord.LimitPrice = 0;
ord.VolumeTotalOriginal = 1;
ord.TimeCondition = THOST_FTDC_TC_IOC;///立即完成,否则撤销
ord.VolumeCondition = THOST_FTDC_VC_AV;///任何数量
ord.MinVolume = 1;
ord.ContingentCondition = THOST_FTDC_CC_Immediately;
//ord.StopPrice = 0;
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
ord.IsAutoSuspend = 0;
strcpy_s(ord.ExchangeID, g_chExchangeID);
int a = m_pUserApi->ReqOrderInsert(&ord, 1);
LOG((a == 0) ? "报单录入请求限价单......发送成功\n" : "报单录入请求限价单......发送失败,序号=[%d]\n", a);
}
//市价转限价单(中金所)
void ReqOrderInsert_BestPrice()
{
CThostFtdcInputOrderField ord = { 0 };
strcpy_s(ord.BrokerID, g_chBrokerID);
strcpy_s(ord.InvestorID, g_chInvestorID);
strcpy_s(ord.InstrumentID, g_chInstrumentID);
strcpy_s(ord.UserID, g_chUserID);
//strcpy_s(ord.OrderRef, "");
ord.OrderPriceType = THOST_FTDC_OPT_BestPrice;
ord.Direction = THOST_FTDC_D_Buy;//买
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
//ord.LimitPrice = atoi(getConfig("config", "LimitPrice").c_str());
//ord.LimitPrice = new_limitprice;
ord.VolumeTotalOriginal = 1;
ord.TimeCondition = THOST_FTDC_TC_GFD;///当日有效
ord.VolumeCondition = THOST_FTDC_VC_AV;///任何数量
ord.MinVolume = 1;
ord.ContingentCondition = THOST_FTDC_CC_Immediately;
ord.StopPrice = 0;
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
ord.IsAutoSuspend = 0;
strcpy_s(ord.ExchangeID, g_chExchangeID);
int a = m_pUserApi->ReqOrderInsert(&ord, 1);
LOG((a == 0) ? "报单录入请求限价单......发送成功\n" : "报单录入请求限价单......发送失败,序号=[%d]\n", a);
}
//套利指令
void ReqOrderInsert_Arbitrage()
{
int new_limitprice;
LOG("请输入指定价格:\n");
cin >> new_limitprice;
CThostFtdcInputOrderField ord = { 0 };
strcpy_s(ord.BrokerID, g_chBrokerID);
strcpy_s(ord.InvestorID, g_chInvestorID);
strcpy_s(ord.InstrumentID, g_chInstrumentID);
strcpy_s(ord.UserID, g_chUserID);
//strcpy_s(ord.OrderRef, "");
ord.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
ord.Direction = THOST_FTDC_D_Buy;//买
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
//ord.LimitPrice = atoi(getConfig("config", "LimitPrice").c_str());
ord.LimitPrice = new_limitprice;
ord.VolumeTotalOriginal = 1;
ord.TimeCondition = THOST_FTDC_TC_GFD;///当日有效
ord.VolumeCondition = THOST_FTDC_VC_AV;///任何数量
ord.MinVolume = 1;
ord.ContingentCondition = THOST_FTDC_CC_Immediately;
ord.StopPrice = 0;
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
ord.IsAutoSuspend = 0;
strcpy_s(ord.ExchangeID, g_chExchangeID);
int a = m_pUserApi->ReqOrderInsert(&ord, 1);
LOG((a == 0) ? "报单录入请求限价单......发送成功\n" : "报单录入请求限价单......发送失败,序号=[%d]\n", a);
}
//互换单
void ReqOrderInsert_IsSwapOrder()
{
int new_limitprice;
LOG("请输入指定价格:\n");
cin >> new_limitprice;
CThostFtdcInputOrderField ord = { 0 };
strcpy_s(ord.BrokerID, g_chBrokerID);
strcpy_s(ord.InvestorID, g_chInvestorID);
strcpy_s(ord.InstrumentID, g_chInstrumentID);
strcpy_s(ord.UserID, g_chUserID);
//strcpy_s(ord.OrderRef, "");
ord.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
ord.Direction = THOST_FTDC_D_Buy;//买
ord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
//ord.LimitPrice = atoi(getConfig("config", "LimitPrice").c_str());
ord.LimitPrice = new_limitprice;
ord.VolumeTotalOriginal = 1;
ord.TimeCondition = THOST_FTDC_TC_GFD;///当日有效
ord.VolumeCondition = THOST_FTDC_VC_AV;///任何数量
ord.MinVolume = 1;
ord.ContingentCondition = THOST_FTDC_CC_Immediately;
ord.StopPrice = 0;
ord.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
ord.IsAutoSuspend = 0;
ord.IsSwapOrder = 1;//互换单标志
strcpy_s(ord.ExchangeID, g_chExchangeID);
int a = m_pUserApi->ReqOrderInsert(&ord, 1);
LOG((a == 0) ? "报单录入请求限价单......发送成功\n" : "报单录入请求限价单......发送失败,序号=[%d]\n", a);
}
///报单操作请求
void ReqOrderAction_Ordinary()
{
CThostFtdcInputOrderActionField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
a.OrderActionRef = 1;
strcpy_s(a.OrderRef, g_chOrderRef);
//a.FrontID = g_chFrontID;
//a.SessionID = g_chSessionID;
strcpy_s(a.ExchangeID, g_chExchangeID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.OrderSysID, g_chOrderSysID);
a.ActionFlag = THOST_FTDC_AF_Delete;
strcpy_s(a.UserID, g_chUserID);
int ab = m_pUserApi->ReqOrderAction(&a, nRequestID++);
LOG((ab == 0) ? "报单操作请求......发送成功\n" : "报单操作请求......发送失败,序号=[%d]\n", ab);
}
///执行宣告录入请求
void ReqExecOrderInsert(int a)
{
CThostFtdcInputExecOrderField OrderInsert = { 0 };
strcpy_s(OrderInsert.BrokerID, g_chBrokerID);
strcpy_s(OrderInsert.InvestorID, g_chInvestorID);
strcpy_s(OrderInsert.InstrumentID, g_chInstrumentID);
strcpy_s(OrderInsert.ExchangeID, g_chExchangeID);
//strcpy_s(OrderInsert.ExecOrderRef, "00001");
strcpy_s(OrderInsert.UserID, g_chUserID);
OrderInsert.Volume = 1;
OrderInsert.RequestID = 1;
OrderInsert.OffsetFlag = THOST_FTDC_OF_Close;//开平标志
OrderInsert.HedgeFlag = THOST_FTDC_HF_Speculation;//投机套保标志
if (a == 0) {
OrderInsert.ActionType = THOST_FTDC_ACTP_Exec;//执行类型类型
}
if (a == 1) {
OrderInsert.ActionType = THOST_FTDC_ACTP_Abandon;//执行类型类型
}
OrderInsert.PosiDirection = THOST_FTDC_PD_Long;//持仓多空方向类型
OrderInsert.ReservePositionFlag = THOST_FTDC_EOPF_Reserve;//期权行权后是否保留期货头寸的标记类型
//OrderInsert.ReservePositionFlag = THOST_FTDC_EOPF_UnReserve;//不保留头寸
OrderInsert.CloseFlag = THOST_FTDC_EOCF_NotToClose;//期权行权后生成的头寸是否自动平仓类型
//OrderInsert.CloseFlag = THOST_FTDC_EOCF_AutoClose;//自动平仓
//strcpy_s(OrderInsert.InvestUnitID, "");AccountID
//strcpy_s(OrderInsert.AccountID, "");
//strcpy_s(OrderInsert.CurrencyID, "CNY");
//strcpy_s(OrderInsert.ClientID, "");
int b = m_pUserApi->ReqExecOrderInsert(&OrderInsert, 1);
LOG((b == 0) ? "执行宣告录入请求......发送成功\n" : "执行宣告录入请求......发送失败,错误序号=[%d]\n", b);
}
///执行宣告操作请求
void ReqExecOrderAction()
{
CThostFtdcInputExecOrderActionField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
a.ExecOrderActionRef = 1;
strcpy_s(a.ExecOrderRef, g_NewExecOrderRef);
a.FrontID = g_NewFrontID;
a.SessionID = g_NewSessionID;
strcpy_s(a.ExchangeID, g_chExchangeID);
strcpy_s(a.ExecOrderSysID, g_NewExecOrderSysID);
a.ActionFlag = THOST_FTDC_AF_Delete;//删除
strcpy_s(a.UserID, g_chUserID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
//strcpy_s(a.InvestUnitID, "");
//strcpy_s(a.IPAddress, "");
//strcpy_s(a.MacAddress, "");
int b = m_pUserApi->ReqExecOrderAction(&a, 1);
LOG((b == 0) ? "执行宣告操作请求......发送成功\n" : "执行宣告操作请求......发送失败,错误序号=[%d]\n", b);
}
//批量报单操作请求
void ReqBatchOrderAction()
{
CThostFtdcInputBatchOrderActionField a = { 0 };
}
///请求查询报单
void ReqQryOrder()
{
action_number = 0;
vector_OrderSysID.clear();
vector_ExchangeID.clear();
vector_InstrumentID.clear();
CThostFtdcQryOrderField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
//strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.ExchangeID, g_chExchangeID);
int ab = m_pUserApi->ReqQryOrder(&a, nRequestID++);
LOG((ab == 0) ? "请求查询报单......发送成功\n" : "请求查询报单......发送失败,序号=[%d]\n", ab);
}
///报单录入请求
void ReqOrderInsert_Condition(int select_num)
{
string limit_price;
LOG("请输入指定价格(limitprice):\n");
cin >> limit_price;
string stop_price;
LOG("请输入触发价格(stopprice):\n");
cin >> stop_price;
CThostFtdcInputOrderField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.UserID, g_chUserID);
a.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
a.Direction = THOST_FTDC_D_Buy;//买
//a.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
a.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;
strcpy_s(a.CombOffsetFlag, "0");
strcpy_s(a.CombHedgeFlag, "1");
a.LimitPrice = atoi(limit_price.c_str());
a.VolumeTotalOriginal = 1;
a.TimeCondition = THOST_FTDC_TC_GFD;
a.VolumeCondition = THOST_FTDC_VC_AV;
a.MinVolume = 0;
if (select_num == 1)
{
a.ContingentCondition = THOST_FTDC_CC_LastPriceGreaterThanStopPrice;
}
else if (select_num == 2)
{
a.ContingentCondition = THOST_FTDC_CC_LastPriceGreaterEqualStopPrice;
}
else if (select_num == 3)
{
a.ContingentCondition = THOST_FTDC_CC_LastPriceLesserThanStopPrice;
}
else if (select_num == 4)
{
a.ContingentCondition = THOST_FTDC_CC_LastPriceLesserEqualStopPrice;
}
else if (select_num == 5)
{
a.ContingentCondition = THOST_FTDC_CC_AskPriceGreaterThanStopPrice;
}
else if (select_num == 6)
{
a.ContingentCondition = THOST_FTDC_CC_AskPriceGreaterEqualStopPrice;
}
else if (select_num == 7)
{
a.ContingentCondition = THOST_FTDC_CC_AskPriceLesserThanStopPrice;
}
else if (select_num == 8)
{
a.ContingentCondition = THOST_FTDC_CC_AskPriceLesserEqualStopPrice;
}
else if (select_num == 9)
{
a.ContingentCondition = THOST_FTDC_CC_BidPriceGreaterThanStopPrice;
}
else if (select_num == 10)
{
a.ContingentCondition = THOST_FTDC_CC_BidPriceGreaterEqualStopPrice;
}
else if (select_num == 11)
{
a.ContingentCondition = THOST_FTDC_CC_BidPriceLesserThanStopPrice;
}
else if (select_num == 12)
{
a.ContingentCondition = THOST_FTDC_CC_BidPriceLesserEqualStopPrice;
}
a.StopPrice = atoi(stop_price.c_str());
//itoa(a.StopPrice, const_cast<char *>(getConfig("config", "StopPrice").c_str()), 10);
a.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;
a.IsAutoSuspend = 0;
strcpy_s(a.ExchangeID, g_chExchangeID);
int ab = m_pUserApi->ReqOrderInsert(&a, nRequestID++);
LOG((ab == 0) ? "请求报入条件单......发送成功\n" : "请求报入条件单......发送失败,序号=[%d]\n", ab);
}
///报单操作请求
void ReqOrderAction_Condition()
{
CThostFtdcInputOrderActionField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.UserID, g_chUserID);
if (chioce_action == 0)
{
a.FrontID = g_chFrontID;
a.SessionID = g_chSessionID;
strcpy_s(a.OrderRef, g_chOrderRef);
}
if (chioce_action == 1)
{
strcpy_s(a.OrderSysID, g_chOrderSysID);
}
strcpy_s(a.ExchangeID, g_chExchangeID);
a.ActionFlag = THOST_FTDC_AF_Delete;
int ab = m_pUserApi->ReqOrderAction(&a, nRequestID++);
LOG((ab == 0) ? "请求撤销条件单......发送成功\n" : "请求撤销条件单......发送失败,序号=[%d]\n", ab);
}
//撤销查询的报单
void ReqOrderAction_forqry(int action_num)
{
CThostFtdcInputOrderActionField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.UserID, g_chUserID);
strcpy_s(a.OrderSysID, vector_OrderSysID.at(action_num - 1).c_str());
strcpy_s(a.ExchangeID, vector_ExchangeID.at(action_num - 1).c_str());
strcpy_s(a.InstrumentID, vector_InstrumentID.at(action_num - 1).c_str());
a.ActionFlag = THOST_FTDC_AF_Delete;
int ab = m_pUserApi->ReqOrderAction(&a, nRequestID++);
LOG((ab == 0) ? "请求撤销条件单......发送成功\n" : "请求撤销条件单......发送失败,错误序号=[%d]\n", ab);
}
///请求查询成交
void ReqQryTrade()
{
CThostFtdcQryTradeField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
string instr;
instr.clear();
LOG("请输入合约代码(不输入则为空)\n");
cin.ignore();
getline(cin, instr);
strcpy_s(a.InstrumentID, instr.c_str());
string Exch;
Exch.clear();
LOG("请输入交易所代码(不输入则为空)\n");
//cin.ignore();
getline(cin, Exch);
strcpy_s(a.ExchangeID, Exch.c_str());
/*strcpy_s(a.TradeID, "");
strcpy_s(a.TradeTimeStart, "");
strcpy_s(a.TradeTimeEnd, "");*/
int b = m_pUserApi->ReqQryTrade(&a, nRequestID++);
LOG((b == 0) ? "请求查询成交......发送成功\n" : "请求查询成交......发送失败,错误序号=[%d]\n", b);
}
///请求查询预埋单
void ReqQryParkedOrder()
{
CThostFtdcQryParkedOrderField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
//strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.ExchangeID, g_chExchangeID);
int ab = m_pUserApi->ReqQryParkedOrder(&a, nRequestID++);
LOG((ab == 0) ? "请求查询预埋单......发送成功\n" : "请求查询预埋单......发送失败,序号=[%d]\n", ab);
}
//请求查询服务器预埋撤单
void ReqQryParkedOrderAction()
{
CThostFtdcQryParkedOrderActionField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.ExchangeID, g_chExchangeID);
int ab = m_pUserApi->ReqQryParkedOrderAction(&a, nRequestID++);
LOG((ab == 0) ? "请求查询服务器预埋撤单......发送成功\n" : "请求查询服务器预埋撤单......发送失败,序号=[%d]\n", ab);
}
//请求查询资金账户
void ReqQryTradingAccount()
{
CThostFtdcQryTradingAccountField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.CurrencyID, "CNY");
int ab = m_pUserApi->ReqQryTradingAccount(&a, nRequestID++);
LOG((ab == 0) ? "请求查询资金账户......发送成功\n" : "请求查询资金账户......发送失败,序号=[%d]\n", ab);
}
//请求查询投资者持仓
void ReqQryInvestorPosition()
{
CThostFtdcQryInvestorPositionField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
string instr;
instr.clear();
cin.ignore();
LOG("请输入合约代码(不输入则为空):\n");
getline(cin, instr);
strcpy_s(a.InstrumentID, instr.c_str());
string exch;
exch.clear();
cin.ignore();
LOG("请输入交易所代码(不输入则为空):\n");
getline(cin, exch);
strcpy_s(a.ExchangeID, exch.c_str());
//strcpy_s(a.InstrumentID, "SPD");
int b = m_pUserApi->ReqQryInvestorPosition(&a, nRequestID++);
LOG((b == 0) ? "请求查询投资者持仓......发送成功\n" : "请求查询投资者持仓......发送失败,错误序号=[%d]\n", b);
}
//请求查询投资者持仓明细
void ReqQryInvestorPositionDetail()
{
CThostFtdcQryInvestorPositionDetailField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
string instr;
instr.clear();
cin.ignore();
LOG("请输入合约代码(不输入则为空)\n");
getline(cin, instr);
strcpy_s(a.InstrumentID, instr.c_str());
string exch;
exch.clear();
cin.ignore();
LOG("请输入交易所代码(不输入则为空):\n");
getline(cin, exch);
strcpy_s(a.ExchangeID, exch.c_str());
//strcpy_s(a.InstrumentID, g_chInstrumentID);
int b = m_pUserApi->ReqQryInvestorPositionDetail(&a, nRequestID++);
LOG((b == 0) ? "请求查询投资者持仓明细......发送成功\n" : "请求查询投资者持仓明细......发送失败,错误序号=[%d]\n", b);
}
//请求查询交易所保证金率
void ReqQryExchangeMarginRate()
{
CThostFtdcQryExchangeMarginRateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
a.HedgeFlag = THOST_FTDC_HF_Speculation;//投机
int b = m_pUserApi->ReqQryExchangeMarginRate(&a, nRequestID++);
LOG((b == 0) ? "请求查询交易所保证金率......发送成功\n" : "请求查询交易所保证金率......发送失败,错误序号=[%d]\n", b);
}
//请求查询合约保证金率
void ReqQryInstrumentMarginRate()
{
CThostFtdcQryInstrumentMarginRateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
a.HedgeFlag = THOST_FTDC_HF_Speculation;//投机
int b = m_pUserApi->ReqQryInstrumentMarginRate(&a, nRequestID++);
LOG((b == 0) ? "请求查询合约保证金率......发送成功\n" : "请求查询合约保证金率......发送失败,错误序号=[%d]\n", b);
}
//请求查询合约手续费率
void ReqQryInstrumentCommissionRate()
{
CThostFtdcQryInstrumentCommissionRateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
int b = m_pUserApi->ReqQryInstrumentCommissionRate(&a, nRequestID++);
LOG((b == 0) ? "请求查询合约手续费率......发送成功\n" : "请求查询合约手续费率......发送失败,错误序号=[%d]\n", b);
}
//请求查询做市商合约手续费率
void ReqQryMMInstrumentCommissionRate()
{
CThostFtdcQryMMInstrumentCommissionRateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
int b = m_pUserApi->ReqQryMMInstrumentCommissionRate(&a, nRequestID++);
LOG((b == 0) ? "请求查询做市商合约手续费率......发送成功\n" : "请求查询做市商合约手续费率......发送失败,错误序号=[%d]\n", b);
}
//请求查询做市商期权合约手续费
void ReqQryMMOptionInstrCommRate()
{
CThostFtdcQryMMOptionInstrCommRateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
int b = m_pUserApi->ReqQryMMOptionInstrCommRate(&a, nRequestID++);
LOG((b == 0) ? "请求查询做市商期权合约手续费......发送成功\n" : "请求查询做市商期权合约手续费......发送失败,错误序号=[%d]\n", b);
}
//请求查询报单手续费
void ReqQryInstrumentOrderCommRate()
{
CThostFtdcQryInstrumentOrderCommRateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
int b = m_pUserApi->ReqQryInstrumentOrderCommRate(&a, nRequestID++);
LOG((b == 0) ? "请求查询报单手续费......发送成功\n" : "请求查询报单手续费......发送失败,错误序号=[%d]\n", b);
}
//请求查询期权合约手续费
void ReqQryOptionInstrCommRate()
{
CThostFtdcQryOptionInstrCommRateField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
string Inst;
string Exch;
string InvestUnit;
LOG("请输入合约代码:(不填则为空)");
cin >> Inst;
LOG("请输入交易所代码:(不填则为空)");
cin >> Exch;
LOG("请输入投资者单元代码:(不填则为空)");
cin >> InvestUnit;
strcpy_s(a.InstrumentID, Inst.c_str());
strcpy_s(a.ExchangeID, Exch.c_str());
strcpy_s(a.InvestUnitID, InvestUnit.c_str());
int b = m_pUserApi->ReqQryOptionInstrCommRate(&a, nRequestID++);
LOG((b == 0) ? "请求查询期权合约手续费......发送成功\n" : "请求查询期权合约手续费......发送失败,错误序号=[%d]\n", b);
}
//请求查询合约
void ReqQryInstrument()
{
CThostFtdcQryInstrumentField a = { 0 };
strcpy_s(a.ExchangeID, g_chExchangeID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
//strcpy_s(a.ExchangeInstID,"");
//strcpy_s(a.ProductID, "m");
int b = m_pUserApi->ReqQryInstrument(&a, nRequestID++);
LOG((b == 0) ? "请求查询合约......发送成功\n" : "请求查询合约......发送失败,错误序号=[%d]\n", b);
}
///请求查询合约响应
virtual void OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
LOG("<OnRspQryInstrument>\n");
if (pInstrument)
{
md_InstrumentID.push_back(pInstrument->InstrumentID);
LOG("\tInstrumentID [%s]\n", pInstrument->InstrumentID);
LOG("\tExchangeID [%s]\n", pInstrument->ExchangeID);
LOG("\tInstrumentName [%s]\n", pInstrument->InstrumentName);
LOG("\tExchangeInstID [%s]\n", pInstrument->ExchangeInstID);
LOG("\tProductID [%s]\n", pInstrument->ProductID);
LOG("\tCreateDate [%s]\n", pInstrument->CreateDate);
/*LOG("\tOpenDate [%s]\n", pInstrument->OpenDate);
LOG("\tExpireDate [%s]\n", pInstrument->ExpireDate);
LOG("\tStartDelivDate [%s]\n", pInstrument->StartDelivDate);
LOG("\tEndDelivDate [%s]\n", pInstrument->EndDelivDate);
LOG("\tUnderlyingInstrID [%s]\n", pInstrument->UnderlyingInstrID);
LOG("\tDeliveryYear [%d]\n", pInstrument->DeliveryYear);
LOG("\tDeliveryMonth [%d]\n", pInstrument->DeliveryMonth);
LOG("\tMaxMarketOrderVolume [%d]\n", pInstrument->MaxMarketOrderVolume);
LOG("\tMinMarketOrderVolume [%d]\n", pInstrument->MinMarketOrderVolume);
LOG("\tMaxLimitOrderVolume [%d]\n", pInstrument->MaxLimitOrderVolume);
LOG("\tMinLimitOrderVolume [%d]\n", pInstrument->MinLimitOrderVolume);
LOG("\tVolumeMultiple [%d]\n", pInstrument->VolumeMultiple);
LOG("\tIsTrading [%d]\n", pInstrument->IsTrading);
LOG("\tProductClass [%c]\n", pInstrument->ProductClass);
LOG("\tInstLifePhase [%c]\n", pInstrument->InstLifePhase);
LOG("\tPositionType [%c]\n", pInstrument->PositionType);
LOG("\tPositionDateType [%c]\n", pInstrument->PositionDateType);
LOG("\tMaxMarginSideAlgorithm [%c]\n", pInstrument->MaxMarginSideAlgorithm);
LOG("\tOptionsType [%c]\n", pInstrument->OptionsType);
LOG("\tCombinationType [%c]\n", pInstrument->CombinationType);
LOG("\tPriceTick [%.8lf]\n", pInstrument->PriceTick);
LOG("\tLongMarginRatio [%.8lf]\n", pInstrument->LongMarginRatio);
LOG("\tShortMarginRatio [%.8lf]\n", pInstrument->ShortMarginRatio);
LOG("\tStrikePrice [%.8lf]\n", pInstrument->StrikePrice);
LOG("\tUnderlyingMultiple [%.8lf]\n", pInstrument->UnderlyingMultiple);*/
}
if (pRspInfo)
{
LOG("\tErrorMsg [%s]\n", pRspInfo->ErrorMsg);
LOG("\tErrorID [%d]\n", pRspInfo->ErrorID);
}
LOG("\tnRequestID [%d]\n", nRequestID);
LOG("\tbIsLast [%d]\n", bIsLast);
LOG("</OnRspQryInstrument>\n");
if (bIsLast)
{
SetEvent(xinhao);
}
}
//请求查询投资者结算结果
void ReqQrySettlementInfo()
{
CThostFtdcQrySettlementInfoField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
string Traday;
LOG("请输入交易日期或者交易月份(例如:20180101,月份则201801):");
cin >> Traday;
strcpy_s(a.TradingDay, Traday.c_str());
int b = m_pUserApi->ReqQrySettlementInfo(&a, nRequestID++);
LOG((b == 0) ? "请求查询投资者结算结果......发送成功\n" : "请求查询投资者结算结果......发送失败,错误序号=[%d]\n", b);
}
//请求查询转帐流水
void ReqQryTransferSerial()
{
CThostFtdcQryTransferSerialField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.AccountID, g_chInvestorID);
cir1:int bankid;
LOG("请输入你需要的查询的银行\n");
LOG("1.工商银行\n");
LOG("2.农业银行\n");
LOG("3.中国银行\n");
LOG("5.交通银行\n");
LOG("6.招商银行\n");
LOG("7.兴业银行\n");
LOG("8.浦发银行\n");
LOG("9.民生银行\n");
LOG("10.光大银行\n");
LOG("11.中信银行\n");
LOG("12.汇丰银行\n");
LOG("13.平安银行\n");
LOG("14.农发银行\n");
LOG("15.星展银行\n");
LOG("16.广发银行\n");
cin >> bankid;
if (bankid == 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16)
{
//strcpy_s(a.BankID, itoa(bankid, a.BankID, 10));///银行代码
itoa(bankid, a.BankID, 10);
}
else
{
LOG("请重新输入银行代码。\n");
goto cir1;
}
int choos;
curr:LOG("请输入币种代码\t1.CNY\t2.USD\n");
cin >> choos;
switch (choos)
{
case 1:
strcpy_s(a.CurrencyID, "CNY");
break;
case 2:
strcpy_s(a.CurrencyID, "USD");
break;
default:
LOG("请输入正确的序号\n");
_getch();
goto curr;
}
int b = m_pUserApi->ReqQryTransferSerial(&a, nRequestID++);
LOG((b == 0) ? "请求查询转帐流水......发送成功\n" : "请求查询转帐流水......发送失败,错误序号=[%d]\n", b);
}
//请求查询产品
void ReqQryProduct()
{
CThostFtdcQryProductField a = { 0 };
strcpy_s(a.ProductID, "sc");
a.ProductClass = THOST_FTDC_PC_Futures;
strcpy_s(a.ExchangeID, g_chExchangeID);
m_pUserApi->ReqQryProduct(&a, nRequestID++);
}
//请求查询转帐银行
void ReqQryTransferBank()
{
CThostFtdcQryTransferBankField a = { 0 };
strcpy_s(a.BankID,"3");
int b = m_pUserApi->ReqQryTransferBank(&a, nRequestID++);
LOG((b == 0) ? "请求查询转帐银行......发送成功\n" : "请求查询转帐银行......发送失败,错误序号=[%d]\n", b);
}
//请求查询交易通知
void ReqQryTradingNotice()
{
CThostFtdcQryTradingNoticeField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
int b = m_pUserApi->ReqQryTradingNotice(&a, nRequestID++);
LOG((b == 0) ? "请求查询交易通知......发送成功\n" : "请求查询交易通知......发送失败,错误序号=[%d]\n", b);
}
//请求查询交易编码
void ReqQryTradingCode()
{
CThostFtdcQryTradingCodeField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.ExchangeID, g_chExchangeID);
a.ClientIDType = THOST_FTDC_CIDT_Speculation;
int b = m_pUserApi->ReqQryTradingCode(&a, nRequestID++);
LOG((b == 0) ? "请求查询交易编码......发送成功\n" : "请求查询交易编码......发送失败,错误序号=[%d]\n", b);
}
//请求查询结算信息确认
void ReqQrySettlementInfoConfirm()
{
CThostFtdcQrySettlementInfoConfirmField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
//strcpy_s(a.AccountID, g_chInvestorID);
strcpy_s(a.CurrencyID, "CNY");
int b = m_pUserApi->ReqQrySettlementInfoConfirm(&a, nRequestID++);
LOG((b == 0) ? "请求查询结算信息确认......发送成功\n" : "请求查询结算信息确认......发送失败,错误序号=[%d]\n", b);
}
//请求查询产品组
void ReqQryProductGroup()
{
CThostFtdcQryProductGroupField a = { 0 };
}
//请求查询投资者单元
void ReqQryInvestUnit()
{
CThostFtdcQryInvestUnitField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
//strcpy_s(a.InvestorID, "00402");
//strcpy_s(a.InvestorID, g_chInvestorID);
int b = m_pUserApi->ReqQryInvestUnit(&a, nRequestID++);
LOG((b == 0) ? "请求查询投资者单元......发送成功\n" : "请求查询投资者单元......发送失败,错误序号=[%d]\n", b);
}
//请求查询经纪公司交易参数
void ReqQryBrokerTradingParams()
{
CThostFtdcQryBrokerTradingParamsField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.CurrencyID, "CNY");
int b = m_pUserApi->ReqQryBrokerTradingParams(&a, nRequestID++);
LOG((b == 0) ? "请求查询经纪公司交易参数......发送成功\n" : "请求查询经纪公司交易参数......发送失败,错误序号=[%d]\n", b);
}
//请求查询询价
void ReqQryForQuote()
{
CThostFtdcQryForQuoteField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.ExchangeID, g_chExchangeID);
strcpy_s(a.InsertTimeStart, "");
strcpy_s(a.InsertTimeEnd, "");
strcpy_s(a.InvestUnitID, "");
int b = m_pUserApi->ReqQryForQuote(&a, nRequestID++);
LOG((b == 0) ? "请求查询询价......发送成功\n" : "请求查询询价......发送失败,错误序号=[%d]\n", b);
}
//请求查询报价
void ReqQryQuote()
{
CThostFtdcQryQuoteField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.ExchangeID, g_chExchangeID);
strcpy_s(a.QuoteSysID, "");
strcpy_s(a.InsertTimeStart, "");
strcpy_s(a.InsertTimeEnd, "");
strcpy_s(a.InvestUnitID, "");
int b = m_pUserApi->ReqQryQuote(&a, nRequestID++);
LOG((b == 0) ? "请求查询询价......发送成功\n" : "请求查询询价......发送失败,错误序号=[%d]\n", b);
}
///询价录入请求
void ReqForQuoteInsert()
{
CThostFtdcInputForQuoteField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
//strcpy_s(a.ForQuoteRef, "");
strcpy_s(a.UserID, g_chUserID);
strcpy_s(a.ExchangeID, g_chExchangeID);
//strcpy_s(a.InvestUnitID, "");
//strcpy_s(a.IPAddress, "");
//strcpy_s(a.MacAddress, "");
int b = m_pUserApi->ReqForQuoteInsert(&a, nRequestID++);
LOG((b == 0) ? "询价录入请求......发送成功\n" : "询价录入请求......发送失败,错误序号=[%d]\n", b);
}
///做市商报价录入请求
void ReqQuoteInsert()
{
choose:int choose_Flag;
LOG("请确认开平标志\t1.开仓\t2.平仓\n");
cin >> choose_Flag;
if (choose_Flag != 1 && choose_Flag!=2)
{
LOG("请重新选择开平标志\n");
_getch();
choose_Flag = NULL;
goto choose;
}
int price_bid;
LOG("请输入买方向价格:\n");
cin >> price_bid;
int price_ask;
LOG("请输入卖方向价格:\n");
cin >> price_ask;
LOG("买卖数量默认是1。\n");
string quoteref;
LOG("请输入quoteref序号:\n");
cin >> quoteref;
string AskOrderRef;
string BidOrderRef;
LOG("请输入AskOrderRef序号:\n");
cin >> AskOrderRef;
LOG("请输入BidOrderRef序号:\n");
cin >> BidOrderRef;
_getch();
CThostFtdcInputQuoteField t = { 0 };
strcpy_s(t.BrokerID, g_chBrokerID);
strcpy_s(t.InvestorID, g_chInvestorID);
strcpy_s(t.InstrumentID, g_chInstrumentID);
strcpy_s(t.ExchangeID, g_chExchangeID);
strcpy_s(t.QuoteRef, quoteref.c_str());
strcpy_s(t.UserID, g_chUserID);
t.AskPrice = price_ask;
t.BidPrice = price_bid;
t.AskVolume = 1;
t.BidVolume = 1;
if (choose_Flag ==1)
{
t.AskOffsetFlag = THOST_FTDC_OF_Open;///卖开平标志
t.BidOffsetFlag = THOST_FTDC_OF_Open;///买开平标志
}
else if (choose_Flag ==2)
{
t.AskOffsetFlag = THOST_FTDC_OF_Close;///卖开平标志
t.BidOffsetFlag = THOST_FTDC_OF_Close;///买开平标志
}
t.AskHedgeFlag = THOST_FTDC_HF_Speculation;///卖投机套保标志
t.BidHedgeFlag = THOST_FTDC_HF_Speculation;///买投机套保标志
strcpy_s(t.AskOrderRef, AskOrderRef.c_str());///衍生卖报单引用
strcpy_s(t.BidOrderRef, BidOrderRef.c_str());///衍生买报单引用
//strcpy_s(t.ForQuoteSysID, "");///应价编号
//strcpy_s(t.InvestUnitID, "1");///投资单元代码
int a = m_pUserApi->ReqQuoteInsert(&t, 1);
LOG((a == 0) ? "做市商报价录入请求......发送成功\n" : "做市商报价录入请求......发送失败,错误序号=[%d]\n", a);
}
///报价通知
virtual void OnRtnQuote(CThostFtdcQuoteField *pQuote)
{
if (pQuote && strcmp(pQuote->InvestorID, g_chInvestorID) != 0)
{
return;
}
else
{
CTraderSpi::OnRtnQuote(pQuote);
//SetEvent(g_hEvent);
}
}
//报价撤销
void ReqQuoteAction()
{
CThostFtdcInputQuoteActionField t = { 0 };
strcpy_s(t.BrokerID, g_chBrokerID);
strcpy_s(t.InvestorID, "00404");
//strcpy_s(t.UserID, g_chUserID);
strcpy_s(t.ExchangeID, "SHFE");
strcpy_s(t.QuoteRef, " 8");
t.FrontID = 7;
t.SessionID = 1879781311;
t.ActionFlag = THOST_FTDC_AF_Delete;
strcpy_s(t.InstrumentID, "cu1905C55000");
int a = m_pUserApi->ReqQuoteAction(&t, 1);
printf("m_pUserApi->ReqQuoteAction = [%d]", a);
}
//查询最大报单数量请求
void ReqQueryMaxOrderVolume()
{
CThostFtdcQueryMaxOrderVolumeField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
a.Direction = THOST_FTDC_D_Buy;
a.OffsetFlag = THOST_FTDC_OF_Open;
a.HedgeFlag = THOST_FTDC_HF_Speculation;
a.MaxVolume = 1;
strcpy_s(a.BrokerID, g_chBrokerID);
int b = m_pUserApi->ReqQueryMaxOrderVolume(&a, nRequestID++);
LOG((b == 0) ? "查询最大报单数量请求......发送成功\n" : "查询最大报单数量请求......发送失败,错误序号=[%d]\n", b);
}
//请求查询监控中心用户令牌
void ReqQueryCFMMCTradingAccountToken()
{
CThostFtdcQueryCFMMCTradingAccountTokenField a = { 0 };
}
///报单操作错误回报
virtual void OnErrRtnOrderAction(CThostFtdcOrderActionField *pOrderAction, CThostFtdcRspInfoField *pRspInfo)
{
if (pOrderAction && strcmp(pOrderAction->InvestorID, g_chInvestorID) != 0)
{
return;
}
else
{
CTraderSpi::OnErrRtnOrderAction(pOrderAction,pRspInfo);
SetEvent(g_hEvent);
}
}
///报单录入请求响应
virtual void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo,
int nRequestID, bool bIsLast)
{
if (pInputOrder && strcmp(pInputOrder->InvestorID, g_chInvestorID) != 0)
{
return;
}
else
{
CTraderSpi::OnRspOrderInsert(pInputOrder,pRspInfo,nRequestID,bIsLast);
}
}
///报单录入错误回报
virtual void OnErrRtnOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo)
{
if (pInputOrder && strcmp(pInputOrder->InvestorID, g_chInvestorID) != 0)
{
return;
}
else
{
CTraderSpi::OnErrRtnOrderInsert(pInputOrder, pRspInfo);
SetEvent(g_hEvent);
}
}
///报单通知
virtual void OnRtnOrder(CThostFtdcOrderField *pOrder)
{
if (pOrder && strcmp(pOrder->InvestorID, g_chInvestorID) != 0)
{
return;
}
else
{
CTraderSpi::OnRtnOrder(pOrder);
strcpy_s(g_chOrderSysID, pOrder->OrderSysID);
g_chFrontID = pOrder->FrontID;
g_chSessionID = pOrder->SessionID;
strcpy_s(g_chOrderRef, pOrder->OrderRef);
strcpy_s(g_chExchangeID, pOrder->ExchangeID);
if (pOrder->OrderStatus == THOST_FTDC_OST_AllTraded)///全部成交
{
LOG("报单全部成交\n\n");
//SetEvent(g_hEvent);
}if (pOrder->OrderStatus == THOST_FTDC_OST_PartTradedQueueing)///部分成交还在队列中
{
LOG("部分成交还在队列中\n\n");
}if (pOrder->OrderStatus == THOST_FTDC_OST_PartTradedNotQueueing)///部分成交不在队列中
{
LOG("部分成交不在队列中\n\n");
}if (pOrder->OrderStatus == THOST_FTDC_OST_NoTradeQueueing)///未成交还在队列中
{
chioce_action = 0;
LOG("未成交还在队列中\n\n");
}if (pOrder->OrderStatus == THOST_FTDC_OST_NoTradeNotQueueing)///未成交不在队列中
{
LOG("未成交不在队列中\n\n");
}if (pOrder->OrderStatus == THOST_FTDC_OST_Canceled)///撤单
{
LOG("撤单\n\n");
//SetEvent(g_hEvent);
}if (pOrder->OrderStatus == THOST_FTDC_OST_Unknown)///未知
{
LOG("未知\n\n");
}if (pOrder->OrderStatus == THOST_FTDC_OST_NotTouched)///尚未触发
{
chioce_action = 1;
LOG("尚未触发\n\n");
}if (pOrder->OrderStatus == THOST_FTDC_OST_Touched)///已触发
{
LOG("已触发\n\n");
}
}
}
///删除预埋单响应
virtual void OnRspRemoveParkedOrder(CThostFtdcRemoveParkedOrderField *pRemoveParkedOrder, CThostFtdcRspInfoField *pRspInfo,
int nRequestID, bool bIsLast)
{
if (pRemoveParkedOrder && strcmp(pRemoveParkedOrder->InvestorID, g_chInvestorID) != 0)
{
return;
}
else
{
strcpy_s(g_chParkedOrderID1, pRemoveParkedOrder->ParkedOrderID);
CTraderSpi::OnRspRemoveParkedOrder(pRemoveParkedOrder, pRspInfo, nRequestID, bIsLast);
SetEvent(g_hEvent);
}
}
///删除预埋撤单响应
virtual void OnRspRemoveParkedOrderAction(CThostFtdcRemoveParkedOrderActionField *pRemoveParkedOrderAction, CThostFtdcRspInfoField *pRspInfo,
int nRequestID, bool bIsLast)
{
if (pRemoveParkedOrderAction && strcmp(pRemoveParkedOrderAction->InvestorID, g_chInvestorID) != 0)
{
return;
}
else
{
strcpy_s(g_chParkedOrderActionID1, pRemoveParkedOrderAction->ParkedOrderActionID);
CTraderSpi::OnRspRemoveParkedOrderAction(pRemoveParkedOrderAction, pRspInfo, nRequestID, bIsLast);
SetEvent(g_hEvent);
}
}
///预埋单录入请求响应
virtual void OnRspParkedOrderInsert(CThostFtdcParkedOrderField *pParkedOrder, CThostFtdcRspInfoField *pRspInfo,
int nRequestID, bool bIsLast)
{
if (pParkedOrder && strcmp(pParkedOrder->InvestorID, g_chInvestorID) != 0)
{
return;
}
else
{
strcpy_s(g_chParkedOrderID1, pParkedOrder->ParkedOrderID);
CTraderSpi::OnRspParkedOrderInsert(pParkedOrder, pRspInfo, nRequestID, bIsLast);
SetEvent(g_hEvent);
}
}
///预埋撤单录入请求响应
virtual void OnRspParkedOrderAction(CThostFtdcParkedOrderActionField *pParkedOrderAction, CThostFtdcRspInfoField *pRspInfo,
int nRequestID, bool bIsLast)
{
if (pParkedOrderAction && strcmp(pParkedOrderAction->InvestorID, g_chInvestorID) != 0)
{
return;
}
else
{
strcpy_s(g_chParkedOrderActionID1, pParkedOrderAction->ParkedOrderActionID);
CTraderSpi::OnRspParkedOrderAction(pParkedOrderAction,pRspInfo,nRequestID,bIsLast);
SetEvent(g_hEvent);
}
}
///请求查询预埋撤单响应
virtual void OnRspQryParkedOrderAction(CThostFtdcParkedOrderActionField *pParkedOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
CTraderSpi::OnRspQryParkedOrderAction(pParkedOrderAction, pRspInfo, nRequestID, bIsLast);
}
///请求查询预埋单响应
virtual void OnRspQryParkedOrder(CThostFtdcParkedOrderField *pParkedOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
CTraderSpi::OnRspQryParkedOrder(pParkedOrder,pRspInfo,nRequestID,bIsLast);
}
///请求查询报单响应
virtual void OnRspQryOrder(CThostFtdcOrderField *pOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
if (pOrder) {
vector_OrderSysID.push_back(pOrder->OrderSysID);
vector_ExchangeID.push_back(pOrder->ExchangeID);
vector_InstrumentID.push_back(pOrder->InstrumentID);
}
CTraderSpi::OnRspQryOrder(pOrder,pRspInfo,nRequestID,bIsLast);
action_number++;
LOG("\n查询序号:\"%d\"\n\n", action_number);
}
///执行宣告通知
virtual void OnRtnExecOrder(CThostFtdcExecOrderField *pExecOrder)
{
if (pExecOrder) {
strcpy_s(g_NewExecOrderRef, pExecOrder->ExecOrderRef);
strcpy_s(g_NewExecOrderSysID, pExecOrder->ExecOrderSysID);
g_NewFrontID = pExecOrder->FrontID;
g_NewSessionID = pExecOrder->SessionID;
}
CTraderSpi::OnRtnExecOrder(pExecOrder);
}
//期货发起查询银行余额请求
void ReqQueryBankAccountMoneyByFuture()
{
CThostFtdcReqQueryAccountField a = { 0 };
int b = m_pUserApi->ReqQueryBankAccountMoneyByFuture(&a, nRequestID++);
LOG((b == 0) ? "期货发起查询银行余额请求......发送成功\n" : "期货发起查询银行余额请求......发送失败,错误序号=[%d]\n", b);
}
//期货发起银行资金转期货请求
void ReqFromBankToFutureByFuture()
{
int output_num;
LOG("请输入转账金额:");
cin >> output_num;
CThostFtdcReqTransferField a = { 0 };
strcpy_s(a.TradeCode, "202001");///业务功能码
int bankid = 0;
while (bankid != 1 & 2 & 3 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16) {
LOG("请输入你需要的转账的银行\n");
LOG("1.工商银行\n");
LOG("2.农业银行\n");
LOG("3.中国银行\n");
LOG("5.交通银行\n");
LOG("6.招商银行\n");
LOG("7.兴业银行\n");
LOG("8.浦发银行\n");
LOG("9.民生银行\n");
LOG("10.光大银行\n");
LOG("11.中信银行\n");
LOG("12.汇丰银行\n");
LOG("13.平安银行\n");
LOG("14.农发银行\n");
LOG("15.星展银行\n");
LOG("16.广发银行\n");
cin >> bankid;
if (bankid == 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16)
{
//strcpy_s(a.BankID, itoa(bankid, a.BankID, 10));///银行代码
itoa(bankid, a.BankID, 10);
}
else
{
LOG("请重新输入银行代码。\n");
_getch();
}
}
strcpy_s(a.BankBranchID, "0000");///期商代码
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.TradeDate, "20170829");///交易日期
strcpy_s(a.TradeTime, "09:00:00");
strcpy_s(a.BankSerial, "6889");///银行流水号
strcpy_s(a.TradingDay, "20170829");///交易系统日期
a.PlateSerial = 5;///银期平台消息流水号
a.LastFragment = THOST_FTDC_LF_Yes;///最后分片标志 '0'=是最后分片
a.SessionID = SessionID;
//strcpy_s(a.CustomerName, "");///客户姓名
a.IdCardType = THOST_FTDC_ICT_IDCard;///证件类型
a.CustType = THOST_FTDC_CUSTT_Person;///客户类型
//strcpy_s(a.IdentifiedCardNo, "310115198706241914");///证件号码
/*strcpy_s(a.BankAccount, "123456789");
strcpy_s(a.BankPassWord, "123456");///银行密码*/
strcpy_s(a.BankAccount, "621485212110187");
//strcpy_s(a.BankPassWord, "092812");///银行密码--不需要银行卡密码
strcpy_s(a.AccountID, g_chInvestorID);///投资者帐号
//strcpy_s(a.Password, "092812");///期货密码--资金密码
strcpy_s(a.Password, "123456");///期货密码--资金密码
a.InstallID = 1;///安装编号
a.FutureSerial = 0;///期货公司流水号
a.VerifyCertNoFlag = THOST_FTDC_YNI_No;///验证客户证件号码标志
strcpy_s(a.CurrencyID, "CNY");///币种代码
a.TradeAmount = output_num;///转帐金额
a.FutureFetchAmount = 0;///期货可取金额
a.CustFee = 0;///应收客户费用
a.BrokerFee = 0;///应收期货公司费用
a.SecuPwdFlag = THOST_FTDC_BPWDF_BlankCheck;///期货资金密码核对标志
a.RequestID = 0;///请求编号
a.TID = 0;///交易ID
int b = m_pUserApi->ReqFromBankToFutureByFuture(&a, 1);
LOG((b == 0) ? "期货发起银行资金转期货请求......发送成功\n" : "期货发起银行资金转期货请求......发送失败,错误序号=[%d]\n", b);
}
//期货发起期货资金转银行请求
void ReqFromFutureToBankByFuture()
{
int output_num;
LOG("请输入转账金额:");
cin >> output_num;
CThostFtdcReqTransferField a = { 0 };
strcpy_s(a.TradeCode, "202002");///业务功能码
bankid_new:int bankid = 0;
LOG("请输入你需要的转账的银行\n");
LOG("1.工商银行\n");
LOG("2.农业银行\n");
LOG("3.中国银行\n");
LOG("5.交通银行\n");
LOG("6.招商银行\n");
LOG("7.兴业银行\n");
LOG("8.浦发银行\n");
LOG("9.民生银行\n");
LOG("10.光大银行\n");
LOG("11.中信银行\n");
LOG("12.汇丰银行\n");
LOG("13.平安银行\n");
LOG("14.农发银行\n");
LOG("15.星展银行\n");
LOG("16.广发银行\n");
cin >> bankid;
if (bankid == 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16)
{
//strcpy_s(a.BankID, itoa(bankid, a.BankID, 10));///银行代码
itoa(bankid, a.BankID, 10);
}
else {
LOG("请输入正确的编号\n");
_getch();
goto bankid_new;
}
strcpy_s(a.BankBranchID, "0000");///期商代码
strcpy_s(a.BrokerID, g_chBrokerID);
//strcpy_s(a.BankBranchID, "0000");///银行分支机构代码
//strcpy_s(a.TradeDate, "20170829");///交易日期
//strcpy_s(a.TradeTime, "09:00:00");
//strcpy_s(a.BankSerial, "");///银行流水号
//strcpy_s(a.TradingDay, "20170829");///交易系统日期
//a.PlateSerial= 0;///银期平台消息流水号
a.LastFragment = THOST_FTDC_LF_Yes;///最后分片标志 '0'=是最后分片
a.SessionID = SessionID;
//strcpy_s(a.CustomerName, "");///客户姓名
a.IdCardType = THOST_FTDC_ICT_IDCard;///证件类型
strcpy_s(a.IdentifiedCardNo, "310115198706241914");///证件号码
strcpy_s(a.BankAccount, "123456789");///银行帐号
//strcpy_s(a.BankPassWord, "123456");///银行密码
strcpy_s(a.AccountID, g_chInvestorID);///投资者帐号
strcpy_s(a.Password, "123456");///期货密码
a.InstallID = 1;///安装编号
a.CustType = THOST_FTDC_CUSTT_Person;
//a.FutureSerial = 0;///期货公司流水号
a.VerifyCertNoFlag = THOST_FTDC_YNI_No;///验证客户证件号码标志
strcpy_s(a.CurrencyID, "CNY");///币种代码
a.TradeAmount = output_num;///转帐金额
a.FutureFetchAmount = 0;///期货可取金额
a.CustFee = 0;///应收客户费用
a.BrokerFee = 0;///应收期货公司费用
//a.SecuPwdFlag = THOST_FTDC_BPWDF_BlankCheck;///期货资金密码核对标志
a.RequestID = 0;///请求编号
a.TID = 0;///交易ID
int b = m_pUserApi->ReqFromFutureToBankByFuture(&a, 1);
LOG((b == 0) ? "期货发起期货资金转银行请求......发送成功\n" : "期货发起期货资金转银行请求......发送失败,错误序号=[%d]\n", b);
}
//期权自对冲录入请求
void ReqOptionSelfCloseInsert()
{
CThostFtdcInputOptionSelfCloseField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.OptionSelfCloseRef, "1");
strcpy_s(a.UserID, g_chUserID);
a.Volume = 1;
int choose_1 = 0;
while (choose_1 != 1 && choose_1 != 2 && choose_1 != 3 && choose_1 != 4) {
LOG("请选择投机套保标志\n1.投机\t2.套利\t3.套保\t4.做市商\n");
cin >> choose_1;
if (choose_1 == 1) { a.HedgeFlag = THOST_FTDC_HF_Speculation; }
else if (choose_1 == 2) { a.HedgeFlag = THOST_FTDC_HF_Arbitrage; }
else if (choose_1 == 3) { a.HedgeFlag = THOST_FTDC_HF_Hedge; }
else if (choose_1 == 4) { a.HedgeFlag = THOST_FTDC_HF_MarketMaker; }
else {
LOG("选项错误,请重新选择。\n");
_getch();
}
}
int choose_2 = 0;
while (choose_2 != 1 && choose_2 != 2 && choose_2 != 3) {
LOG("请选择期权行权的头寸是否自对冲标志\n1.自对冲期权仓位\t2.保留期权仓位\t3.自对冲卖方履约后的期货仓位\n");
cin >> choose_2;
if (choose_2 == 1) { a.OptSelfCloseFlag = THOST_FTDC_OSCF_CloseSelfOptionPosition; }
else if (choose_2 == 2) { a.OptSelfCloseFlag = THOST_FTDC_OSCF_ReserveOptionPosition; }
else if (choose_2 == 3) { a.OptSelfCloseFlag = THOST_FTDC_OSCF_SellCloseSelfFuturePosition; }
else {
LOG("选项错误,请重新选择。\n");
_getch();
continue;
}
}
strcpy_s(a.ExchangeID, g_chExchangeID);
string accountid_new;
LOG("请输入资金账号:\n");
cin >> accountid_new;
strcpy_s(a.AccountID, accountid_new.c_str());
strcpy_s(a.CurrencyID, "CNY");
int b = m_pUserApi->ReqOptionSelfCloseInsert(&a, 1);
LOG((b == 0) ? "期权自对冲录入请求......发送成功\n" : "期权自对冲录入请求......发送失败,错误序号=[%d]\n", b);
}
///期权自对冲通知
virtual void OnRtnOptionSelfClose(CThostFtdcOptionSelfCloseField *pOptionSelfClose)
{
if (pOptionSelfClose) {
g_chFrontID = pOptionSelfClose->FrontID;
g_chSessionID = pOptionSelfClose->SessionID;
strcpy_s(g_chOptionSelfCloseSysID, pOptionSelfClose->OptionSelfCloseSysID);//期权自对冲编号
strcpy_s(g_chOptionSelfCloseRef, pOptionSelfClose->OptionSelfCloseRef);//期权自对冲引用
}
CTraderSpi::OnRtnOptionSelfClose(pOptionSelfClose);
}
//期权自对冲操作请求
void ReqOptionSelfCloseAction()
{
CThostFtdcInputOptionSelfCloseActionField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
//strcpy_s(a.OptionSelfCloseSysID, g_chOptionSelfCloseSysID);//期权自对冲编号
strcpy_s(a.OptionSelfCloseRef, g_chOptionSelfCloseRef);//期权自对冲引用
//a.FrontID = g_chFrontID;
//a.SessionID = g_chSessionID;
strcpy_s(a.ExchangeID, g_chExchangeID);
a.ActionFlag = THOST_FTDC_AF_Delete;
strcpy_s(a.UserID, g_chUserID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
int b = m_pUserApi->ReqOptionSelfCloseAction(&a, 1);
LOG((b == 0) ? "期权自对冲操作请求......发送成功\n" : "期权自对冲操作请求......发送失败,错误序号=[%d]\n", b);
}
//请求查询期权自对冲
void ReqQryOptionSelfClose()
{
CThostFtdcQryOptionSelfCloseField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.ExchangeID, g_chExchangeID);
int b = m_pUserApi->ReqQryOptionSelfClose(&a, 1);
LOG((b == 0) ? "请求查询期权自对冲......发送成功\n" : "请求查询期权自对冲......发送失败,错误序号=[%d]\n", b);
}
///请求查询期权自对冲响应
virtual void OnRspQryOptionSelfClose(CThostFtdcOptionSelfCloseField *pOptionSelfClose, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
if (pOptionSelfClose) {
g_chFrontID = pOptionSelfClose->FrontID;
g_chSessionID = pOptionSelfClose->SessionID;
strcpy_s(g_chOptionSelfCloseSysID, pOptionSelfClose->OptionSelfCloseSysID);//期权自对冲编号
strcpy_s(g_chOptionSelfCloseRef, pOptionSelfClose->OptionSelfCloseRef);//期权自对冲引用
}
CTraderSpi::OnRspQryOptionSelfClose(pOptionSelfClose, pRspInfo, nRequestID, bIsLast);
}
///请求查询执行宣告
void ReqQryExecOrder()
{
CThostFtdcQryExecOrderField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.InstrumentID, g_chInstrumentID);
strcpy_s(a.ExchangeID, g_chExchangeID);
strcpy_s(a.ExecOrderSysID, "");
strcpy_s(a.InsertTimeStart, "");
strcpy_s(a.InsertTimeEnd, "");
int b = m_pUserApi->ReqQryExecOrder(&a, 1);
LOG((b == 0) ? "执行宣告查询......发送成功\n" : "执行宣告查询......发送失败,错误序号=[%d]\n", b);
}
///查询二代资金账户
void ReqQrySecAgentTradingAccount()
{
CThostFtdcQryTradingAccountField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
strcpy_s(a.CurrencyID, "CNY");
a.BizType = THOST_FTDC_BZTP_Future;
strcpy_s(a.AccountID, g_chInvestorID);
int b = m_pUserApi->ReqQrySecAgentTradingAccount(&a, 1);
LOG((b == 0) ? "查询二代资金账户......发送成功\n" : "查询二代资金账户......发送失败,错误序号=[%d]\n", b);
}
///请求查询二级代理商资金校验模式
void ReqQrySecAgentCheckMode()
{
CThostFtdcQrySecAgentCheckModeField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.InvestorID, g_chInvestorID);
int b = m_pUserApi->ReqQrySecAgentCheckMode(&a, 1);
LOG((b == 0) ? "请求查询二级代理商资金校验模式......发送成功\n" : "请求查询二级代理商资金校验模式......发送失败,错误序号=[%d]\n", b);
}
///注册用户终端信息,用于中继服务器多连接模式
///需要在终端认证成功后,用户登录前调用该接口
void RegisterUserSystemInfo()
{
char pSystemInfo[344];
int len;
CTP_GetSystemInfo(pSystemInfo, len);
CThostFtdcUserSystemInfoField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
memcpy(a.ClientSystemInfo, pSystemInfo, len);
a.ClientSystemInfoLen = len;
/*string ip;
ip.clear();
cin.ignore();
LOG("请输入ip地址(不输入则为空)\n");
getline(cin, ip);
strcpy_s(a.ClientPublicIP, ip.c_str());*/
strcpy_s(a.ClientPublicIP, "192.168.0.1");//ip地址
//int Port;
//Port = 0;
//cin.ignore();
//LOG("请输入端口号\n");
//cin >> Port;
//a.ClientIPPort = Port;//端口号
a.ClientIPPort = 51305;//端口号
/*string LoginTime;
LoginTime.clear();
cin.ignore();
LOG("请输入登录时间(不输入则为空)\n");
getline(cin, LoginTime);
strcpy_s(a.ClientPublicIP, LoginTime.c_str());*/
strcpy_s(a.ClientLoginTime, "20190121");
strcpy_s(a.ClientAppID, g_chAppID);
int b = m_pUserApi->RegisterUserSystemInfo(&a);
LOG((b == 0) ? "注册用户终端信息......发送成功\n" : "注册用户终端信息......发送失败,错误序号=[%d]\n", b);
}
///上报用户终端信息,用于中继服务器操作员登录模式
///操作员登录后,可以多次调用该接口上报客户信息
void SubmitUserSystemInfo()
{
char pSystemInfo[344];
int len;
CTP_GetSystemInfo(pSystemInfo, len);
CThostFtdcUserSystemInfoField a = { 0 };
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
memcpy(a.ClientSystemInfo, pSystemInfo, len);
a.ClientSystemInfoLen = len;
/*string ip;
ip.clear();
cin.ignore();
LOG("请输入ip地址(不输入则为空)\n");
getline(cin, ip);
strcpy_s(a.ClientPublicIP, ip.c_str());*/
strcpy_s(a.ClientPublicIP, "192.168.0.1");//ip地址
//int Port;
//Port = 0;
//cin.ignore();
//LOG("请输入端口号\n");
//cin >> Port;
//a.ClientIPPort = Port;//端口号
a.ClientIPPort = 51305;//端口号
/*string LoginTime;
LoginTime.clear();
cin.ignore();
LOG("请输入登录时间(不输入则为空)\n");
getline(cin, LoginTime);
strcpy_s(a.ClientPublicIP, LoginTime.c_str());*/
strcpy_s(a.ClientLoginTime, "20190121");
strcpy_s(a.ClientAppID, g_chAppID);
int b = m_pUserApi->SubmitUserSystemInfo(&a);
LOG((b == 0) ? "注册用户终端信息......发送成功\n" : "注册用户终端信息......发送失败,错误序号=[%d]\n", b);
}
///查询用户当前支持的认证模式
void ReqUserAuthMethod()
{
CThostFtdcReqUserAuthMethodField a = { 0 };
strcpy_s(a.TradingDay, "20190308");
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
int b = m_pUserApi->ReqUserAuthMethod(&a, nRequestID++);
LOG((b == 0) ? "查询用户当前支持的认证模式......发送成功\n" : "查询用户当前支持的认证模式......发送失败,错误序号=[%d]\n", b);
}
///用户发出获取图形验证码请求
void ReqGenUserCaptcha()
{
CThostFtdcReqGenUserCaptchaField a = { 0 };
strcpy_s(a.TradingDay, "");
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
int b = m_pUserApi->ReqGenUserCaptcha(&a, nRequestID++);
LOG((b == 0) ? "用户发出获取图形验证码请求......发送成功\n" : "用户发出获取图形验证码请求......发送失败,错误序号=[%d]\n", b);
}
///用户发出获取短信验证码请求
void ReqGenUserText()
{
CThostFtdcReqGenUserTextField a = { 0 };
strcpy_s(a.TradingDay, "");
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
int b = m_pUserApi->ReqGenUserText(&a, nRequestID++);
LOG((b == 0) ? "用户发出获取短信验证码请求......发送成功\n" : "用户发出获取短信验证码请求......发送失败,错误序号=[%d]\n", b);
}
///用户发出带有图片验证码的登陆请求
void ReqUserLoginWithCaptcha()
{
CThostFtdcReqUserLoginWithCaptchaField a = { 0 };
strcpy_s(a.TradingDay, "");
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
strcpy_s(a.Password, g_chPassword);
strcpy_s(a.UserProductInfo, "");
strcpy_s(a.InterfaceProductInfo, "");
strcpy_s(a.ProtocolInfo, "");//协议信息
strcpy_s(a.MacAddress, "");//Mac地址
strcpy_s(a.ClientIPAddress, "");//终端IP地址
strcpy_s(a.LoginRemark, "");//登录主备
strcpy_s(a.Captcha, "");//图形验证码的文字内容
a.ClientIPPort = 10203;
int b = m_pUserApi->ReqUserLoginWithCaptcha(&a, nRequestID++);
LOG((b == 0) ? "用户发出带有图片验证码的登陆请求......发送成功\n" : "用户发出带有图片验证码的登陆请求......发送失败,错误序号=[%d]\n", b);
}
///用户发出带有短信验证码的登陆请求
void ReqUserLoginWithText()
{
CThostFtdcReqUserLoginWithTextField a = { 0 };
strcpy_s(a.TradingDay, "");
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
strcpy_s(a.Password, g_chPassword);
strcpy_s(a.UserProductInfo, "");
strcpy_s(a.InterfaceProductInfo, "");
strcpy_s(a.MacAddress, "");
strcpy_s(a.ClientIPAddress, "");
strcpy_s(a.LoginRemark, "");
strcpy_s(a.Text, "");
a.ClientIPPort = 10000;
int b = m_pUserApi->ReqUserLoginWithText(&a, nRequestID++);
LOG((b == 0) ? "用户发出带有短信验证码的登陆请求......发送成功\n" :
"用户发出带有短信验证码的登陆请求......发送失败,错误序号=[%d]\n", b);
}
///用户发出带有动态口令的登陆请求
void ReqUserLoginWithOTP()
{
CThostFtdcReqUserLoginWithOTPField a = { 0 };
strcpy_s(a.TradingDay, "");
strcpy_s(a.BrokerID, g_chBrokerID);
strcpy_s(a.UserID, g_chUserID);
strcpy_s(a.Password, g_chPassword);
strcpy_s(a.UserProductInfo, "");
strcpy_s(a.InterfaceProductInfo, "");
strcpy_s(a.MacAddress, "");
strcpy_s(a.ClientIPAddress, "");
strcpy_s(a.LoginRemark, "");
strcpy_s(a.OTPPassword, "");
a.ClientIPPort = 10000;
int b = m_pUserApi->ReqUserLoginWithOTP(&a, nRequestID++);
LOG((b == 0) ? "用户发出带有动态口令的登陆请求......发送成功\n" : "用户发出带有动态口令的登陆请求......发送失败,错误序号=[%d]\n", b);
}
///请求查询二级代理商信息
void ReqQrySecAgentTradeInfo()
{
CThostFtdcQrySecAgentTradeInfoField a = { 0 };
strcpy_s(a.BrokerID, "");
strcpy_s(a.BrokerSecAgentID, "");
int b = m_pUserApi->ReqQrySecAgentTradeInfo(&a, nRequestID++);
LOG((b == 0) ? "请求查询二级代理商信息......发送成功\n" : "请求查询二级代理商信息......发送失败,错误序号=[%d]\n", b);
}
private:
CThostFtdcTraderApi *m_pUserApi;
};
main.cpp
#include "stdafx.h"
#include "main.h"
#include "traderSpi.h"
int main()
{
system("COLOR 0A");
logfile = fopen("syslog.txt", "w");
string g_chFrontaddr = getConfig("config", "FrontAddr");
cout << "g_chFrontaddr = " << g_chFrontaddr << "\n" << endl;
CTraderApi *pUserApi = new CTraderApi;//--------------------------
pUserApi->CreateFtdcTraderApi(".\\flow\\");
LOG(pUserApi->GetApiVersion());
cout << endl;
CSimpleHandler sh(pUserApi);
cir:pUserApi->RegisterSpi(&sh);
pUserApi->SubscribePrivateTopic(THOST_TERT_QUICK);
pUserApi->SubscribePublicTopic(THOST_TERT_QUICK);
pUserApi->RegisterFront(const_cast<char *>(g_chFrontaddr.c_str()));
pUserApi->Init();
WaitForSingleObject(g_hEvent, INFINITE);
//_getch();
while (true)
{
LOG("请确定连接模式:\n");
LOG("1.直连模式\n");
LOG("2.中继服务器操作员模式(一对多模式)\n");
LOG("3.中继服务器非操作员模式(多对多模式)\n");
int mode_num;
cin >> mode_num;
switch (mode_num)
{
case 1://直连模式
{
sh.ReqAuthenticate();
WaitForSingleObject(g_hEvent, INFINITE);
sh.ReqUserLogin();
WaitForSingleObject(g_hEvent, INFINITE);
break;
}
case 2://操作员模式
{
sh.ReqAuthenticate();
WaitForSingleObject(g_hEvent, INFINITE);
sh.ReqUserLogin();
WaitForSingleObject(g_hEvent, INFINITE);
sh.SubmitUserSystemInfo();
break;
}
case 3://非操作员模式
{
sh.ReqAuthenticate();
WaitForSingleObject(g_hEvent, INFINITE);
sh.RegisterUserSystemInfo();
sh.ReqUserLogin();
WaitForSingleObject(g_hEvent, INFINITE);
break;
}
default:
LOG("选择的模式有误,请重新输入!\n");
_getch();
system("cls");
}
break;
}
_getch();
LOG("日期:");
LOG(pUserApi->GetTradingDay());
cout << endl;
while (true)
{
loop:int input1;
system("cls");
LOG("201.上报用户终端信息\n");
LOG("110,交易查询合约行情收行情\n");
LOG("101.用户登录请求\n");
LOG("102.客户端认证\n");
LOG("103.请求登出\n");
LOG("1.结算单确认请求\n");
LOG("2.用户口令更新请求\n");
LOG("3.资金账户口令更新请求\n");
LOG("/////////////报单////////////\n");
LOG("4.报单模块\n");
LOG("////////////查询/////////////\n");
LOG("5.查询模块\n");
LOG("/////////////行权&做市商////////////\n");
LOG("6.行权&做市商\n");
LOG("///////////出入金/////////////\n");
LOG("7.转账指令\n");
LOG("///////////铜期权测试////////////\n");
LOG("8.铜期权测试\n");
LOG("9.版本6.3.13新加接口\n");
LOG("0.清空界面\n");
LOG("100.退出程序\n");
LOG("请输入你需要的操作序号:");
cin >> input1;
switch (input1)
{
case 201:
{
sh.SubmitUserSystemInfo();
_getch();
break;
}
case 110:
{
string g_chFrontMdaddr = getConfig("config", "FrontMdAddr");
cout << "g_chFrontMdaddr = " << g_chFrontMdaddr << "\n" << endl;
CThostFtdcMdApi *pUserMdApi =
CThostFtdcMdApi::CreateFtdcMdApi(".\\liu\\");
CSimpleMdHandler ash(pUserMdApi);
pUserMdApi->RegisterSpi(&ash);
pUserMdApi->RegisterFront(const_cast<char *>(g_chFrontMdaddr.c_str()));
pUserMdApi->Init();
WaitForSingleObject(xinhao, INFINITE);
sh.ReqQryInstrument();//查询合约
WaitForSingleObject(xinhao, INFINITE);
ash.SubscribeMarketData();//订阅行情
_getch();
pUserMdApi->Release();
break;
}
case 101:
{
sh.ReqUserLogin();
_getch();
break;
}
case 102:
{
sh.ReqAuthenticate();
_getch();
break;
}
case 103:
{
sh.ReqUserLogout();
_getch();
goto cir;
}
case 1://结算单确认请求
{
sh.ReqSettlementInfoConfirm();//结算单确认请求
WaitForSingleObject(g_hEvent, INFINITE);
_getch();
system("cls");
break;
}
case 2://用户口令更新请求
{
sh.ReqUserPasswordUpdate();//用户口令更新请求
WaitForSingleObject(g_hEvent, INFINITE);
_getch();
system("cls");
break;
}
case 3://资金账户口令更新请求
{
sh.ReqTradingAccountPasswordUpdate();//资金账户口令更新请求
WaitForSingleObject(g_hEvent, INFINITE);
_getch();
system("cls");
break;
}
case 4://报单录入请求
{
orderinsert:system("cls");
int orderinsert_num;
LOG("4.报入一笔立即单\n");
LOG("5.撤销上一笔报单\n");
LOG("6.报入预埋单-限价单立即单\n");
LOG("7.撤销预埋单-(上一个预埋单)\n");
LOG("8.报入预埋撤单\n");
LOG("9.撤销预埋撤单-(上一个预埋撤单)\n");
LOG("10.报入条件单\n");
LOG("11.撤销条件单-(上一个条件单)\n");
LOG("25.大商所止损单\n");
LOG("26.大商所止盈单\n");
LOG("27.FOK全成全撤\n");
LOG("28.FAK部成部撤\n");
LOG("29.市价单\n");
LOG("30.套利指令\n");
LOG("31.互换单\n");
LOG("0.返回上一层\n");
cin >> orderinsert_num;
switch (orderinsert_num)
{
case 0:
goto loop;
case 4://报入普通立即单
{
int frequence = 0;
LOG("请输入报单频率:\n");
cin >> frequence;
//sh.ReqOrderInsert_Ordinary();//报入普通立即单
//_getch();
//break;
for (int a = 0; a < frequence; a++)
{
sh.ReqOrderInsert_Ordinary();
}
}
case 5://撤销上一笔报单
{
sh.ReqOrderAction_Ordinary();//撤销上一笔报单
_getch();
break;
}
case 6://报入预埋单
{
sh.ReqParkedOrderInsert();//报入预埋单
_getch();
break;
}
case 7://删除预埋单
{
sh.ReqRemoveParkedOrder();//删除预埋单
_getch();
break;
}
case 8://报入预埋撤单
{
sh.ReqParkedOrderAction();//报入预埋撤单
_getch();
break;
}
case 9://删除预埋单撤单
{
sh.ReqRemoveParkedOrderAction();//删除预埋单撤单
_getch();
break;
}
case 10://报入条件单
{
it:LOG("1.最新价大于条件价\n");
LOG("2.最新价大于等于条件价\n");
LOG("3.最新价小于条件价\n");
LOG("4.最新价小于等于条件价\n");
LOG("5.卖一价大于条件价\n");
LOG("6.卖一价大于等于条件价\n");
LOG("7.卖一价小于条件价\n");
LOG("8.卖一价小于等于条件价\n");
LOG("9.买一价大于条件价\n");
LOG("10.买一价大于等于条件价\n");
LOG("11.买一价小于条件价\n");
LOG("12.买一价小于等于条件价\n");
LOG("13.返回上一层\n");
LOG("请输入你需要报入的条件单类型:\n");
int num;
cin >> num;
if (num < 1 || num>13)
{
LOG("输入的序号有误,请重新输入.\n");
_getch();
goto it;
}
else if (num == 13)
{
goto orderinsert;
}
else
{
sh.ReqOrderInsert_Condition(num);//报入条件单
_getch();
break;
}
}
case 11://报入条件单撤单
{
sh.ReqOrderAction_Condition();//报入条件单撤单
_getch();
break;
}
case 25://大商所止损单
{
sh.ReqOrderInsert_Touch();
_getch();
break;
}
case 26://大商所止盈单
{
sh.ReqOrderInsert_TouchProfit();
_getch();
break;
}
case 27://FOK全成全撤
{
sh.ReqOrderInsert_VC_CV();
_getch();
break;
}
case 28://FAK部成部撤
{
sh.ReqOrderInsert_VC_AV();
_getch();
break;
}
case 29://市价单
{
sh.ReqOrderInsert_AnyPrice();
_getch();
break;
}
case 30://套利指令
{
sh.ReqOrderInsert_Arbitrage();
_getch();
break;
}
case 31://互换单
{
sh.ReqOrderInsert_IsSwapOrder();
_getch();
break;
}
default:
LOG("请输入正确的序号\n");
_getch();
goto orderinsert;
}
goto orderinsert;
}
case 5://查询界面
{
search:system("cls");
int choose_num;
LOG("11.查询成交\n");
LOG("12.查询预埋单\n");
LOG("13.查询预埋撤单\n");
LOG("14.查询报单\n");
LOG("15.撤单对应查询编号\n");
LOG("16.请求查询资金账户\n");//ReqQryTradingAccount
LOG("17.请求查询投资者持仓\n");//ReqQryInvestorPosition
LOG("18.请求查询投资者持仓明细\n");//ReqQryInvestorPositionDetail
LOG("19.请求查询交易所保证金率\n");//ReqQryExchangeMarginRate
LOG("20.请求查询合约保证金率\n");//ReqQryInstrumentMarginRate
LOG("21.请求查询合约手续费率\n");//ReqQryInstrumentCommissionRate
LOG("22.请求查询做市商合约手续费率\n");//ReqQryMMInstrumentCommissionRate
LOG("23.请求查询做市商期权合约手续费\n"); //ReqQryMMOptionInstrCommRate
LOG("24.请求查询报单手续费\n");//ReqQryInstrumentOrderCommRate
LOG("25.请求查询期权合约手续费\n");//ReqQryOptionInstrCommRate
LOG("26.请求查询合约\n");//ReqQryInstrument
LOG("27.请求查询投资者结算结果\n");//ReqQrySettlementInfo
LOG("28.请求查询转帐流水\n");//ReqQryTransferSerial
LOG("29.请求查询询价\n");
LOG("30.请求查询报价\n");
LOG("31.请求查询执行宣告\n");
LOG("32.请求查询转帐银行\n");
LOG("33.请求查询交易通知\n");
LOG("34.请求查询交易编码\n");
LOG("35.请求查询结算信息确认\n");
LOG("36.请求查询产品组\n");
LOG("37.请求查询投资者单元\n");
LOG("38.期货发起查询银行余额请求\n");
LOG("39.请求查询经纪公司交易参数\n");
LOG("0.返回上一层\n");
LOG("请输入选择的序号:\n");
cin >> choose_num;
switch (choose_num)
{
case 11://请求查询成交
{
sh.ReqQryTrade();//请求查询成交
_getch();
break;
}
case 12://请求查询服务器预埋单
{
sh.ReqQryParkedOrder();//请求查询服务器预埋单
_getch();
break;
}
case 13://请求查询服务器预埋撤单
{
sh.ReqQryParkedOrderAction();//请求查询服务器预埋撤单
_getch();
break;
}
case 14://请求查询报单
{
sh.ReqQryOrder();//请求查询报单
_getch();
break;
}
case 15://撤销查询的报单回报
{
action:int action_num;
LOG("请输入需要撤单的序号:\n");
cin >> action_num;
LOG("%d\n", action_num);
if (action_num < 1 || action_num > vector_OrderSysID.size())
{
LOG("输入的序号有误,请重新输入.\n");
_getch();
goto action;
}
sh.ReqOrderAction_forqry(action_num);//撤销查询的报单回报
_getch();
break;
}
case 16://请求查询资金账户
{
sh.ReqQryTradingAccount();//请求查询资金账户
_getch();
break;
}
case 17://请求查询投资者持仓
{
sh.ReqQryInvestorPosition();//请求查询投资者持仓
_getch();
break;
}
case 18://请求查询投资者持仓明细
{
sh.ReqQryInvestorPositionDetail();//请求查询投资者持仓明细
_getch();
break;
}
case 19://请求查询交易所保证金率
{
sh.ReqQryExchangeMarginRate();//请求查询交易所保证金率
_getch();
break;
}
case 20://请求查询合约保证金率
{
sh.ReqQryInstrumentMarginRate();//请求查询合约保证金率
_getch();
break;
}
case 21://请求查询合约手续费率
{
sh.ReqQryInstrumentCommissionRate();//请求查询合约手续费率
_getch();
break;
}
case 22://请求查询做市商合约手续费率
{
sh.ReqQryMMInstrumentCommissionRate();//请求查询做市商合约手续费率
_getch();
break;
}
case 23://请求查询做市商期权合约手续费
{
sh.ReqQryMMOptionInstrCommRate();//请求查询做市商合约手续费率
_getch();
break;
}
case 24://请求查询报单手续费
{
sh.ReqQryInstrumentOrderCommRate();//请求查询报单手续费
_getch();
break;
}
case 25://请求查询期权合约手续费
{
sh.ReqQryOptionInstrCommRate();//请求查询期权合约手续费
_getch();
break;
}
case 26://请求查询合约
{
sh.ReqQryInstrument();//请求查询合约
_getch();
break;
}
case 27://请求查询投资者结算结果
{
sh.ReqQrySettlementInfo();//请求查询投资者结算结果
_getch();
break;
}
case 28://请求查询转帐流水
{
sh.ReqQryTransferSerial();//请求查询投资者结算结果
_getch();
break;
}
case 29://请求查询询价
{
sh.ReqQryForQuote();//请求查询询价
_getch();
break;
}
case 30://请求查询报价
{
sh.ReqQryQuote();//请求查询报价
_getch();
break;
}
case 31://请求查询执行宣告
{
sh.ReqQryExecOrder();//请求查询执行宣告
_getch();
break;
}
case 32://请求查询转帐银行
{
sh.ReqQryTransferBank();
_getch();
break;
}
case 33://请求查询交易通知
{
sh.ReqQryTradingNotice();
_getch();
break;
}
case 34://请求查询交易编码
{
sh.ReqQryTradingCode();
_getch();
break;
}
case 35://请求查询结算信息确认
{
sh.ReqQrySettlementInfoConfirm();
_getch();
break;
}
case 36://请求查询产品组
{
sh.ReqQryProductGroup();
_getch();
break;
}
case 37://请求查询投资者单元
{
sh.ReqQryInvestUnit();
_getch();
break;
}
case 38://期货发起查询银行余额请求
{
sh.ReqQueryBankAccountMoneyByFuture();
_getch();
break;
}
case 39://请求查询经纪公司交易参数
{
sh.ReqQryBrokerTradingParams();
_getch();
break;
}
case 0:
{
goto loop;
}
default: {
LOG("请输入正确的序号\n");
_getch();
goto search;
}
}
goto search;
}
case 6://行权&做市商
{
Exec:system("cls");
int num_xingquan;
LOG("32.执行宣告录入请求\n");
LOG("33.执行宣告操作请求\n");
LOG("34.放弃行权\n");
LOG("35.询价录入请求\n");
LOG("36.做市商报价录入请求\n");
LOG("37.做市商报价撤销请求\n");
LOG("0.返回上一层")
LOG("请选择你需要的编码");
cin >> num_xingquan;
switch (num_xingquan)
{
case 32://执行宣告录入请求
{
sh.ReqExecOrderInsert(0);
_getch();
break;
}
case 33://执行宣告操作请求
{
sh.ReqExecOrderAction();
_getch();
break;
}
case 34://放弃行权
{
sh.ReqExecOrderInsert(1);
_getch();
break;
}
case 35://询价录入请求
{
string g_chFrontMdaddr = getConfig("config", "FrontMdAddr");
cout << "g_chFrontMdaddr = " << g_chFrontMdaddr << "\n" << endl;
CThostFtdcMdApi *pUserMdApi =
CThostFtdcMdApi::CreateFtdcMdApi();
CSimpleMdHandler ash(pUserMdApi);
pUserMdApi->RegisterSpi(&ash);
pUserMdApi->RegisterFront(const_cast<char *>(g_chFrontMdaddr.c_str()));
pUserMdApi->Init();
WaitForSingleObject(xinhao, INFINITE);
ash.SubscribeMarketData();//行情订阅询价请求
sh.ReqForQuoteInsert();//交易请求询价
_getch();
pUserMdApi->Release();
break;
}
case 36://做市商报价录入请求
{
sh.ReqQuoteInsert();
_getch();
break;
}
case 37://做市商报价撤销请求
{
sh.ReqQuoteAction();
_getch();
break;
}
case 0:
{
goto loop;
}
default:
LOG("输入的编码有误,请重新输入\n");
_getch();
//goto Exec;
}
goto Exec;
}
case 7://期货资金转账
{
futrue:system("cls");
int num_future;
LOG("38.期货发起银行资金转期货请求\n");
LOG("39.期货发起期货资金转银行请求\n");
LOG("0.返回上一层\n");
LOG("请输入你需要的操作序号:");
cin >> num_future;
switch (num_future)
{
case 38://期货发起银行资金转期货请求
{
sh.ReqFromBankToFutureByFuture();
_getch();
break;
}
case 39://期货发起期货资金转银行请求
{
sh.ReqFromFutureToBankByFuture();
_getch();
break;
}
case 0:
{
goto loop;
}
default:
LOG("输入的编码有误,请重新输入\n");
_getch();
//goto futrue;
}
goto futrue;
}
case 8://铜期权测试
{
qiquan:system("cls");
int num_qiquan;
LOG("//////////////铜期权测试////////////\n");
LOG("1.期权自对冲录入请求\n");
LOG("2.期权自对冲操作请求\n");
LOG("3.请求查询期权自对冲\n");
LOG("0.返回上一层\n");
LOG("请选择你需要的编码:\n");
cin >> num_qiquan;
switch (num_qiquan)
{
case 1:
{
sh.ReqOptionSelfCloseInsert();
_getch();
break;
}
case 2:
{
sh.ReqOptionSelfCloseAction();
_getch();
break;
}
case 3:
{
sh.ReqQryOptionSelfClose();
_getch();
break;
}
case 0:
goto loop;
break;
default:
LOG("输入的序号有误,请重新输入。\n\n");
_getch();
goto qiquan;
}
goto qiquan;
}
case 9://版本6.3.13新加接口
{
NewVersion:
system("cls");
int num_Newversion;
LOG("新版本测试\n");
LOG("1.查询用户当前支持的认证模式(目前暂不启用)\n");
LOG("2.用户发出获取图形验证码请求(目前暂不启用)\n");
LOG("3.用户发出获取短信验证码请求(目前暂不启用)\n");
LOG("4.用户发出带有图片验证码的登陆请求(目前暂不启用)\n");
LOG("5.用户发出带有短信验证码的登陆请求(目前暂不启用)\n");
LOG("6.用户发出带有动态口令的登陆请求(目前暂不启用)\n");
LOG("0.返回上一层\n");
LOG("请选择你需要的编码:\n");
cin >> num_Newversion;
switch (num_Newversion)
{
case 1://查询用户当前支持的认证模式
{
sh.ReqUserAuthMethod();
_getch();
break;
}
case 2://用户发出获取图形验证码请求
{
sh.ReqGenUserCaptcha();
_getch();
break;
}
case 3://用户发出获取短信验证码请求
{
sh.ReqGenUserText();
_getch();
break;
}
case 4://用户发出带有图片验证码的登陆请求
{
sh.ReqUserLoginWithCaptcha();
_getch();
break;
}
case 5://用户发出带有短信验证码的登陆请求
{
sh.ReqUserLoginWithText();
_getch();
break;
}
case 6://用户发出带有动态口令的登陆请求
{
sh.ReqUserLoginWithOTP();
_getch();
break;
}
case 0:
goto loop;
break;
default:
LOG("输入的序号有误,请重新输入。\n\n");
_getch();
goto NewVersion;
}
goto NewVersion;
}
case 0:
system("cls");
break;
case 100:
pUserApi->Release();
exit(-1);
}
}
return 0;
}