Day21 - Blocking & Non-blocking Mode

tags: 2021永丰金铁人赛

当程序要在很短的时间内发送好几笔委托单,就会牵涉到blocking及non-blocking的issue,根据shioaji官方网站的介绍,主要的差异其实是在order里面的timeout参数,这个参数设定的是毫秒数。下面就来介绍一下这两者的差异。

Non-Blocking Place Order

只要在place_order内将timeout设定为0,就会是non-blocking mode罗,范例如下:

contract = api.Contracts.Futures.TXF['TXF202108']
order = api.Order(
    action='Sell',
    price=18500,
    quantity=1,
    price_type='LMT',
    order_type='ROD', 
    octype=sj.constant.FuturesOCType.Auto,
    account=api.futopt_account
)
trade = api.place_order(contract, order, timeout=0)
print(trade)

印出来後,trade会是下面这样:

Trade(
    contract=Future(
        code='TXFH1', 
        symbol='TXF202108', 
        name='台股期货', 
        category='TXF', 
        delivery_month='202108',
        underlying_kind='I', 
        unit=1,
        limit_up=19412.0, 
        limit_down=15884.0, 
        reference=17648.0, 
        update_date='2021/07/15'
    ), 
    order=Order(
        action=<Action.Sell: 'Sell'>, 
        price=18500, 
        quantity=1, 
        account=FutureAccount(
            person_id='PERSON_ID', 
            broker_id='BROKER_ID', 
            account_id='ACCOUNT_ID', 
            signed=True, 
            username='USERNAME'
        ), 
        price_type=<StockPriceType.LMT: 'LMT'>, 
        order_type=<FuturesOrderType.ROD: 'ROD'>
    ), 
    status=OrderStatus(
        status=<Status.Inactive: 'Inactive'>
    )
)

可以发现status的部份,会是inactive,表示这笔委托单还没送到交易所,就是还在传送中的意思。那要怎麽知道委托单到底有没有提交到交易所呢?可以透过order event callback或是non-blocking place order callback来查看。

Order event callback

可以看到下面status的部份有了id跟exchange_ts,表示已经送到交易所了。

OrderState.FOrder {
    'operation': {
        'op_type': 'New', 
        'op_code': '00', 
        'op_msg': ''
    }, 
    'order': {
        'id': '40fd85d6', 
        'seqno': '958433', 
        'ordno': 'kY01g', 
        'action': 'Sell', 
        'price': 18500.0, 
        'quantity': 1, 
        'order_cond': None, 
        'order_type': 'ROD', 
        'price_type': 'LMT', 
        'market_type': 'Night', 
        'oc_type': 'Cover', 
        'subaccount': ''
    }, 
    'status': {
        'id': '40fd85d6', 
        'exchange_ts': 1626354872, 
        'modified_price': 0.0, 
        'cancel_quantity': 0
    }, 
    'contract': {
        'security_type': 'FUT', 
        'code': 'TXF', 
        'exchange': 'TIM', 
        'delivery_month': '202108', 
        'strike_price': 0.0, 
        'option_right': 'Future'
    }
}

Non-blocking place order callback

而non-blocking mode有专属的callback方式,如下:

from shioaji.order import Trade

def non_blocking_cb(trade:Trade):
    print('__my_callback__')
    print(trade)

trade = api.place_order(
    contract, 
    order, 
    timeout=0, 
    cb=non_blocking_cb # only work in non-blocking mode
)

收到callback会长这样:

__my_callback__
contract=Future(
    code='TXFH1', 
    symbol='TXF202108', 
    name='台股期货', 
    category='TXF', 
    delivery_month='202108', 
    underlying_kind='I', 
    unit=1, 
    limit_up=19412.0, 
    limit_down=15884.0, 
    reference=17648.0, 
    update_date='2021/07/15'
), 
order=Order(
    action=<Action.Sell: 'Sell'>, 
    price=18500, 
    quantity=1, 
    id='40fd85d6', 
    seqno='958433', 
    ordno='kY01g', 
    account=Account(
        account_type=<AccountType.Future: 'F'>, 
        person_id='PERSON_ID', 
        broker_id='BROKER_ID', 
        account_id='ACCOUNT_ID', 
        signed=True
    ), 
    price_type=<StockPriceType.LMT: 'LMT'>, 
    order_type=<FuturesOrderType.ROD: 'ROD'>
), 
status=OrderStatus(
    id='40fd85d6', 
    status=<Status.Submitted: 'Submitted'>, 
    status_code='    ', 
    order_datetime=datetime.datetime(2021, 7, 15, 21, 14, 32), 
    deals=[]
)

Blocking & Non-Blocking比较

下面就来测试发送委托单的速度如何,可以发现non-blocking mode发送完成的速度快了许多,不过这是送出委托单的时间,交易所确认的时间会是另外一个时间。

Blocking

start_time = time.time()
api.place_order(contract, order) # block and wait for the order response
print(time.time() - start_time)
# 0.136578369140625 <- may be different

Non-Blocking

start_time = time.time()
api.place_order(contract, order, timeout=0) # non-block, the order is in transmition (inactive).
print(time.time() - start_time)
# 0.011670351028442383 <- may be different

小结

其实blocking & non-blocking就有点像是同步跟非同步的意思,没有哪个比较好或是比较差,端看使用者需求是什麽才去决定要用哪一套。


<<:  Day23_控制项(A18遵循性) -2021/10/06

>>:  #21数据中的机率(2)

Material UI in React [ Day 7 ] Inputs (Button Group & Floating action button) & Styles

今天会接续Button的部分做个总结。 Button Group ButtonGroup 组件可用於...

Day23 类别与物件--继承、常见关键字

物件导向的继承(inheritance)特性 继承 为物件导向程序设计的特性之一,子类别 (subc...

谈思考

我先说一个故事。我认识的一位建筑师长辈,前些日子新居落成,邀请我们去他新家喝咖啡聊天。这位长辈说,他...

【Day 19】深度学习(Deep Learning)--- Tip(四)--- Momentum

昨天说在做深度学习的时候,我们可能会卡在Local minimum、saddle point、甚至是...

[Day13] [笔记]React Hooks-UseReducer

简介 useReducer 简单来说就是 useState 进阶用法。而且写法上其实跟 Redux ...