CTP程序化交易入门系列之六:报单(一)

12 篇文章 1 订阅
9 篇文章 21 订阅

行情(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。具体如下表:

字段普通FAKFOK
TimeConditionTHOST_FTDC_TC_GFDTHOST_FTDC_TC_IOCTHOST_FTDC_TC_IOC
VolumeConditionTHOST_FTDC_VC_AVTHOST_FTDC_VC_AV/THOST_FTDC_VC_MVTHOST_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乱码解决方案?

  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值