1. 程式人生 > >基於CTP的國內期貨程式化交易之報單流程講解

基於CTP的國內期貨程式化交易之報單流程講解

       相比國外期貨交易開發,國內期貨交易開發就有些繁瑣了,坑比較多。第一就是交易時間段多,像國外期貨美原油,全天23小時連續交易,而國內期貨滬金,全天分四個時間段交易,分別為9:00至10:15、10:30至11:30、13:30至15:00及21:00至次日02:30。交易時間段多,平倉時間段也多,這樣無形中就增加了很多業務邏輯。另外,就是交易規則多,上期所的期貨品種平倉時又分平今和平倉,這樣平倉報單時就要根據成交時間分別判斷,是前一個交易日的單子還是當前交易日的單子,否則報單引數不正確,單子將直接被交易系統拒絕。開發過程中主要用到的標頭檔案為:ThostFtdcTraderApi.h、ThostFtdcUserApiDataType.h及ThostFtdcUserApiStruct.h,動態庫為:libthosttraderapi.so。下面是一些程式碼示例:
1. 建立CTP api例項:
CThostFtdcTraderApi *pTradeApi = CThostFtdcTraderApi::CreateFtdcTraderApi(dirName);
通過呼叫CreateFtdcTraderApi()建立api例項——pTradeApi,隨後呼叫該例項發起各種請求,比如連線伺服器、使用者登入、報單、撤單、查詢持倉、查詢資金等等。 2. 建立CTP api回撥例項:
CFtdcTradeSpi *pTradeSpi = new CFtdcTradeSpi(pTradeApi, this);
這個需要自己編寫相應實現類,需要繼承上期技術提供的CThostFtdcTraderSpi類。重寫該類裡面的方法,以處理伺服器發過來的各類資料。
3. 將上述兩個例項關聯起來,併發起連線伺服器請求:
pTradeApi->RegisterSpi(pTradeSpi);
pTradeSpi->connect(serverAddr, brokerId, username, password);
連線伺服器以及例項初始化相關程式碼:
void CFtdcTradeSpi::connect(string serverAddr, string brokerId, string username, string password)
{
    serverAddr_ = serverAddr;
    brokerId_ = brokerId;
    username_ = username;
    password_ = password;

    pTradeApi_->SubscribePublicTopic(THOST_TERT_QUICK);
    pTradeApi_->SubscribePrivateTopic(THOST_TERT_QUICK);
    pTradeApi_->RegisterFront((char *)serverAddr_.c_str());
    pTradeApi_->Init();
}
連線請求發出後,OnFrontConnected()會響應請求,然後在該函式內可以呼叫登入函式pTradeApi_->ReqUserLogin()完成使用者登入操作,相應的OnRspUserLogin()會響應請求。由於國內期貨在交易日內首次登入時需要做投資者結算結果確認操作,所以在OnRspUserLogin()函式內,可以進一步呼叫pTradeApi_->ReqSettlementInfoConfirm()做投資者結算結果確認,確認結果將在OnRspSettlementInfoConfirm()內返回。做完投資者結算結果確認操作,整個伺服器連線與使用者登入過程就完成了,可以正常下單交易了。
void CFtdcTradeSpi::OnFrontConnected()
{
    LOG_INFO << username_ << " 回撥: 與伺服器已建立連線, 開始登入";
}

void CFtdcTradeSpi::OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
    if (pRspUserLogin == NULL || pRspInfo == NULL)
    {
        LOG_INFO << username_ << " 登入回撥異常, 指標為空";
        return;
    }

    if (pRspInfo->ErrorID == Err_Succeed)
    {
        LOG_INFO << username_ <<  " 登入成功, 開始投資者結算結果確認, 當前交易日: " << pTradeApi_->GetTradingDay();
    }
}

void CFtdcTradeSpi::OnRspSettlementInfoConfirm(CThostFtdcSettlementInfoConfirmField *pSettlementInfoConfirm, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
    if (pSettlementInfoConfirm == NULL || pRspInfo == NULL)
    {
        LOG_INFO << username_ << " 投資者結算結果確認回撥異常, 指標為空";
        return;
    }

    string errorMsg;
    getErrcodeDesc(pRspInfo->ErrorMsg, errorMsg);
    LOG_INFO << username_ << " "
             << "經紀公司程式碼: " << pSettlementInfoConfirm->BrokerID << " "
             << "投資者程式碼: " << pSettlementInfoConfirm->InvestorID << " "
             << "確認日期: " << pSettlementInfoConfirm->ConfirmDate << " "
             << "確認時間: " << pSettlementInfoConfirm->ConfirmTime << " "
             << "回撥: 錯誤資訊, 錯誤碼: " << pRspInfo->ErrorID << " " << errorMsg;
}
4. 期貨報單: (1)ReqOrderInsert():報單請求
CThostFtdcInputOrderField reqField;
memset(&reqField, 0, sizeof(CThostFtdcInputOrderField));
......
......
pTradeApi_->ReqOrderInsert(&reqField, orderInsertReqId_);
前文所講解基本一致,大同小異。 需要正確填寫買賣/方向、開倉/平倉、市價/限價、委託數量、委託價格等等,填寫完畢就可以呼叫ReqOrderInsert()報單了。 (2)OnRspOrderInsert():報單請求應答
void CFtdcTradeSpi::OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
}
報單成功後,理論上該函式就會被回撥。但通過查閱日誌來看,可能上期技術為了簡化邏輯,弱化了該函式,實際上該函式並沒有被回撥,當然,這也可能與所使用的sdk版本有關係。 (3)OnRtnOrder():委託變化通知
void CFtdcTradeSpi::OnRtnOrder(CThostFtdcOrderField *pOrder)
{
}
當委託狀態發生變化時,會被回撥。一般常見的委託狀態主要有:未知、未成交還在佇列中、部分成交還在佇列中、完全成交等。一次報單,如果數量比較多,一般不會一次全部成交,而是會分多批次成交,所以該函式會不斷被回撥。隨著不斷回撥,每次返回的委託量、成交量、剩餘量等資料會不斷變更。 (4)OnRtnMatchInfo():成交資訊變化推送通知
void CFtdcTradeSpi::OnRtnTrade(CThostFtdcTradeField *pTrade)
{
}
該函式比較重要,返回的每一條資訊都是成交資訊,裡面包含成交量、成交價、成交費用等等,這些都是投資者關心的資料。總體來說,整個報單過程與前文講解的國外期貨報單流程基本一致。不過有一點簡化了,那就是不需要編寫報單流控邏輯,因為CTP沒有報單頻率限制,但是有查詢頻率限制,這一點剛好和易盛的交易api相反,易盛是查詢沒頻率限制,報單有頻率限制。 5.  查詢期貨賬號持倉: 查詢持倉主要呼叫pTradeApi_->ReqQryInvestorPosition(),按照文件說明填寫合適的引數即可。查詢持倉響應函式為:
void CFtdcTradeSpi::OnRspQryInvestorPosition(CThostFtdcInvestorPositionField *pInvestorPosition, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
}
該函式需要由開發者自己重寫,比較麻煩的是持倉資料不會一次全部返回,而是一批一批返回,需要自己按照多空方向分別做彙總計算才行。 編寫完程式碼,如何測試程式呢?貌似上期技術沒有提供測試賬號,不過可以到SimNow網站(http://www.simnow.com.cn/)註冊交易測試賬號,不知道SimNow和上期技術啥關係。註冊成功後賬號內既有100萬,這樣就可以測試開倉及平倉了。

相關推薦

基於CTP國內期貨程式化交易報單流程講解

       相比國外期貨交易開發,國內期貨交易開發就有些繁瑣了,坑比較多。第一就是交易時間段多,像國外期貨美原油,全天23小時連續交易,而國內期貨滬金,全天分四個時間段交易,分別為9:00至10:1

基於CTP國內期貨程式化交易行情獲取講解

       前面兩篇文章主要講了國外期貨相關程式開發,使用的是鄭州易盛的行情及交易api,而國內期貨相關程式開發易盛貌似也是有sdk的,不過專案中使用的是上期技術的sdk,即大家經常提到的CTP a

期貨程式化交易期貨入門知識摘錄整理

       開發期貨程式化交易程式,首先要熟悉期貨交易術語,否則不熟悉業務,開發的程式將會漏洞百出。下面是我在學習過程中摘錄的一些期貨相關知識,還是比較零散,可以作為入門時的資料看看。由於是陸續從網

程式化交易:使用python的baostock介面,實現股票自動盯盤

        不是每個人都有時間時刻盯盤的,而且股票那麼多,往往掛一漏萬,錯過很多好的股票和買入機會。筆者嘗試用python實現了一個可以自動盯盤的程式,呼叫了一個免費的股票資料介面baostock提供的歷史行情資料和實時資料,實現了對盤中突破10日高點,且在20日均線上股

商品期貨程式化交易

2009年3月27日至今的螺紋鋼資料回測    合約[RB]    總交易次數[117],總盈利[2323300],總虧損[-870770],利潤[1452530]    盈利次數[47],比率[40.17],每筆盈利[49431.91]    虧損次數[70],比率[59.

MapReduce流程講解

週末心情好,來理下整個MapReduce的工作流程,方便記憶和理解。 hadoop四大元件之一的MapReduce分散式計算系統,和HDFS-分散式儲存系統,YARN-分散式作業系統(主要負責資源排程,相當於作業系統)三分天下,那麼我們就將資料從HDFS輸入到最後輸出到HD

MT5客戶端CTP接入 國內期貨三 自定義交易品種 實時資料接收

實時接收資料大概分為2種方式 方式1:直接通過webrequest方式去請求, 例如 void OnStart() { string cookie=NULL,headers; char post[],result[]; string url="htt

MT5客戶端CTP接入 國內期貨二 自定義交易品種 歷史資料匯入

方法1: 介面插入歷史資料 1.  選中產品與資料週期 2 選擇歷史資料檔案 將資料插入 3. 檢視匯入歷史資料情況 切換1小時週期 資料自然推算出來 good! 4.  K線效果圖   手工匯入成功

小白期貨CTP程式化交易開發入門(一)--CTP開發基礎

接觸CTP也才半年多,一邊學習一邊摸索,看到各大CTP的QQ群裡,也都是在問一些很菜的問題,就簡單總結和介紹下,今天主要是基礎知識,即CTP程式的基礎和開源的Demo版本: CTP交易介面是由::::::上海期貨資訊科技有限公司::::::開發的,提供C++的介面,網上也有

CTP期貨期權交易開發

3.2 open 期權 immediate level ast 發的 gfs 發布者 CTP交易部分接口說明 綜合交易平臺(Comprehensive Transaction Platform,CTP)是專門為期貨公司開發的一套期貨經紀業務管理系統,由交易、風險控制和結算三

淺談CTP期貨行情交易API

1、什麼是CTP      綜合交易平臺(Comprehensive Transaction Platform,CTP)是專門為期貨公司開發的一套期貨經紀業務管理 系統,由交易、風險控制和結算三大系統組成。      其中,交易系統主要負責訂單處理、行情轉發及銀期轉賬業務

CTP 7*24小時期貨自動交易程式

執行程式:免責宣告:本程式需要在Win 64位作業系統下執行。程式的設定均採用了文字檔案,便於修改。雖提供了靈活性,但修改時應當確保修改的正確性。請通讀全檔案後再行使用。程式執行依賴於準確的計算機時間,請做如下設定:在桌面右下角的時間上單擊右鍵,選擇“調整日期/時間”。在彈出

程序猿的量化交易路(17)--CointraderTemporal實體(5)

eas 建表 times create bject cloud temp 存儲 時間 轉載須要註明:http://blog.csdn.net/minimicall,http://cloudtrader.top/ 這一小節說明一個時間實體Temporal實體,它的代碼非常

程序猿的量化交易路(28)--CointraderOffer報價實體(15)

content mod min timer warnings ppr extend gets ant 轉載須註明出處:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ Off

基於LVS的負載均衡實現NAT

ftp服務器 replicat 會話 集群 負載均衡技術 方式 conn 需要 執行 一 什麽是負載均衡 負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同

程序猿的量化交易路(27)--CointraderPriceData價格數據(14)

time abstract ansi crypto ket pub return nds set 轉載須註明出處:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ Pr

基於C#解決OJ刷題輸入輸出問題的總結(AKOJ1064-1071A+B問題匯總)

-s har article not edit stat sig nbsp rgs 聲明:題目部分為akoj題目,代碼為本人AC代碼。 因為本人學校的oj支持各種環境,非常正常的當中就包括了C#。然暑假在家較為空暇,本著學習C#和復習算法的態度

前端基於react,後端基於.net core2.0的開發路(1) 介紹

tco ioc logs asp webpack 路由 src 部署 關鍵字 文章提綱目錄 1.前端基於react,後端基於.net core2.0的開發之路(1) 介紹 2.前端基於react,後端基於.net core2.0的開發之路(2) 開發環境的配置,

4.前端基於react,後端基於.net core2.0的開發路(4) 前端打包,編譯,路由,模型,服務

hub 解決 路徑 export routes run 部署 service 後端 1.簡要的介紹 學習react,首先學習的就是javascript,然後ES6,接著是jsx,通常來說如果有javascript的基礎,上手非常快,但是真正要搭建一個前端工程化項目,還是有很

前端基於react,後端基於.net core2.0的開發路(番外篇) 後端使用T4模板,生成某些類

bsp 。。 bubuko 按鈕 uil out eva 下載地址 所有 1.介紹 因為開發過程中,有部分類是你加一個模型,就需要去改動的,每次加非常的煩,或者有些類,你只用到了他基類的方法,但是你還必須建一個文件才能調用他基類的方法,也很煩。 這個時候,T4就非常有用了。