CTP下載地址:http://www.sfit.com.cn/5_1_DocumentDown.htm
源碼下載:https://github.com/wuhaizhi/CTPProject
測試賬號註冊地址http://www.simnow.com.cn/
Windwos環境下用QT開發 CTP下單軟件
新建工程
選擇編譯方式,windwos下要選用MSVC的編輯方式
添加接口的庫文件
我的庫文件放在了根目錄下面的 TradeApi\win32下面
添中庫文件完成後 .pro 中會自動生成如下代碼
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/TradeApi/win32/ -lthostmduserapi_se
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/TradeApi/win32/ -lthostmduserapi_sed
else:unix: LIBS += -L$$PWD/TradeApi/win32/ -lthostmduserapi_se
INCLUDEPATH += $$PWD/TradeApi/win32
DEPENDPATH += $$PWD/TradeApi/win32
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/TradeApi/win32/ -lthosttraderapi_se
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/TradeApi/win32/ -lthosttraderapi_sed
else:unix: LIBS += -L$$PWD/TradeApi/win32/ -lthosttraderapi_se
INCLUDEPATH += $$PWD/TradeApi/win32
DEPENDPATH += $$PWD/TradeApi/win32
主窗體需要實現CTP的API接口類
class MainWindow : public QMainWindow, public CThostFtdcTraderSpi, public CThostFtdcMdSpi
{
Q_OBJECT
private:
CThostFtdcTraderApi* m_ptraderapi;
TThostFtdcBrokerIDType m_BrokerID;
TThostFtdcUserIDType m_UserID;
TThostFtdcInvestorIDType m_InvestorID;
TThostFtdcPasswordType m_Password;
TThostFtdcAuthCodeType m_AuthCode;
TThostFtdcAppIDType m_AppID;
void InitCTP();
int UserLogin();
int Authenticate();
// 重寫CThostFtdcTraderSpi方法
void OnFrontConnected();
void OnFrontDisconnected(int nReason);
void OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
void OnRspUserLogin(CThostFtdcRspUserLoginField * pRspUserLogin, CThostFtdcRspInfoField * pRspInfo, int nRequestID, bool bIsLast);
void OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField * pSettlementInfoConfirm, CThostFtdcRspInfoField * pRspInfo, int nRequestID, bool bIsLast);
void OnRspQryInstrument(CThostFtdcInstrumentField * pInstrument, CThostFtdcRspInfoField * pRspInfo, int nRequestID, bool bIsLast);
void OnRspOrderInsert(CThostFtdcInputOrderField * pInputOrder, CThostFtdcRspInfoField * pRspInfo, int nRequestID, bool bIsLast);
void OnRtnOrder(CThostFtdcOrderField * pOrder);
void OnRtnTrade(CThostFtdcTradeField * pTrade);
void OnRspError(CThostFtdcRspInfoField * pRspInfo, int nRequestID, bool bIsLast);
void OnRspQrySettlementInfo(CThostFtdcSettlementInfoField* pSettlementInfo, CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast);
void OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
void OnErrRtnOrderAction(CThostFtdcOrderActionField *pOrderAction, CThostFtdcRspInfoField *pRspInfo);
void OnRspOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
void OnErrRtnOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo);
void OnRspQryOrder(CThostFtdcOrderField *pOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
void OnRspQryTradingAccount(CThostFtdcTradingAccountField *pTradingAccount, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);
int ReqQryTradingAccount();
int qryInstrument(QString sInstrumentID);
int qryInvestorPositon();
int QryOrder();
int CancelOrder(CThostFtdcOrderField AOrder);
void ReqSettlementInfoConfirm();
void AppendLog(QString msg);
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_btn_login_clicked();
void on_btn_qry_Order_clicked();
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_AppendMsg(QString msg);
signals:
void send_AppendMsg(QString msg);
private:
Ui::MainWindow *ui;
};
在目錄下面flow文件夾一定要有。
開發中中遇到的問題:
1、CTP回調函數中直接操作UI控件會出現錯誤或控件刷新不及時如下圖。
可以通過信號與槽的方式處理(請看代碼中的實現)
例如:向textedit中添加,日誌信息
private slots:
void on_AppendMsg(QString msg);
signals:
void send_AppendMsg(QString msg);
connect(this, SIGNAL(send_AppendMsg(QString)), this, SLOT(on_AppendMsg(QString)));
void MainWindow::OnFrontConnected(){
qDebug("OnFrontConnected");
emit send_AppendMsg("OnFrontConnected");
}
void MainWindow::on_AppendMsg(QString msg){
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz");
ui->edt_log->append(current_date + "-> " + msg);
}
運行界面如圖:
簡單的實現了幾個接口,如果需要可以自己去實現。