行情(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个字段,但并不是每个字段都必须要去了解。下面详细讲解一般报单所必须填写的字段。
BrokerID //经纪公司代码
InvestorID //投资者代码
这两个信息开户后得到,参见《系列一》。和InvestorID类似的UserID,InvestUnitID,AccountID对于绝大多数投资者来说是不需要管的,具体就不展开来说了。
ExchangeID //交易所代码
InstrumentID //合约代码
ExchangeID全部大写CFFEX、CZCE、DCE、INE、SHFE,目前simnow是必填的,生产还不必填,未来会必填。InstrumentID 注意填写规范,详见《系列四》。
rderPriceType //报单价格类型
Direction //买卖方向
LimitPrice //价格
VolumeTotalOriginal //数量
1. OrderPriceType 是枚举类型,具体多少种可见头文件。最常用的是THOST_FTDC_OPT_LimitPrice(限价)和THOST_FTDC_OPT_AnyPrice(市价)。并不是交易所支持这里所有的价格类型,具体支持哪些后面详细写一写。
2. Direction 是枚举类型,只有两种,买或卖。
3. LimitPrice 是报单价格,只有OrderPriceType是限价单的时候需要填写,填写的时候注意价格要是最小报价单位(查询合约可得)的整数倍,否则会被拒单。
4. VolumeTotalOriginal 是报单数量,必须大于0。
CombOffsetFlag //组合开平标志
CombHedgeFlag //组合投机套保标志
C++中这两个字段对应的类型是数组,但是只有第一个字符是有用的,用枚举值填充。枚举值是头文件中对应的TThostFtdcOffsetFlagType和TThostFtdcHedgeFlagType类型。
重点说明下,THOST_FTDC_OF_Open是开仓,THOST_FTDC_OF_Close是平仓/平昨,THOST_FTDC_OF_CloseToday是平今。除了上期所/能源中心外,不区分平今平昨,平仓统一使用THOST_FTDC_OF_Close。
ContingentCondition //触发条件
这个字段是枚举类型。
1. 一般填写THOST_FTDC_CC_Immediately, 即报单立即有效。
2. THOST_FTDC_CC_Touch和THOST_FTDC_CC_TouchProfit是止损止盈单,需要交易所支持才能填。
3. THOST_FTDC_CC_ParkedOrder是预埋单。预埋单是指预埋在CTP服务端,需要非交易时间报入,开市后自动报往交易所。
4. 其他枚举类型则为条件单,报单后存入CTP服务端,CTP判断条件达到后自动报入交易所。
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,则设为要求的最小成交的手数 | 不需要填 |
ForceCloseReason //强平原因
枚举值,填写THOST_FTDC_FCC_NotForceClose
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);
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乱码解决方案?