Skip to main content

非阻塞下單

首先,我們先理解阻塞與非阻塞的概念, 阻塞(Block)和非阻塞(Unblock)是用來描述事件、操作或通信方式的兩種不同方式,以下是它們的基本概念和區別:

info

非阻塞模式一般搭配主動回報進行委託單管理

info

阻塞(Block)模式亦可搭配並行(concurrency)程式設計,達到同時送出多筆指令的效果

請參考 並行(concurrency)程式設計下單範例

阻塞(Block):

阻塞操作是指事件或操作按照預定的順序進行,並且一個操作完成後,才會回覆結果。

sync

非阻塞(Unblock):

非阻塞操作是指事件或操作不必按照固定的順序進行,可以並行執行,且一個操作不需要等待另一個操作的完成。 當API server接收到您發出的Request後就直接回覆,即為非阻塞。

async

使用阻塞機制下單

委託後,回覆的Order Response即會帶回完整的資料內容。

#建立委託單內容
order = Order(
buy_sell = BSAction.Buy,
symbol = "2881",
price = "66",
quantity = 2000,
market_type = MarketType.Common,
price_type = PriceType.Limit,
time_in_force = TimeInForce.ROD,
order_type = OrderType.Stock,
user_def = "From_Py" # optional field
)

sdk.stock.place_order(accounts.data[0], order) #下單委託

#或採用
#sdk.stock.place_order(accounts.data[0], order, False)

使用非阻塞機制下單

委託後,回覆的Order Response可能會少帶出委託書號···等資訊。

#建立委託單內容
order = Order(
buy_sell = BSAction.Buy,
symbol = "2881",
price = "66",
quantity = 2000,
market_type = MarketType.Common,
price_type = PriceType.Limit,
time_in_force = TimeInForce.ROD,
order_type = OrderType.Stock,
user_def = "From_Py" # optional field
)

sdk.stock.place_order(accounts.data[0], order, True) #下單委託

以下為支援非阻塞委託的函數

  • PlaceOrder - 下單委託
  • ModifyPrice - 修改委託價格
  • ModifyQuantity - 修改委託數量
  • CancelOrder - 取消委託

並行(concurrency)程式設計下單範例

import concurrent.futures

#Create Order Object
order = Order(
buy_sell = BSAction.Buy,
symbol = "2881",
price = "66",
quantity = 2000,
market_type = MarketType.Common,
price_type = PriceType.Limit,
time_in_force = TimeInForce.ROD,
order_type = OrderType.Stock,
user_def = "From_Py" # optional
)

# 下單

def my_place_order():
sdk.stock.place_order(accounts.data[0], order) #Place Order

with concurrent.futures.ThreadPoolExecutor() as executor:
# Submit 20 tasks
futures = [executor.submit(my_place_order) for _ in range(20)]

# Wait for all tasks to complete
concurrent.futures.wait(futures)