2021永丰金铁人赛
当程序要在很短的时间内发送好几笔委托单,就会牵涉到blocking及non-blocking的issue,根据shioaji官方网站的介绍,主要的差异其实是在order里面的timeout参数,这个参数设定的是毫秒数。下面就来介绍一下这两者的差异。
只要在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来查看。
可以看到下面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 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=[]
)
下面就来测试发送委托单的速度如何,可以发现non-blocking mode发送完成的速度快了许多,不过这是送出委托单的时间,交易所确认的时间会是另外一个时间。
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
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
今天会接续Button的部分做个总结。 Button Group ButtonGroup 组件可用於...
物件导向的继承(inheritance)特性 继承 为物件导向程序设计的特性之一,子类别 (subc...
我先说一个故事。我认识的一位建筑师长辈,前些日子新居落成,邀请我们去他新家喝咖啡聊天。这位长辈说,他...
昨天说在做深度学习的时候,我们可能会卡在Local minimum、saddle point、甚至是...
简介 useReducer 简单来说就是 useState 进阶用法。而且写法上其实跟 Redux ...