CTP程序化交易入門系列之六:報單(一)

行情(mduserapi)這一塊終於介紹的差不多了,下面着重介紹交易(traderapi)相關。再次強調兩點:

一、交易和行情是完全獨立的,互不干擾;

二、本系列用Python版本講解,主要考慮到Python易學習業務,代碼簡略方便講解。使用官方C++ API的同學也完全可以參考系列,因爲此Python版本業務邏輯,函數命名、函數參數這些與官方版本是完全一致的。

 

一、 報單業務簡介

報單是指將買賣期貨合約指令通過API函數發送到CTP櫃檯,CTP櫃檯收到後會對該筆訂單進行一系列的檢查,檢查通過後再發送到交易所。流程如下圖:

                                                                                      圖1 報單流程圖

即調用函數ReqOrderInsert報單後,如果在CTP端驗資驗倉等通不過,則客戶端會回調函數OnRspOrderInsert和

OnErrRtnOrderInsert;如果通過則先回調一次OnRtnOrder。

CTP再將報單報往交易所,如果交易所驗資驗倉沒通過將返回錯誤給CTP,此時客戶端會回調OnRtnOrder;如果交易所檢查正確則此時會再次回調OnRtnOrder。

那兩次OnRtnOrder有何區別,爲何分別要有OnRspOrderInsert和OnErrRtnOrderInsert?錯誤提示在哪?如何看是否成交?這我們留到(二)講,本章主要講ReqOrderInsert函數。

 

二、 報單詳解

ReqOrderInsert函數官方C++ API的原型爲:

virtual int ReqOrderInsert(CThostFtdcInputOrderField *pInputOrder, int nRequestID) = 0;

Python版原型爲:

def ReqOrderInsert(self, pInputOrder: 'CThostFtdcInputOrderField', nRequestID: 'int') -> "int":

可以看到函數有兩個參數,CThostFtdcInputOrderField用於填入報單參數,nRequestID用於填該筆請求的編號。CThostFtdcInputOrderField參數乍一看有接近30個字段,但並不是每個字段都必須要去了解。下面詳細講解一般報單所必須填寫的字段。

 

01 賬號

BrokerID  //經紀公司代碼InvestorID  //投資者代碼

這兩個信息開戶後得到,參見《系列一》。和InvestorID類似的UserID,InvestUnitID,AccountID對於絕大多數投資者來說是不需要管的,具體就不展開來說了。

02 交易所、合約號

ExchangeID //交易所代碼InstrumentID //合約代碼

ExchangeID全部大寫CFFEX、CZCE、DCE、INE、SHFE,目前simnow是必填的,生產還不必填,未來會必填。InstrumentID 注意填寫規範,詳見《系列四》。

03 價格類型、方向、價格、數量

rderPriceType //報單價格類型Direction //買賣方向LimitPrice //價格VolumeTotalOriginal //數量

1. OrderPriceType 是枚舉類型,具體多少種可見頭文件。最常用的是THOST_FTDC_OPT_LimitPrice(限價)和THOST_FTDC_OPT_AnyPrice(市價)。並不是交易所支持這裏所有的價格類型,具體支持哪些後面詳細寫一寫。

2. Direction 是枚舉類型,只有兩種,買或賣。

3. LimitPrice 是報單價格,只有OrderPriceType是限價單的時候需要填寫,填寫的時候注意價格要是最小報價單位(查詢合約可得)的整數倍,否則會被拒單。

4. VolumeTotalOriginal 是報單數量,必須大於0。

04 開平標誌、投機套保標誌

CombOffsetFlag //組合開平標誌CombHedgeFlag //組合投機套保標誌

C++中這兩個字段對應的類型是數組,但是隻有第一個字符是有用的,用枚舉值填充。枚舉值是頭文件中對應的TThostFtdcOffsetFlagType和TThostFtdcHedgeFlagType類型。

重點說明下,THOST_FTDC_OF_Open是開倉,THOST_FTDC_OF_Close是平倉/平昨,THOST_FTDC_OF_CloseToday是平今。除了上期所/能源中心外,不區分平今平昨,平倉統一使用THOST_FTDC_OF_Close。

05 觸發條件

ContingentCondition //觸發條件

這個字段是枚舉類型。

1. 一般填寫THOST_FTDC_CC_Immediately, 即報單立即有效。

2. THOST_FTDC_CC_Touch和THOST_FTDC_CC_TouchProfit是止損止盈單,需要交易所支持才能填。 

3. THOST_FTDC_CC_ParkedOrder是預埋單。預埋單是指預埋在CTP服務端,需要非交易時間報入,開市後自動報往交易所。

4. 其他枚舉類型則爲條件單,報單後存入CTP服務端,CTP判斷條件達到後自動報入交易所。

06 有效期、成交量、最小成交量

TimeCondition //有效期類型VolumeCondition//成交量類型MinVolume //最小成交量

TimeCondition是枚舉類型,目前只有THOST_FTDC_TC_GFD和THOST_FTDC_TC_IOC這兩種類型有用。GFD是指當日有效,報單會掛在交易所直到成交或收盤自動撤銷。IOC是立即完成否則撤銷,和VolumeCondition、MinVolume 字段配合用於設置FAK或FOK。具體如下表:

字段 普通 FAK FOK
TimeCondition THOST_FTDC_TC_GFD THOST_FTDC_TC_IOC THOST_FTDC_TC_IOC
VolumeCondition THOST_FTDC_VC_AV THOST_FTDC_VC_AV/THOST_FTDC_VC_MV THOST_FTDC_VC_CV
MinVolume 不需要填 如果VolumeCondition爲THOST_FTDC_VC_AV,則不需要填。如果爲THOST_FTDC_VC_MV,則設爲要求的最小成交的手數 不需要填

 

07 其他必填字段

ForceCloseReason //強平原因

枚舉值,填寫THOST_FTDC_FCC_NotForceClose

 

三、 報單代碼示例(C++版)

01 限價GFD單

ThostFtdcInputOrderField orderfield ={0};
strcpy(orderfield.BrokerID, "9999");
strcpy(orderfield.InvestorID, "000001");  
strcpy(orderfield.ExchangeID, “SHFE”);
strcpy(orderfield.InstrumentID, "au1912");  
orderfield.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
orderfield.Direction = THOST_FTDC_D_Sell;
orderfield.LimitPrice = 400.0;
orderfield.VolumeTotalOriginal = 10;    
orderfield.ContingentCondition = THOST_FTDC_CC_Immediately;  
orderfield.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
orderfield.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;    
orderfield.TimeCondition = THOST_FTDC_TC_GFD ;
orderfield.VolumeCondition = THOST_FTDC_VC_AV;    
orderfield.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;  
int ret = g_pTradeapi->ReqOrderInsert(&orderfield, 0);

02 限價FOK單

CThostFtdcInputOrderField orderfield ={0};
strcpy(orderfield.BrokerID, "9999");
strcpy(orderfield.InvestorID, "000001");
strcpy(orderfield.ExchangeID, “SHFE”);
strcpy(orderfield.InstrumentID, "au1912");  
orderfield.OrderPriceType = THOST_FTDC_OPT_LimitPrice;
orderfield.Direction = THOST_FTDC_D_Sell;
orderfield.LimitPrice = 400.0;
orderfield.VolumeTotalOriginal = 10;    
orderfield.ContingentCondition = THOST_FTDC_CC_Immediately;  
orderfield.CombOffsetFlag[0] = THOST_FTDC_OF_Open;
orderfield.CombHedgeFlag[0] = THOST_FTDC_HF_Speculation;    
orderfield.TimeCondition = THOST_FTDC_TC_IOC;
orderfield.VolumeCondition = THOST_FTDC_VC_CV;    
orderfield.ForceCloseReason = THOST_FTDC_FCC_NotForceClose;  
int ret = g_pTradeapi->ReqOrderInsert(&orderfield, 0);

 

往期推薦

● CTP程序化交易入門系列之一:準備

● CTP程序化交易入門系列之二:API基本架構及初始化

● CTP程序化交易入門系列之三:獲取實時行情及K線合成

● CTP程序化交易入門系列之四:行情訂閱常見問題解答

● CTP程序化交易入門系列之五:現手、增倉、開平、對手盤計算

● CTP 4097錯誤根源

● Level-1、Level-2、快照數據、Tick數據的區別你都瞭解嗎?

● 什麼是穿透式監管,需要投資者做什麼?

● JAVA封裝CTP API亂碼解決方案?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章