行情(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程序化交易入門系列之五:現手、增倉、開平、對手盤計算