前言:
好的CTP框架能让你学习起来事半功倍,更容易理解,不同的人有不同CTP交易框架,因为它的自由度是非常高的,当然我是不会那么深奥的东西,我只会很基础的东西,这里的下单只是限价下单,其他下单方式原理相同。
下单业务流程:
报单是指将买卖期货合约指令通过API 函数发送到CTP 柜台,CTP 柜台收到后会对该笔订单进行一系列的检查,检查通过后再发送到交易所。流程如下图:

用代码去理解(正确的报单流程):
1、调用函数ReqOrderInsert 报单
ret = g.tduserapi.ReqOrderInsert(orderfield, 0)
回复:下单成功!
2、CTP风控通过客户端会第一次回调OnRtnOrder
回复:报单已提交
def OnRtnOrder(self, pOrder):
try:
# 报单已提交
if pOrder.OrderStatus == 'a':
print('报单已提交')
g.order_map[pOrder.OrderRef].pOrder = copy.copy(pOrder)
# 未成交
elif pOrder.OrderStatus == '3':
print('未成交')
# 全部成交
elif pOrder.OrderStatus == '0':
print('全部成交')
# 撤单
elif pOrder.OrderStatus == '5':
# 被动撤单
if pOrder.OrderSubmitStatus == '4':
print('被动撤单')
print(pOrder.StatusMsg)
else:
print(pOrder.OrderSubmitStatus)
print('撤单')
print(pOrder.StatusMsg)
# 部分成交,还在队列中
elif pOrder.OrderStatus == '1':
print(pOrder.OrderStatus)
print('部分成交,还在队列中')
else:
print("OnRtnOrder")
print("OrderStatus=", pOrder.OrderStatus)
print("StatusMsg=", pOrder.StatusMsg)
except Exception as e:
red_print(e)
3、交易所风控通过客户端会第二次回调OnRtnOrder
回复成交状态:未成交/全部成交
4、有成交则单独回调OnRtnTrade 函数
# 成交回报
def OnRtnTrade(self, pTrade):
try:
pTrade={
'报单引用': pTrade.OrderRef,
'交易所代码': pTrade.ExchangeID,
'合约代码': pTrade.InstrumentID,
'成交编号': pTrade.TradeID,
'买卖方向': pTrade.Direction,
'报单编号': pTrade.OrderSysID,
'价格': pTrade.Price,
'数量': pTrade.Volume,
'成交时期': pTrade.TradeDate,
'成交时间': pTrade.TradeTime,
}
print(pTrade)
except Exception as e:
red_print(e)
实盘演示:
下单未成交:

下单立即成交:

下单后有成交则单独回调OnRtnTrade 函数

当然,里面还有一些很细的东西没有去探究,但是也没有必要花大量的精力去探究了,对于我们,只要达到我们想要的目的即可。
报单函数:ReqOrderInsert
CTP中有一个很重要的查询函数文件,在编写的函数的过程中基本离不开它:

如果知道报单的函数为:ReqOrderInsert,那么在文件中直接搜索:ReqOrderInsert
它的Python 版原型为,可以在CThostFtdcTraderApi中找到:

def ReqOrderInsert(self, pInputOrder:'CThostFtdcInputOrderField', nRequestID: 'int') ‐> "int":
可以看到函数有两个参数,CThostFtdc
本主题为课程学员专享,成为股票量化投资课程学员后可免费阅读
成为学员