手續費與訂單執行

市價單成交價比看到的差、限價單掛著不動:滑價與部分成交怎麼算進損益

同一筆 10,000 USDT 的市價單,在 BTC 永續上滑價是 0,在流動性差的合約上要吃掉 12 個價位、多付 28 USDT。本文用 OKX 公開盤口快照拆解價差、滑價與手續費,並說明部分成交與 GTC/IOC/FOK/Post Only 的關係。

市價單成交價比看到的差、限價單掛著不動:滑價與部分成交怎麼算進損益

下單時看到的價格是 83,369.5,成交回報卻是另一個數字;或者限價單掛在那裡,價格明明碰到了卻只成交一部分。這兩件事都不是交易所出錯,而是訂單在盤口裡實際發生的事:市價單要一檔一檔往上吃,限價單要排隊等對手方。把這兩項算清楚,才知道一筆交易真正的成本。

一筆交易的三項成本要分開看

  • 買賣價差(spread):買一與賣一之間的距離。你用市價單進場時,等於直接付掉這段距離。
  • 滑價(slippage):下單量超過最靠近的那一檔掛單量時,剩下的部分要在更差的價位成交,成交均價因此偏離你看到的價格。
  • 手續費:按成交金額收取,Maker 與 Taker 不同,進場與出場各收一次。

三者的大小順序不固定。流動性好的合約,手續費是主要成本;流動性差的合約,滑價可以輕易超過手續費好幾倍。

滑價大小由盤口決定,不是由你的膽量決定

下面這組數字取自 OKX 公開行情接口的單次盤口快照(2026-10-14 10:20 UTC),分別計算在 BTC-USDT 永續與 GRT-USDT 永續上,用市價單買入 500、2,000、10,000 USDT 時的成交均價相對賣一價的偏離。

長條圖:同一組市價單金額在 BTC-USDT 永續與 GRT-USDT 永續上的滑價對比,BTC 三種金額皆為 0.00 bps,GRT 分別為 7.65、15.32、28.24 bps

快照當時,BTC-USDT 永續的賣一價是 83,369.5,光是這一檔的掛單就能承接約 814,879 USDT,買一與賣一只差 0.1 USDT(約 0.01 bps)。所以 500、2,000、10,000 USDT 三種金額都在第一檔成交完畢,滑價是 0。

GRT-USDT 永續同一時刻的賣一價是 0.02586,但這一檔只有約 86 USDT 的掛單,買賣價差本身就有 7.74 bps。結果是:

  • 500 USDT 吃掉 5 個價位,成交均價 0.025879788,偏離 7.65 bps,多付約 0.38 USDT。
  • 2,000 USDT 吃掉 6 個價位,偏離 15.32 bps,多付約 3.06 USDT。
  • 10,000 USDT 吃掉 12 個價位,偏離 28.24 bps,多付約 28.24 USDT。

把這個數字和手續費放在一起才看得出份量。假設 Taker 費率是 0.05%(5 bps,請以自己帳戶當下的等級為準),10,000 USDT 的單邊手續費是 5 USDT。在 BTC 上滑價是 0,成本幾乎全是手續費;在 GRT 上,光是進場的滑價就是手續費的五倍以上。同一套停損距離,換一個流動性差的合約,實際虧損會比試算表算出來的大一截——這正是倉位大小計算器該有哪些輸入裡那一欄「滑價假設」該填的東西。

要注意兩點:這是買方(吃賣單)的計算,賣出時面對的是另一側盤口,數字要另外量;而且這只是一次快照,波動放大時掛單會瞬間變薄,同樣金額的滑價會比平靜時更大。

自己量一次,比憑感覺估準

盤口是公開資料,不必等被成交了才知道。以 OKX 的公開接口為例,任何人都可以直接取一份深度:

curl "https://www.okx.com/api/v5/market/books?instId=GRT-USDT-SWAP&sz=20"

回傳的 asks 是賣方掛單,每一列的格式是 [價格, 數量(張), 0, 掛單筆數]。把每一檔的「價格 × 張數 × 每張合約面值」累加,直到金額達到你打算下的名義金額,用累計金額除以累計幣數就是預估成交均價。GRT-USDT 永續每張合約是 10 GRT,BTC-USDT 永續每張是 0.01 BTC,面值可以在同一個接口的 instruments 查到。

真正該養成的習慣是:下單前看一眼賣一(或買一)那一檔能承接多少錢。如果你的單比它大一個量級,滑價就不是四捨五入誤差了。

部分成交不是故障,是訂單還沒排到

限價單送出去後,它的狀態未必是「成交」或「取消」。按 Binance 期貨 API 的公開列舉定義,訂單狀態包含 NEW、PARTIALLY_FILLED、FILLED、CANCELED、REJECTED、EXPIRED 等;PARTIALLY_FILLED 就是部分成交,剩下的數量還留在盤口上等。

Binance 期貨 API 官方文件頁面,列出 Order types、Order side、Position side 與 Time in force 的列舉值,包含 GTC、IOC、FOK、GTX(Post Only)、GTD

同一份文件也列出了訂單有效期(timeInForce)的選項,這個設定直接決定部分成交之後會發生什麼事:

  • GTC(Good Till Cancel):沒成交的部分一直掛著,直到你撤單。文件註明有效期為下單起一年。
  • IOC(Immediate or Cancel):能立刻成交多少算多少,剩下的立刻取消。適合不想留殘單在盤口上的情況。
  • FOK(Fill or Kill):不能一次全部成交就整張取消,不會出現部分成交。
  • GTX(Good Till Crossing,即 Post Only):只以掛單方(Maker)身分進入盤口,一旦會立即與現有掛單撮合就直接被拒絕。這是用來確保拿到 Maker 費率的選項,代價是訂單可能根本沒進場。

所以「限價單掛著不動」通常是三種情況之一:價格根本沒走到你的價位;價格碰到了,但同一價位上排在你前面的單子把對手方的量吃完了(撮合是價格優先、時間優先);或者你勾了 Post Only,訂單在送出的瞬間就被拒絕了。

部分成交還有一個容易被忽略的後果:你的實際倉位比計畫小,但停損價位通常是按原本的倉位算的。倉位只進了一半,每點價格變動的損益也只有一半,原本設定的最大虧損金額需要重算;若之後再補單,平均開倉價也變了。

把三項成本放回同一筆交易

假設你在流動性較差的合約上用市價單進場 10,000 USDT,用上面 GRT 的快照數字:

  • 進場滑價:28.24 USDT
  • 進場 Taker 手續費(假設 0.05%):5 USDT
  • 出場手續費(假設同樣是 Taker):5 USDT
  • 出場滑價:要用當時賣方盤口另行估算,不能直接沿用進場的數字

光是可先估出的三項就接近 38 USDT。換算成價格,標的要先往你的方向走約 38 bps,這筆交易才回到零。盈虧平衡價該怎麼把費用折回價格,可以對照手續費後的真正盈虧平衡價的算法,把滑價當成額外的一段價格成本加進去即可。

降低這部分成本的辦法不多,但都很具體:用限價單並接受可能不成交、把大單拆成幾筆、避開流動性最差的時段、在流動性充足的合約上交易。要注意的是,停損單被觸發後多半以市價方式尋找成交,它承受的就是當下那一刻的盤口——而那一刻往往正是掛單最薄的時候。停損的觸發與成交是兩回事,這一點在止損被插針掃掉還是完全沒觸發裡有更完整的拆解。

下單前的四個檢查

  1. 買一與賣一差多少?價差本身就是你用市價單要付的第一筆錢。
  2. 最靠近的那一檔能承接多少金額?你的單有沒有大過它。
  3. 用的是哪種有效期設定?部分成交之後剩下的量要留著還是取消。
  4. 如果只成交了一半,你的停損金額和倉位計畫要不要跟著改。

本文的盤口數字取自 OKX 公開行情接口在 2026-10-14 10:20 UTC 的單次快照,僅供覆算示範;不同時點、不同交易所與不同合約的結果都不一樣。手續費率依帳戶等級而定,請以交易所當下畫面為準。所有計算均為教育性估算,不構成交易建議。