【D29】食材、厨具准备好了,准备上桌

前言

我们已经熟悉了厨房环境(开发环境)、各式各样的厨具(API),以及可以料理的食谱(商品与策略),现在就要把我们的菜肴上桌(下单)罗~在这之前,先看看上菜的路径。

参考网站:Future and Option

本日程序码使用:d29_order.py


如何下单?

需要两个物件,一个是必要的商品档,也就是要购买的商品标的,另一个是要购买的资讯。前者的话,就以期货来说,就是api.Contracts.Futures.TXF.TXF202110这样,也就是我们在订阅或是看snapshot的contract。而购买资讯则是新的东西,他会长成这样:

order = t.api.Order(
    action=sj.constant.Action.Buy,
    price=15000,
    quantity=2,
    price_type=sj.constant.StockPriceType.LMT,
    order_type=sj.constant.FuturesOrderType.ROD,
    octype=sj.constant.FuturesOCType.Auto,
    account=t.api.futopt_account,
)

一般来说,参数都不需要动,我们只要修改价格(price)与数量(quantity),而其他栏位的意义为:

  • action (str): 这笔单的买卖别为何,资料会是BuySell
  • price_type (str): 价格的类型,资料会是LMT(限价)、MKT(市价)、MKP(范围市价)
  • order_type (str): 单的有效期。资料会是RODIOCFOK
  • octype (str): 这笔单是属於哪种类别,资料会是Auto(自动)、NewPosition(新仓)、Cover(平仓)、 DayTrade(当冲)
  • account (:obj:Account): 哪个帐号执行的

接着是下单的功能:api.place_order(contract, order),里面的参数为商品档,以及订单价格数量与其他内容。执行後会显示这样:

Trade(contract=Future(code='TXFJ1', symbol='TXF202110', name='台股期货10', category='TXF', delivery_month='202110', underlying_kind='I', unit=1, limit_up=18060.0, limit_down=14778.0, reference=16419.0, update_date='2021/10/13'), order=Order(action=<Action.Buy: 'Buy'>, price=10, quantity=2, id='203635d6', seqno='980239', ordno='kY00t', account=Account(account_type=<AccountType.Future: 'F'>, person_id='PAPIUSER07', broker_id='F002000', account_id='1107458', signed=True), price_type=<StockPriceType.LMT: 'LMT'>, order_type=<FuturesOrderType.ROD: 'ROD'>), status=OrderStatus(id='203635d6', status=<Status.PendingSubmit: 'PendingSubmit'>, status_code='    ', order_datetime=datetime.datetime(2021, 10, 13, 23, 6, 38), deals=[]))

说明这个商品的资讯,已就下单的内容,其中status是结果,我们的结果是status=<Status.PendingSubmit: 'PendingSubmit'>,还在PendingSubmit: 传送中

各种状态为:

  • PendingSubmit: 传送中
  • PreSubmitted: 预约单
  • Submitted: 传送成功
  • Failed: 失败
  • Cancelled: 已删除
  • Filled: 完全成交
  • Filling: 部分成交

这样就下单出去罗~

选择权下单

继续延用之前的trader class,这边直接呼叫.api来执行下单作业。

t = trader()
t.login()

# 选择权下单
contract = t.api.Contracts.Options.TXO.TXO202110016300C
order = t.api.Order(
    action=sj.constant.Action.Buy,
    price=10,
    quantity=2,
    price_type=sj.constant.StockPriceType.LMT,
    order_type=sj.constant.FuturesOrderType.ROD,
    octype=sj.constant.FuturesOCType.Auto,
    account=t.api.futopt_account,
)

trade = t.api.place_order(contract, order)
trade

其中的order物件不需要调整,直接沿用期货的部分,只是pricequantity可以做调整,如果要当卖方action也要变动。最後直接呼叫place_order()

就可以看到选择权的call下单内容:

OrderState.FOrder {'operation': {'op_type': 'New', 'op_code': '00', 'op_msg': ''}, 'order': {'id': 'f9ebac69', 'seqno': '980238', 'ordno': 'kY00s', 'account': {'account_type': 'F', 'person_id': '', 'broker_id': 'F002000', 'account_id': '1107458', 'signed': True}, 'action': 'Buy', 'price': 10.0, 'quantity': 2, 'order_type': 'ROD', 'market_type': 'Night', 'oc_type': 'New', 'subaccount': ''}, 'status': {'id': 'f9ebac69', 'exchange_ts': 1634137593, 'modified_price': 0.0, 'cancel_quantity': 0, 'order_quantity': 2}, 'contract': {'security_type': 'OPT', 'code': 'TXO', 'exchange': 'TIM', 'delivery_month': '202110', 'delivery_date': '', 'strike_price': 16300.0, 'option_right': 'OptionCall'}}

好玩的是,万一价格下错,超出规则,他会这样显示:

OrderState.FOrder {'operation': {'op_type': 'New', 'op_code': '9921', 'op_msg': '超过该商品涨跌停价'}...(以下省略)

後记

下单其实有点复杂,不过简单的话只需要动三个参数,也就是买卖别、数量、价格,再加上商品就可以下单。我们之前已经取得商品的价格,也说明组合单的买卖别,接着就直接轻松地带入价格和买卖方向进去,这样就可以下单罗~~是不是还满简单的呢!

另外,测试环境居然Mac也能下单,还满方便的,不过正式区应该就需要docker了...


<<:  DAY30:Strategy Pattern,选定不同的策略来执行

>>:  《莫守成规》五个叛逆特质,让你又乖又坏(?)

[Day 26] 组件基础

记得在第19天的时候有稍微的提到组件这个东西吗?今天这篇就是来初步介绍组件到底是什麽!! 组件的建立...

Javascript 执行环境、作用域 - 执行绪与同步、非同步

function eatBreakfast () { console.log('吃早餐'); } f...

Day05_CAP定理

今天讲解的是 CAP 定理 DAY05_CAP定理 ...

[第26天]理财达人Mx. Ada-OBV指标

前言 本文说明使用TA-Lib函式库计算OBV指标。 OBV指标 OBV能量潮指标(On Balan...

【Day04】执行环境与执行堆叠

执行环境(Execution context) 函式执行环境 昨天有提到函式的作用域是限制在 fun...