原创 +1银贝 期货CTP量化系列——下单

小小的夏天 2023-11-9 129

前言:

好的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

本主题为课程学员专享,成为股票量化投资课程学员后可免费阅读

成为学员

上传的附件:

最新回复 ( 0条评论 )


官方微信
码力十足学量化
Powered by Xiuno BBS 4.0.7

官方微信