Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

import shioaji as sj
import json
from shioaji import constant


def order_cb(stat, msg):
    if "status" in msg:
        print(f"status: {json.dumps(msg['status'], indent=4)}")
        print(f"order: {json.dumps(msg['order'], indent=4)}")
        print(f"contract: {json.dumps(msg['contract'], indent=4)}")


def get_orders(api, account):
    api.update_status(account)
    trades = {t.status.id: t for t in api.list_trades()}

    for trade in trades.values():
        print(
            "Order ID: {}\nAction: {}\nStatus: {}\nStatus Value: {}\nOrder Condition: {}".format(
                trade.status.id,
                trade.order.action,
                trade.status.status,
                trade.status.status.value,
                trade.order.order_cond.value,
            )
        )
        print("-" * 30)


def cancel_all_orders(api):
    api.update_status()
    for trade in api.list_trades():
        if trade.status.status in [
            constant.Status.PreSubmitted,
            constant.Status.Submitted,
            constant.Status.PartFilled,
        ]:
            api.cancel_order(trade, timeout=0)


def test_stock(api):
    stock_contract = api.Contracts.Stocks.TSE["2890"]
    print(
        "Limit Up: {}\nLimit Down: {}".format(
            stock_contract.limit_up, stock_contract.limit_down
        )
    )

    stock_order = api.Order(
        price=23.15,
        quantity=1,
        action=constant.Action.Buy,
        price_type=constant.StockPriceType.LMT,
        order_type=constant.OrderType.ROD,
        account=api.stock_account,
    )
    stock_trade = api.place_order(stock_contract, stock_order)
    get_orders(api, api.stock_account)


def test_future(api):
    # 下單
    futures_contract = api.Contracts.Futures.TXF.TXFR1
    print(
        "Limit Up: {}\nLimit Down: {}".format(
            futures_contract.limit_up, futures_contract.limit_down
        )
    )

    futures_order = api.Order(
        action=constant.Action.Buy,
        price=21000,
        quantity=3,
        price_type=constant.FuturesPriceType.LMT,
        order_type=constant.OrderType.ROD,
        octype=constant.FuturesOCType.Auto,
        account=api.futopt_account,
    )
    futures_trade = api.place_order(futures_contract, futures_order)
    # print(f"\nFutures Trade: {futures_trade}")
    # get_orders(api, api.futopt_account)


def main():
    api = sj.Shioaji(simulation=True)
    api.login(
        api_key="",
        secret_key="",
    )

    # 設定委託回報函式
    api.set_order_callback(order_cb)

    # test_stock(api)
    test_future(api)

    # cancel_all_orders(api)
    # input("Press Enter to exit")
    api.logout()


if __name__ == "__main__":
    main()