Skip to article frontmatterSkip to article content

交易所订单执行策略(TIF)与撮合约束备忘清单(ccxt / Freqtrade 实战版)

面向量化/程序化交易的快速参考。涵盖常见 TIF(Time-in-Force,有效期/执行时机)撮合/风控约束,并附 ccxt / Freqtrade 的参数示例与踩坑提示。


1) 核心概念与对比

1.1 经典四项(最常见)

名称含义是否允许部分成交是否要求立即成交仅做挂单(Maker)
GTC(Good-Till-Canceled)订单一直有效,直到完全成交或被你撤单
IOC(Immediate-Or-Cancel)立刻成交能成交的部分,余量立刻取消
FOK(Fill-Or-Kill)要么立刻 100% 成交,要么整笔取消
PO(Post-Only)只能作为挂单进入订单簿;若会立刻成交则拒/撤

注:PO严格说是“撮合约束”而不是 TIF,但平台常与 TIF 一并提供,故列入经典四项。

1.2 其他常见 TIF

名称含义常见平台/备注
GTX(Good-Till-Crossing)本质等同 Post-Only 的 TIF 表达:若会立刻与对手单成交(cross)则拒/撤常见于部分期货/合约平台
GTT / GTD(Good-Til-Time/Date)有效至指定时间点/日期常见于部分交易所的高级/条件单
DAY / Good-for-Day仅当日/当交易时段有效传统证券市场常见,部分加密衍生/法币经纪也支持

2) 常与 TIF 搭配的撮合/风控约束

约束作用典型使用场景
Post-Only(PO)只允许作为 Maker 进入簿;会立即成交则拒单赚 maker 费率/做被动成交
Reduce-Only该单只能减少仓位,不会开新仓止盈/止损、网格收口
Close-On-Trigger / closePosition触发后一键平掉该方向全部持仓合约止损/风控强平场景
Iceberg / Hidden冰山/隐藏单:只展示一小部分,实际大单分片执行大额下单控冲击成本(通常需配合 GTC)
STP(自成交防护)避免同账户挂单互相成交(不同模式)多策略/多端共用账户

3) 选择策略(如何用得对)


4) 行为示例(更直观)

设卖一=60,000,卖二=60,100;你挂限价买 60,050 / 2 BTC


5) ccxt 参数速查(Python)

# GTC(多数默认)
ex.create_order('BTC/USDT', 'limit', 'buy', 0.5, 60000, {'timeInForce': 'GTC'})

# IOC / FOK
ex.create_order('BTC/USDT', 'limit', 'buy', 0.5, 60000, {'timeInForce': 'IOC'})
ex.create_order('BTC/USDT', 'limit', 'buy', 0.5, 60000, {'timeInForce': 'FOK'})

# Post-Only:两种常见写法(按交易所不同二选一)
ex.create_order('BTC/USDT', 'limit', 'buy', 0.5, 59950, {'postOnly': True})
ex.create_order('BTC/USDT', 'limit_maker', 'buy', 0.5, 59950)  # 某些所用专门类型

# GTX(部分合约所,把 PO 表达为 TIF)
ex.create_order('BTC/USDT:USDT', 'limit', 'buy', 0.5, 59950, {'timeInForce': 'GTX'})

# GTT/GTD(到期时间;字段名依交易所而定)
ex.create_order('BTC/USDT', 'limit', 'buy', 0.5, 60000, {
    'timeInForce': 'GTD',
    'expireTime': '2025-09-30T12:00:00Z'  # 示例字段
})

# Reduce-Only / Close-Position(合约)
ex.create_order('BTC/USDT:USDT', 'limit', 'sell', 0.5, 60500, {'reduceOnly': True})
ex.create_order('BTC/USDT:USDT', 'stop_market', 'sell', 0.0, None, {'closePosition': True, 'stopPrice': 59000})

# Iceberg / Hidden(依所支持)
ex.create_order('BTC/USDT', 'limit', 'buy', 5.0, 60000, {'icebergQty': '0.5', 'timeInForce': 'GTC'})

提示:不同交易所字段名/可选值不完全一致(如 limit_makerexpireTimeicebergQty 等),以目标交易所 API 为准。


6) Freqtrade 配置与策略要点

全局 TIF(配置文件)

{
  "order_time_in_force": {
    "buy": "gtc",
    "sell": "gtc"
  }
}

策略里精细控制(传递到 ccxt 的 params)

# 例:策略下单时为买单使用 IOC,为卖单使用 PO
order = self.buy(price=price, amount=amount, time_in_force='ioc')  # 或在 order() 的 params 中附加
# 对应 Post-Only
params = {'postOnly': True}
order = self.sell(price=target, amount=amount, params=params)

实战建议


7) 常见坑位与排查

  1. PO 下不去:价格“穿”对手盘 → 会立即成交 → 被拒/撤;把价格挂到簿外侧。
  2. FOK 总被取消:一次性吃不满目标数量;先检查盘口深度或改用 IOC。
  3. GTT/GTD 无效:未按交易所要求提供到期字段/格式。
  4. Iceberg 报错:不少平台要求 配合 GTC;且有最小分片/最小显示量限制。
  5. 字段名差异postOnly/limit_makerclosePosition/close_on_trigger… 落地前查看目标交易所文档。

8) 速记卡(TL;DR)