Upgrading to 1.0
Version 1.0 is a major release. This document assist users migrating to version 1.0.
Shioaji¶
Remove argument backend
In
import shioaji as sj
sj.Shioaji?
Out
Init signature:
sj.Shioaji(
simulation: bool = False,
proxies: Dict[str, str] = {},
currency: str = 'NTD',
)
Docstring:
shioaji api
Functions:
login
logout
activate_ca
list_accounts
set_default_account
get_account_margin
get_account_openposition
get_account_settle_profitloss
get_stock_account_funds
get_stock_account_unreal_profitloss
get_stock_account_real_profitloss
place_order
update_order
update_status
list_trades
Objects:
Quote
Contracts
Order
Init docstring:
initialize Shioaji to start trading
Args:
simulation (bool):
- False: to trading on real market (just use your Sinopac account to start trading)
- True: become simulation account(need to contract as to open simulation account)
proxies (dict): specific the proxies of your https
ex: {'https': 'your-proxy-url'}
currency (str): {NTX, USX, NTD, USD, HKD, EUR, JPY, GBP}
set the default currency for display
Init signature:
sj.Shioaji(
backend: str = 'http',
simulation: bool = False,
proxies: Dict[str, str] = {},
currency: str = 'NTD',
)
Docstring:
shioaji api
Functions:
login
activate_ca
list_accounts
set_default_account
get_account_margin
get_account_openposition
get_account_settle_profitloss
get_stock_account_funds
get_stock_account_unreal_profitloss
get_stock_account_real_profitloss
place_order
update_order
update_status
list_trades
Objects:
Quote
Contracts
Order
Init docstring:
initialize Shioaji to start trading
Args:
backend (str): {http, socket}
use http or socket as backend currently only support http, async socket backend coming soon.
simulation (bool):
- False: to trading on real market (just use your Sinopac account to start trading)
- True: become simulation account(need to contract as to open simulation account)
proxies (dict): specific the proxies of your https
ex: {'https': 'your-proxy-url'}
currency (str): {NTX, USX, NTD, USD, HKD, EUR, JPY, GBP}
set the default currency for display
Login¶
Please update your login parameters from person_id
and passwd
to api_key
and secret_key
in order to use version 1.0. You can apply for an api_key on the Token page.
In
import shioaji as sj
api = sj.Shioaji()
api.login(
api_key="YOUR_API_KEY",
secret_key="YOUR_SECRET_KEY"
)
import shioaji as sj
api = sj.Shioaji()
api.login(
person_id="YOUR_PERSON_ID",
passwd="YOUR_PASSWORD",
)
Out
[
FutureAccount(person_id='', broker_id='', account_id='', signed=True, username=''),
StockAccount(person_id='', broker_id='', account_id='', signed=True, username='')
]
Stock Order¶
Rename TFTStockOrder
to StockOrder
StockOrder
>> sj.order.StockOrder?
Init signature:
sj.order.StockOrder(
*,
action: shioaji.constant.Action,
price: Union[pydantic.types.StrictInt, float],
quantity: shioaji.order.ConstrainedIntValue,
id: str = '',
seqno: str = '',
ordno: str = '',
account: shioaji.account.Account = None,
custom_field: shioaji.order.ConstrainedStrValue = '',
ca: str = '',
price_type: shioaji.constant.StockPriceType,
order_type: shioaji.constant.OrderType,
order_lot: shioaji.constant.StockOrderLot = <StockOrderLot.Common: 'Common'>,
order_cond: shioaji.constant.StockOrderCond = <StockOrderCond.Cash: 'Cash'>,
daytrade_short: bool = False,
) -> None
>> sj.order.TFTStockOrder?
Init signature:
sj.order.TFTStockOrder(
*,
action: shioaji.constant.Action,
price: Union[pydantic.types.StrictInt, float],
quantity: shioaji.order.ConstrainedIntValue,
id: str = '',
seqno: str = '',
ordno: str = '',
account: shioaji.account.Account = None,
custom_field: shioaji.order.ConstrainedStrValue = '',
ca: str = '',
price_type: shioaji.constant.TFTStockPriceType,
order_type: shioaji.constant.TFTOrderType,
order_lot: shioaji.constant.TFTStockOrderLot = <TFTStockOrderLot.Common: 'Common'>,
order_cond: shioaji.constant.StockOrderCond = <StockOrderCond.Cash: 'Cash'>,
first_sell: shioaji.constant.StockFirstSell = <StockFirstSell.No: 'false'>,
) -> None
Order¶
Rename
TFTStockPriceType
toStockPriceType
TFTOrderType
toOrderType
TFTStockOrderLot
toStockOrderLot
first_sell
todaytrade_short
, and type changed toBool
.
Order
order = api.Order(
price=12,
quantity=1,
action=sj.constant.Action.Sell,
price_type=sj.constant.StockPriceType.LMT,
order_type=sj.constant.OrderType.ROD,
order_lot=sj.constant.StockOrderLot.Common,
daytrade_short=True,
custom_field="test",
account=api.stock_account
)
order = api.Order(
price=12,
quantity=1,
action=sj.constant.Action.Sell,
price_type=sj.constant.TFTStockPriceType.LMT,
order_type=sj.constant.TFTOrderType.ROD,
order_lot=sj.constant.TFTStockOrderLot.Common,
first_sell=sj.constant.StockFirstSell.Yes,
custom_field="test",
account=api.stock_account
)
Order Callback¶
Rename TFTOrder
to StockOrder
Order Callback
OrderState.StockOrder {
'operation': {
'op_type': 'New',
'op_code': '00',
'op_msg': ''
},
'order': {
'id': 'c21b876d',
'seqno': '429832',
'ordno': 'W2892',
'action': 'Buy',
'price': 12.0,
'quantity': 10,
'order_cond': 'Cash',
'order_lot': 'Common',
'custom_field': 'test',
'order_type': 'ROD',
'price_type': 'LMT'
},
'status': {
'id': 'c21b876d',
'exchange_ts': 1583828972,
'modified_price': 0,
'cancel_quantity': 0,
'web_id': '137'
},
'contract': {
'security_type': 'STK',
'exchange': 'TSE',
'code': '2890',
'symbol': '',
'name': '',
'currency': 'TWD'
}
}
OrderState.TFTOrder {
'operation': {
'op_type': 'New',
'op_code': '00',
'op_msg': ''
},
'order': {
'id': 'c21b876d',
'seqno': '429832',
'ordno': 'W2892',
'action': 'Buy',
'price': 12.0,
'quantity': 10,
'order_cond': 'Cash',
'order_lot': 'Common',
'custom_field': 'test',
'order_type': 'ROD',
'price_type': 'LMT'
},
'status': {
'id': 'c21b876d',
'exchange_ts': 1583828972,
'modified_price': 0,
'cancel_quantity': 0,
'web_id': '137'
},
'contract': {
'security_type': 'STK',
'exchange': 'TSE',
'code': '2890',
'symbol': '',
'name': '',
'currency': 'TWD'
}
}
Deal Callback¶
Rename TFTDeal
to StockDeal
Deal Callback
OrderState.StockDeal {
'trade_id': '12ab3456',
'exchange_seq': '123456',
'broker_id': 'your_broker_id',
'account_id': 'your_account_id',
'action': <Action.Buy: 'Buy'>,
'code': '2890',
'order_cond': <StockOrderCond.Cash: 'Cash'>,
'order_lot': <TFTStockOrderLot.Common: 'Common'>,
'price': 12,
'quantity': 10,
'web_id': '137',
'custom_field': 'test',
'ts': 1583828972
}
OrderState.TFTDeal {
'trade_id': '12ab3456',
'exchange_seq': '123456',
'broker_id': 'your_broker_id',
'account_id': 'your_account_id',
'action': <Action.Buy: 'Buy'>,
'code': '2890',
'order_cond': <StockOrderCond.Cash: 'Cash'>,
'order_lot': <TFTStockOrderLot.Common: 'Common'>,
'price': 12,
'quantity': 10,
'web_id': '137',
'custom_field': 'test',
'ts': 1583828972
}
Futures Order¶
FuturesOrder
>> sj.order.FuturesOrder?
Init signature:
sj.order.FuturesOrder(
*,
action: shioaji.constant.Action,
price: Union[pydantic.types.StrictInt, float],
quantity: shioaji.order.ConstrainedIntValue,
id: str = '',
seqno: str = '',
ordno: str = '',
account: shioaji.account.Account = None,
custom_field: shioaji.order.ConstrainedStrValue = '',
ca: str = '',
price_type: shioaji.constant.FuturesPriceType,
order_type: shioaji.constant.OrderType,
octype: shioaji.constant.FuturesOCType = <FuturesOCType.Auto: 'Auto'>,
) -> None
>> sj.order.FuturesOrder?
Init signature:
sj.order.FuturesOrder(
*,
action: shioaji.constant.Action,
price: Union[pydantic.types.StrictInt, float],
quantity: shioaji.order.ConstrainedIntValue,
id: str = '',
seqno: str = '',
ordno: str = '',
account: shioaji.account.Account = None,
custom_field: shioaji.order.ConstrainedStrValue = '',
ca: str = '',
price_type: shioaji.constant.FuturesPriceType,
order_type: shioaji.constant.FuturesOrderType,
octype: shioaji.constant.FuturesOCType = <FuturesOCType.Auto: 'Auto'>,
) -> None
Order¶
Rename FuturesOrderType
to OrderType
Order
order = api.Order(
action=sj.constant.Action.Buy,
price=100,
quantity=1,
price_type=sj.constant.FuturesPriceType.LMT,
order_type=sj.constant.OrderType.ROD,
octype=sj.constant.FuturesOCType.Auto,
account=api.futopt_account
)
order = api.Order(
action=sj.constant.Action.Buy,
price=100,
quantity=1,
price_type=sj.constant.FuturesPriceType.LMT,
order_type=sj.constant.FuturesOrderType.ROD,
octype=sj.constant.FuturesOCType.Auto,
account=api.futopt_account
)
Order Callback¶
Rename FOrder
to FuturesOrder
Order Event
OrderState.FuturesOrder {
'operation': {
'op_type': 'New',
'op_code': '00',
'op_msg': ''
},
'order': {
'id': '02c347f7',
'seqno': '956201',
'ordno': 'kY00H',
'action': 'Sell',
'price': 17760.0,
'quantity': 1,
'order_cond': None,
'order_type': 'ROD',
'price_type': 'LMT',
'market_type': 'Night',
'oc_type': 'New',
'subaccount': ''
},
'status': {
'id': '02c347f7',
'exchange_ts': 1625729890,
'modified_price': 0.0,
'cancel_quantity': 0,
"web_id": "P"
},
'contract': {
'security_type': 'FUT',
'code': 'TXF',
'exchange': 'TIM',
'delivery_month': '202107',
'strike_price': 0.0,
'option_right': 'Future'
}
}
OrderState.FOrder {
'operation': {
'op_type': 'New',
'op_code': '00',
'op_msg': ''
},
'order': {
'id': '02c347f7',
'seqno': '956201',
'ordno': 'kY00H',
'action': 'Sell',
'price': 17760.0,
'quantity': 1,
'order_cond': None,
'order_type': 'ROD',
'price_type': 'LMT',
'market_type': 'Night',
'oc_type': 'New',
'subaccount': ''
},
'status': {
'id': '02c347f7',
'exchange_ts': 1625729890,
'modified_price': 0.0,
'cancel_quantity': 0,
"web_id": "P"
},
'contract': {
'security_type': 'FUT',
'code': 'TXF',
'exchange': 'TIM',
'delivery_month': '202107',
'strike_price': 0.0,
'option_right': 'Future'
}
}
Deal Callback¶
Rename FDeal
to FuturesDeal
Deal Event
OrderState.FuturesDeal {
"trade_id":"02c347f7",
"seqno":"956344",
"ordno":"ky00N11O",
"exchange_seq":"a0000060",
"broker_id":"F002000",
"account_id":"9104000",
"action":"Sell",
"code":"TXF",
"price":17650.0,
"quantity":4,
"subaccount":"",
"security_type":"FUT",
"delivery_month":"202107",
"strike_price":0.0,
"option_right":"Future",
"market_type":"Day",
"ts":1625800369
}
OrderState.FDeal {
"trade_id":"02c347f7",
"seqno":"956344",
"ordno":"ky00N11O",
"exchange_seq":"a0000060",
"broker_id":"F002000",
"account_id":"9104000",
"action":"Sell",
"code":"TXF",
"price":17650.0,
"quantity":4,
"subaccount":"",
"security_type":"FUT",
"delivery_month":"202107",
"strike_price":0.0,
"option_right":"Future",
"market_type":"Day",
"ts":1625800369
}
Market Data¶
Warn
version >= 1.1 will no longer provide QuoteVersion.v0, please change to QuoteVersion.v1.
Callback¶
Tick¶
In: pythonic way by using decorator
from shioaji import TickSTKv1, Exchange
@api.on_tick_stk_v1()
def quote_callback(exchange: Exchange, tick:TickSTKv1):
print(f"Exchange: {exchange}, Tick: {tick}")
@api.quote.on_quote
def quote_callback(topic: str, quote: dict):
print(f"Topic: {topic}, Quote: {quote}")
In: traditional way
from shioaji import TickSTKv1, Exchange
def quote_callback(exchange: Exchange, tick:TickSTKv1):
print(f"Exchange: {exchange}, Tick: {tick}")
api.quote.set_on_tick_stk_v1_callback(quote_callback)
def quote_callback(topic: str, quote: dict):
print(f"Topic: {topic}, Quote: {quote}")
api.quote.set_quote_callback(quote_callback)
Out
Exchange: Exchange.TSE, Tick: Tick(code='2330', datetime=datetime.datetime(2021, 7, 2, 13, 16, 35, 92970), open=Decimal('590'), avg_price=Decimal('589.05'), close=Decimal('590'), high=Decimal('593'), low=Decimal('587'), amount=Decimal('590000'), total_amount=Decimal('8540101000'), volume=1, total_volume=14498, tick_type=1, chg_type=4, price_chg=Decimal('-3'), pct_chg=Decimal('-0.505902'), trade_bid_volume=6638, ask_side_total_vol=7860, bid_side_total_cnt=2694, ask_side_total_cnt=2705, closing_oddlot_shares=0, fixed_trade_vol=0, suspend=0, simtrade=0, intraday_odd=0)
Topic: MKT/*/TSE/2330, Quote: {'AmountSum': [4739351000.0], 'Close': [596.0], 'Date': '2021/03/30', 'TickType': [2], 'Time': '10:01:33.349431', 'VolSum': [7932], 'Volume': [1]}
BidAsk¶
In: pythonic way by using decorator
from shioaji import BidAskSTKv1, Exchange
@api.on_bidask_stk_v1()
def quote_callback(exchange: Exchange, bidask:BidAskSTKv1):
print(f"Exchange: {exchange}, BidAsk: {bidask}")
@api.quote.on_quote
def quote_callback(topic: str, quote: dict):
print(f"Topic: {topic}, Quote: {quote}")
In: traditional way
from shioaji import BidAskSTKv1, Exchange
def quote_callback(exchange: Exchange, bidask:BidAskSTKv1):
print(f"Exchange: {exchange}, BidAsk: {bidask}")
api.quote.set_on_bidask_stk_v1_callback(quote_callback)
def quote_callback(topic: str, quote: dict):
print(f"Topic: {topic}, Quote: {quote}")
api.quote.set_quote_callback(quote_callback)
Out
Exchange: Exchange.TSE, BidAsk: BidAsk(code='2330', datetime=datetime.datetime(2021, 7, 2, 13, 17, 29, 726428), bid_price=[Decimal('589'), Decimal('588'), Decimal('587'), Decimal('586'), Decimal('585')], bid_volume=[223, 761, 1003, 809, 1274], diff_bid_vol=[0, 0, 0, 0, 0], ask_price=[Decimal('590'), Decimal('591'), Decimal('592'), Decimal('593'), Decimal('594')], ask_volume=[304, 232, 183, 242, 131], diff_ask_vol=[1, 0, 0, 0, 0], suspend=0, simtrade=0, intraday_odd=0)
Topic: QUT/idcdmzpcr01/TSE/2330, Quote: {'AskPrice': [590.0, 591.0, 592.0, 593.0, 594.0], 'AskVolume': [303, 232, 183, 242, 131], 'BidPrice': [589.0, 588.0, 587.0, 586.0, 585.0], 'BidVolume': [224, 762, 1003, 809, 1274], 'Date': '2021/07/02', 'Time': '13:17:26.391840'}
Future Account Info.¶
Remove functions
1. get_account_margin
2. get_account_openposition
3. get_account_settle_profitloss
Instead, you should use
1. margin
2. list_positions( api.futopt_account )
3. list_profit_loss( api.futopt_account )
4. list_profit_loss_detail( api.futopt_account )
5. list_profit_loss_summary( api.futopt_account )
For more information, please refer to Account Data section.
Finally, give us support and encouragement on GITHUB