交易
這篇教學將示範如何於盤中進行一個完整的買賣交易流程。
買入股票
假設今天股市開盤後,我們決定立刻以 28.00 元購買兩張玉山金,我們可以這樣撰寫程式並執行:
- Python
- Node.js
from configparser import ConfigParser
from fugle_trade.sdk import SDK
from fugle_trade.order import OrderObject
from fugle_trade.constant import (APCode, Trade, PriceFlag, BSFlag, Action)
config = ConfigParser()
config.read('./config.ini')
sdk = SDK(config)
sdk.login()
# 為求說明簡潔,以上讀取設定及登入的程式碼,在下文範例程式碼中將略過不寫
order = OrderObject(
buy_sell = Action.Buy,
price = 28.00,
stock_no = "2884",
quantity = 2,
ap_code = APCode.Common
)
sdk.place_order(order)
info
不同 ap_code 對應的 quantity 之單位及範圍不同,請參考 Reference 說明
import { FugleTrade, Order } from '@fugle/trade';
const fugle = new FugleTrade({
configPath: '/path/to/config.ini',
});
// 登入
await fugle.login();
// 建立委託物件
const order = new Order({
buySell: Order.Side.Buy,
price: 28.00,
stockNo: '2884',
quantity: 2,
apCode: Order.ApCode.Common,
priceFlag: Order.PriceFlag.Limit,
bsFlag: Order.BsFlag.ROD,
trade: Order.Trade.Cash,
});
// 送出委託
await fugle.placeOrder(order);
確認委託及成交狀態
我們可以每隔一段時間,查詢委託的狀態:
- Python
- Node.js
orderResults = sdk.get_order_results()
print(orderResults)
const orders = await fugle.getOrders();
console.log(orders);
根據回傳的結果,我們可以判斷該筆委託有沒有成交、成交了多少數量:
- Python
- Node.js
[
{
...
"avg_price": 0.0, // 成交均價 (number)
"buy_sell": "B", // 買賣別 (Action enum)
"mat_qty": 0, // 已成交數量(張) (number)
"od_price": 28.00, // 委託價格 (number)
"ord_date": "20220310", // 原始委託日期 (string)
"ord_time": "094932438", // 原始委託時間 (string)
"stock_no": "2884", // 股票代號 (string)
...
},
...
]
[
{
...
"avgPrice": 0, // 成交均價 (number)
"buySell": "B", // 買賣別 (Action enum)
"matQty": 0, // 已成交數量(張) (number)
"odPrice": 28.00, // 委託價格 (number)
"ordDate": "20220310", // 原始委託日期 (string)
"ordTime": "094932438", // 原始委託時間 (string)
"stockNo": "2884", // 股票代號 (string)
...
},
...
]
info
委託明細會回傳當日所有委託的狀態,您可以使用序號或是其他方式辨別不同的委託單。更詳細的回傳值欄位說明請參考 SDK Reference。
修改委託價格
因為委託一直沒有成交,我們決定修改委託的價格,改成用 29.95 元的價格買入:
- Python
- Node.js
orderResults = sdk.get_order_results()
sdk.modify_price(orderResults[0], 29.95)
const [ order, ...orders ] = await fugle.getOrders();
await fugle.replacePrice(order, 29.95);
幾分鐘後我們再查詢一次委託狀態,發現成交了:
- Python
- Node.js
orderResults = sdk.get_order_results()
print(orderResults)
[
{
...
"avg_price": 29.90, // 成交均價 (number)
"buy_sell": "B", // 買賣別 (Action enum)
"mat_qty": 2, // 已成交數量(張) (number)
"od_price": 29.95, // 委託價格 (number)
"ord_date": "20220310", // 原始委託日期 (string)
"ord_time": "094932438", // 原始委託時間 (string)
"stock_no": "2884", // 股票代號 (string)
...
},
...
]
const orders = await fugle.getOrders();
console.log(orders);
[
{
...
"avgPrice": 29.90, // 成交均價 (number)
"buySell": "B", // 買 賣別 (Action enum)
"matQty": 2, // 已成交數量(張) (number)
"odPrice": 29.95, // 委託價格 (number)
"ordDate": "20220310", // 原始委託日期 (string)
"ordTime": "094932438", // 原始委託時間 (string)
"stockNo": "2884", // 股票代號 (string)
...
},
...
]
賣出股票
最後我們決定在收盤前賣出其中一張玉山金:
- Python
- Node.js
order = OrderObject(
buy_sell = Action.Sell,
price = 31.10,
stock_no = "2884",
quantity = 1,
ap_code = APCode.Common,
trade = Trade.DayTradingSell # 當沖賣出
)
sdk.place_order(order)
const order = new Order({
buySell: Order.Side.Sell,
price: 31.10,
stockNo: '2884',
quantity: 1,
apCode: Order.ApCode.Common,
priceFlag: Order.PriceFlag.Limit,
bsFlag: Order.BsFlag.ROD,
trade: Order.TradeType.DayTradingSell,
});
await fugle.placeOrder(order);
caution
若要於盤中進行當沖交易,您必須具備當沖權限,請參考此處說明。
您可以到實例應用參考更多結合策略的範例程式碼。