Skip to content

【模擬環境異常】微型臺指期貨 MKP/IOC 委託的 FDEAL 成交價超出當時行情高低範圍 #211

Description

@voarlese

[模擬環境] 期貨 2 口 MKP/IOC 的 FDEAL 成交價超出當下行情高低範圍

主要問題

在 Shioaji 模擬環境送出微型臺指期貨 2 口市價範圍單(MKP + IOC)時,兩筆委託收到的 FDEAL 成交價都高於當時該根 K 棒的最高價,而且差距明顯。

TradingView 使用 TMF1!,當時對應 TMFQ2026;Shioaji 下單合約為 TMFH6(delivery month 202608),兩邊都是 2026 年 8 月的微型臺指期貨。

臺北時間 方向/用途 當時 K 棒高低 FDEAL 回傳成交價 與最高價的差距
2026-07-16 13:35:39~13:35:40 Sell 2,出場 高 45854/低 45644 45902、45965 +48、+111 點
2026-07-16 13:40:07~13:40:08 Buy 2,進場 高 45755/低 45672 45945、45924 +190、+169 點

想請協助確認:

  1. 模擬環境的期貨撮合價格是否可能與當時行情脫鉤?
  2. FDEAL callback 的 price 欄位,在 2 口 MKP + IOC 委託時是否可能解析錯誤?
  3. 這是否為 Shioaji 1.5.5 已知問題,或有建議升級的版本?

執行環境

  • Shioaji:1.5.5
  • Python:3.12
  • 作業系統:Ubuntu Linux(VPS)
  • API:sj.Shioaji(simulation=True)
  • 時區:Asia/Taipei
  • 合約:TMFH6,delivery month 202608

異常資料一:13:35 出場委託

當時該根 K 棒:

  • 最高價:45854
  • 最低價:45644

![2026-07-16 13:35 出場時的 1 分 K]Image

委託資料:

  • seqno / id101E92
  • ordno001EA1
  • actionSell
  • quantity:2
  • price:0
  • price_typeMKP
  • order_typeIOC
  • octypeCover

收到兩筆 FDEAL

callback 時間(Asia/Taipei) exchange_seq quantity price
2026-07-16 13:35:39.728595 000001 1 45902
2026-07-16 13:35:40.339097 000002 1 45965

原始 callback 重要欄位(帳號資料已遮蔽):

FORDER
{
  "id": "101E92",
  "seqno": "101E92",
  "ordno": "001EA1",
  "action": "Sell",
  "price": 0.0,
  "quantity": 2,
  "order_type": "IOC",
  "price_type": "MKP",
  "market_type": "Day",
  "oc_type": "Cover",
  "contract": {
    "exchange": "TAIFEX",
    "code": "TMFH6"
  },
  "status": {
    "exchange_ts": 1784180139.528527
  }
}

FDEAL
{
  "trade_id": "101E92",
  "seqno": "101E92",
  "ordno": "001EA1",
  "exchange_seq": "000001",
  "action": "Sell",
  "code": "TMFH6",
  "price": 45902.0,
  "quantity": 1,
  "ts": 1784180139.728595
}

FDEAL
{
  "trade_id": "101E92",
  "seqno": "101E92",
  "ordno": "001EA1",
  "exchange_seq": "000002",
  "action": "Sell",
  "code": "TMFH6",
  "price": 45965.0,
  "quantity": 1,
  "ts": 1784180140.339097
}

異常資料二:13:40 進場委託

當時該根 K 棒:

  • 最高價:45755
  • 最低價:45672

![2026-07-16 13:40 進場時的 1 分 K]Image

委託資料:

  • seqno / id101EB0
  • ordno001EBF
  • actionBuy
  • quantity:2
  • price:0
  • price_typeMKP
  • order_typeIOC
  • octypeAuto

收到兩筆 FDEAL

callback 時間(Asia/Taipei) exchange_seq quantity price
2026-07-16 13:40:07.414121 000001 1 45945
2026-07-16 13:40:08.071163 000002 1 45924

原始 callback 重要欄位(帳號資料已遮蔽):

FORDER
{
  "id": "101EB0",
  "seqno": "101EB0",
  "ordno": "001EBF",
  "action": "Buy",
  "price": 0.0,
  "quantity": 2,
  "order_type": "IOC",
  "price_type": "MKP",
  "market_type": "Day",
  "oc_type": "Auto",
  "contract": {
    "exchange": "TAIFEX",
    "code": "TMFH6"
  },
  "status": {
    "exchange_ts": 1784180401.053725
  }
}

FDEAL
{
  "trade_id": "101EB0",
  "seqno": "101EB0",
  "ordno": "001EBF",
  "exchange_seq": "000001",
  "action": "Buy",
  "code": "TMFH6",
  "price": 45945.0,
  "quantity": 1,
  "ts": 1784180407.414121
}

FDEAL
{
  "trade_id": "101EB0",
  "seqno": "101EB0",
  "ordno": "001EBF",
  "exchange_seq": "000002",
  "action": "Buy",
  "code": "TMFH6",
  "price": 45924.0,
  "quantity": 1,
  "ts": 1784180408.071163
}

預期結果

FDEAL callback 回傳的成交價應能對應當時同一合約的合理市場價格;若模擬環境採用不同的撮合規則,也希望能確認價格來源與規則。

下單與 callback 程式碼

以下是實際使用的 callback 設定方式與兩筆委託的建立方式。API key、secret key 與期貨帳號均已省略。

import shioaji as sj

api = sj.Shioaji(simulation=True)
api.login(
    api_key=API_KEY,
    secret_key=SECRET_KEY,
    subscribe_trade=True,
)

account = SELECTED_FUTURES_ACCOUNT
contract = api.Contracts.Futures["TMFH6"]


def order_callback(stat, msg):
    print(stat, msg)


api.set_order_callback(order_callback)

# 2026-07-16 13:35 的出場委託
exit_order = sj.FuturesOrder(
    price=0,
    quantity=2,
    action=sj.Action.Sell,
    price_type=sj.FuturesPriceType.MKP,
    order_type=sj.OrderType.IOC,
    octype=sj.FuturesOCType.Cover,
    account=account,
)
api.place_order(contract, exit_order)

# 2026-07-16 13:40 的進場委託
entry_order = sj.FuturesOrder(
    price=0,
    quantity=2,
    action=sj.Action.Buy,
    price_type=sj.FuturesPriceType.MKP,
    order_type=sj.OrderType.IOC,
    octype=sj.FuturesOCType.Auto,
    account=account,
)
api.place_order(contract, entry_order)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions