升版指南
1.0 為主要版本,本文檔幫助用戶遷移到版本 1.0 。
Shioaji 物件¶
移除參數 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
登入¶
登入參數person_id
及 passwd
變更為 api_key
及 secret_key
。
您可以在 Token 深入了解如何取得 API Key。
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='')
]
證券下單¶
TFTStockOrder
更改為 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
下單¶
TFTStockPriceType
更改為StockPriceType
TFTOrderType
更改為OrderType
TFTStockOrderLot
更改為StockOrderLot
first_sell
更改為daytrade_short
,型態更改為Bool
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
)
委託回報¶
TFTOrder
更改為 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'
}
}
成交回報¶
TFTDeal
更改為 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
}
期貨下單¶
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
下單¶
FuturesOrderType
更改為 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
)
委託回報¶
FOrder
更改為 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'
}
}
成交回報¶
FDeal
更改為 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
}
行情資料¶
注意
版本>=1.1將不再提供QuoteVersion.v0,請更改至QuoteVersion.v1。
Callback¶
Tick¶
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}")
傳統方式
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¶
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}")
傳統方式
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'}
期貨帳務資訊¶
移除以下API
1. get_account_margin
2. get_account_openposition
3. get_account_settle_profitloss
取而代之
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 )
欲瞭解更多期貨帳務API,請參見。
最後在GITHUB上給我們支持與鼓勵吧