日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT实现简易ctp程序

發布時間:2024/3/26 c/c++ 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT实现简易ctp程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.開發環境

? qt5.9.9 msvc2017環境(mingw不能運行) 以及自帶的Qt Creator,上期提供的穿透式api,并且導入qcustomplot庫以實現圖表效果。

? 本程序借鑒了b站視頻:BV1ET4y1L7iN。

2.效果展示

?

?

? 實現了行情,委托,成交,持倉,合約,等表的展示,以及用戶的登錄和下單等操作。注:登錄部分數據固定,可以自行拓展,可以通過下載快期交易平臺來查看自己的下單等操作。程序運行后,當行情表沒有數據,請使用另一個可以使用的端口登錄本程序(在快期交易平臺可以查看)。

3.代碼簡介

?? 引用:綜合交易平臺(Comprehensive Transaction Platform,CTP)是專門為期貨公司開發的一套期貨經紀業務管理系統,由交易、風險控制和結算三大系統組成。導入上期提供的api接口后,分別對行情,委托,成交,持倉,合約來進行實現。

CTP 的所有接口都分為 Spi 和 Api 兩種,這里對其簡單說明

API:Api 類提供了交易/行情的各種功能,但這些需要我們主動對服務器發出的請求

SPI:Spi 類提供了交易/行情相關的回調接口,我們需要繼承該類并重載這些接口,以獲取響應數據。

? api可以理解為是上期為我們提供的已經封裝好的一類函數,我們只需直接調用這些函數,大部分無需重寫,即可使用該函數功能,而spi體現了一種回調的思想,當我們的api調用后,spi會返回一些東西,我們可以通過這些返回值來判斷api執行是否正常。

? 舉個例子,當我們需要登錄行情的時候,我們需要使用RspUserLogin函數,當該函數執行完畢后,會有與之對應的OnRspUserLogin函數被自動調用,我們可以利用其中的返回值來判斷登錄是否成功。

? 要實現行情部分,我們需要創建一個類來繼承CThostFtdcMdSpi并且重寫部分函數。

? 舉個例子,當客戶端與交易后臺進行通訊連接時,我們可以對OnFrontConnected重寫來監聽連接是否成功。

?

? 同時實現行情的登錄。接下來,我們通過對OnRtnDepthMarketData 的重寫來實現行情信息的獲取,由于涉及到多個類之間的信息通信,我們在獲取到數據后將其拼接為一個由 , 隔開的字符串并且寫一個帶有字符串參數的信號sendData來傳輸數據,在主類中獲取并且打印在表單上。

?

?? 交易部分則復雜一些。不過還是讓我們從客戶端登錄做起,照葫蘆畫瓢,我們重寫了tradeapi中OnFrontConnected 函數,來在信號連? 接的時候就實現其登錄,以下的userid也就是注冊時得到的investorID可以修改為您自己的investorID。

??? 要實現個人賬戶的登錄,我們在登錄按鈕上寫一個槽函數,將正確的賬戶密碼寫上去,登陸成功。

? 在登錄后,程序會立馬獲取合約,持倉,賬戶等信息,三者的寫法不會有很大區別,讓我們以合約為例子來講一下。

? 我們需要重寫OnRspQryInstrument函數,并且使用多個字符串來接受pInstrument中的數據,接下來我們將其拼接為一個字符串,同上,由于涉及到多個類之間的信息通信,我們在獲取到數據后將其拼接為一個由 , 隔開的字符串并且寫一個帶有字符串參數的信號sendDataHy來傳輸數據,同時,我們也要將這些數據存儲在一個兩重字符串數組中以便之后使用,最后,在主類中分割字符串并將其寫入表中。

?? 合約,持倉,賬戶表單操作差異不大,學會了合約之后,就可以舉一反三了。我們來到很重要的一步,下單以及撤單,請繼續閱讀以下內容。

??? 要實現這一功能,我們需要自行寫一個函數并且主動調用它了,我們找到ReqOrderInsert函數,發現這個函數可以用于下單,于是我們可以自己定義一個同名的ReqOrderInsert函數,但是它擁有參數以便我們調用它。

?

??

void CTraderSpi::ReqOrderInsert(QString dm,QString lx,int lots,double price) {CThostFtdcInputOrderField ord ;memset(&ord, 0, sizeof(ord));strcpy_s(ord.BrokerID, "9999");strcpy_s(ord.InvestorID, "204925");strcpy_s(ord.ExchangeID, "SHFE");strcpy_s(ord.InstrumentID,dm.toStdString().data() );sprintf(ORDER_REF,"%d",iRequestID);strcpy_s(ord.OrderRef,ORDER_REF );ord.OrderPriceType = THOST_FTDC_OPT_LimitPrice;//限價if(lx =="kd"){ord.Direction = THOST_FTDC_D_Buy;//買 DIRECTIONord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;//開}else if(lx =="pd"){ord.Direction = THOST_FTDC_D_Buy;//買 DIRECTIONord.CombOffsetFlag[0] = THOST_FTDC_OF_CloseToday;//開}else if(lx =="kk"){ord.Direction = THOST_FTDC_D_Sell;//買 DIRECTIONord.CombOffsetFlag[0] = THOST_FTDC_OF_Open;//開}else if(lx =="pk"){ord.Direction = THOST_FTDC_D_Sell;//買 DIRECTIONord.CombOffsetFlag[0] = THOST_FTDC_OF_CloseToday;//開}ord.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;//投機ord.LimitPrice = price;ord.VolumeTotalOriginal = lots;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;pUserApi->ReqOrderInsert(&ord, ++iRequestID); };

?? 函數看起來非常之長,但是其中很多都是比較固定的值,對于我們新手來說,復制粘貼就完事了,參數lx是用來區分是開多,平多,還是開空,平空的,作為非金融專業的我也不是很懂這些,大家可以自行查找以進行拓展,我們將ord數據寫好后調用以ord為參數的ReqOrderInsert,即可實現下單。

? 再執行下單后,委托會出現數據,如果是處于還未成交的狀況下,我們可以實現撤單功能,那么在委托的表單中,我們就需要實現 點擊后識別點擊的一欄并且出現一個撤單選項,點擊撤單我們就可以進行撤單操作。

? 代碼如下:?

void MainWindow::OnWTmenu(const QPoint &pt) {qDebug()<<"onwtmenu";QMenu menu;menu.addAction(ui->actioncd);menu.exec(ui->tableWT_2->mapToGlobal(pt));}void MainWindow::ct() {if(ui->tableWT_2->rowCount()==0)return;int i = ui->tableWT_2->currentIndex().row();QString wth = ui->tableWT_2->item(i,7)->text();QString jys = ui->tableWT_2->item(i,8)->text();QString brokerid = "9999";qDebug()<<wth;qDebug()<<jys;if(wth == "")return;ptdUserSpi->ReqOrderAction(brokerid,wth,jys); }

? 撤單相較來說簡單一點,我們獲取到點擊的行數后,通過行數來獲得委托號以及交易所,最后加上brokerID即可調用撤單,撤單成功后,委托表中其狀態會變為以撤單,同時,你也可以登錄快期交易平臺來查看交易是否撤單成功。

4.代碼獲取

?賬號注冊:?? sinmow?(有的時間段可能登錄不上)。

api獲取:上期技術官網? ,sinmow 。

gitee:?QTctp: QT簡單實現ctp程序 。

推薦閱讀文章 :CTP 學習筆記_EmoryHuang的博客-CSDN博客

總結

以上是生活随笔為你收集整理的QT实现简易ctp程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。