IOC 与 FOK、市价单与限价单:外汇算法执行的订单类型 5 11 月, 2026 – Posted in: 外汇交易, 套利软件
BJF TRADING GROUP · 外汇执行
IOC、FOK、市价还是限价:选择与交易相匹配的订单
选择订单类型,其实是在决定您宁愿承受什么:更差的价格、更小的成交量,还是完全不成交。本指南展示每种指令在订单簿中、在 FIX 消息中以及在 Last Look 之下的表现,并为必须在毫秒内作出选择的算法提供具体的计算示例。
简短回答:IOC 与 FOK。立即成交否则取消(IOC)订单会以您的价格或更优价格吃下当前可得的全部流动性,并取消其余部分,因此可能部分成交。全部成交否则取消(FOK)订单必须立即全部成交,否则整笔取消,因此您要么得到全部,要么什么也得不到。当任何一部分数量都有用时使用 IOC;当部分头寸比没有头寸更糟时使用 FOK。
本指南内容
订单类型和有效期是两个独立的决定
大多数术语表把市价、限价、止损、IOC 和 FOK 列在一起,仿佛它们是同一菜单上的五个选项。事实并非如此。它们背后是两个相互独立的问题,算法必须为每一笔订单回答这两个问题:
- 我愿意接受什么价格?这就是订单类型:市价(任意价格)、限价(此价格或更优)、止损(触发价成交或被报出时激活)。
- 订单可以存活多久?这就是有效期(time in force,TIF):立即(IOC、FOK)、到交易时段结束(Day)、到取消为止(GTC)或到指定时间(GTD)。
因此,IOC 和 FOK 并不是限价单的替代品,而是附加在限价单上的存活期。“Limit IOC”和“Limit FOK”是算法外汇交易中最常见的两种主动指令,FIX 协议也把这两个决定放在不同的字段中:OrdType(标签 40)和 TimeInForce(标签 59)。
外汇中的市价单:“按市价”究竟是什么意思
市价单的意思是:现在就给我成交,价格是次要的。它没有限价,因此执行确定性最高,但对成交价格毫无保护。如果订单簿已经变动或流动性稀薄,订单会逐级向上吃掉可用档位,直到数量成交完毕。这一成本就是滑点,我们在如何测量并降低外汇滑点指南中有深入讲解。
外汇市场还有两个细节,是基于交易所的讲解通常会略过的:
- 不存在单一的中央订单簿。您的经纪商或 ECN 显示的是来自多家流动性提供商的聚合数据流。“按市价”是指您的交易场所能从该数据流中获得的最佳价格,而不是某个全球统一的市场价格。
- 市价单仍有隐含的存活期。许多交易场所在内部把市价单当作 IOC 或 FOK 处理:现在能成交多少就成交多少,并报告其余部分。有些场所允许您添加最大偏差,这实际上把订单变成了限价单。不要凭假设行事,请阅读交易场所的规范。
市价单在算法中的实际作用范围很窄。它适用于不交易才是更大危险的场合,例如平掉已失去对冲的头寸。
限价单、可成交限价单和止损单
被动限价单
挂在远离当前价格处的限价单会留在订单簿中等待。低于卖价的买入限价单不是消耗流动性,而是提供流动性。您可能赚取点差而不是支付点差,但要承担排队风险和逆向选择:被动订单往往恰恰在市场穿过它们时才成交。被动订单通常与 Day、GTC 或 GTD 搭配使用。
可成交限价单
定价等于或高于当前卖价的买入限价单会像市价单一样立即执行,但不会以超出限价的价格成交。这种“可成交限价单”是自动化执行的主力。与 IOC 结合时,它的含义是:现在就吃掉流动性,最差到这个价格,并且不在订单簿中留下任何挂单。
价格改善这一点经常被误解。限价是可接受的最差价格,而不是成交价格。如果您以 1.08510 的限价买入,而卖价是 1.08502,您应当以 1.08502 或之后直到限价的各档价格成交。
止损单和止损限价单
止损单在到达触发价之前处于休眠状态,之后变成市价单;止损限价单则变成限价单。前者保证激活,但不保证价格;后者限定了价格,却可能恰恰在市场跳空时无法成交,这对保护性止损来说是一个令人不快的特性。止损存放在哪里也很重要:保存在交易场所的止损在您断线后依然有效,而在您自己软件中模拟的止损则不然。
有效期:完整列表
| 指令 | FIX 59 | 存活期 | 可部分成交? | 典型用途 |
|---|---|---|---|---|
| Day | 0 | 到交易时段结束 | 是 | 特定时段内的被动报价 |
| GTC (Good Till Cancel) | 1 | 到取消为止 | 是 | 挂单入场、止盈和止损订单 |
| IOC (Immediate or Cancel) | 3 | 立即执行,其余取消 | 是 | 任何部分数量都有用时吃单 |
| FOK (Fill or Kill) | 4 | 立即全部成交,否则不成交 | 否 | 全有或全无的入场和固定数量的交易腿 |
| GTD (Good Till Date) | 6 | 到指定时间(标签 126 或 432) | 是 | 有硬性到期时间的报价,例如新闻发布之前 |
数值来自 FIX 4.4 规范。交易场所通常只支持列表中的一部分,有些还把某个 TIF 限定于特定订单类型,因此您的经纪商的交易规则优先于文章中的任何表格。
IOC、FOK 与市价单:同一订单簿,三种结果
来看一个具体案例。算法要买入 2,000,000 EURUSD。最优卖价为 1.08500,订单到达时可见的卖盘如下:
| 卖价 | 可用数量 | 累计 |
|---|---|---|
| 1.08500 | 500,000 | 500,000 |
| 1.08501 | 500,000 | 1,000,000 |
| 1.08503 | 1,000,000 | 2,000,000 |
| 1.08506 | 2,000,000 | 4,000,000 |

| 指令 | 成交量 | 平均价格 | 相对最优卖价的成本 | 结果 |
|---|---|---|---|---|
| 市价,2M | 2,000,000 | 1.085018 | 0.175 点,约 $35 | 完成,但价格不是您选择的 |
| 限价 1.08502 IOC,2M | 1,000,000 | 1.085005 | 0.05 点,约 $5 | 成交一半数量,1M 被取消 |
| 限价 1.08502 FOK,2M | 0 | 无 | $0 | 被取消:在限价或更优价位只有 1M |
| 限价 1.08503 FOK,2M | 2,000,000 | 1.085018 | 0.175 点,约 $35 | 成交:限价足够宽 |
最后一行最为微妙。多出的 0.1 点让 FOK 从没有交易变成全部成交,而且平均价格优于其限价。FOK 并不意味着“紧”,它意味着“全部数量必须在此刻落在这个价格之内”。限价相同的 IOC 和 FOK 看到的是相同的流动性,区别只在于流动性不足时各自如何处理。
也不存在普遍更便宜的指令。与 $35 的市价单相比,$5 的 IOC 看起来很划算,但它只完成了一半头寸。如果剩下的 1M 不得不稍后以更差的价格买入,比较结果就会改变。缺失数量的这种成本,正是本指南后续内容要讨论的。
订单在 FIX 中的样子
在 FIX API 连接上,您需要在 NewOrderSingle 消息(35=D)中明确说明每条指令。简化到关键字段后,示例中的 IOC 订单如下:
把 59=3 改为 59=4,同一订单就变成 FOK。去掉价格并设置 40=1,它就是市价单。这里省略了消息头、校验和、时间戳和账户字段;品种格式因交易场所而异,有些使用数字品种 ID。
| 标签 | 字段 | 常见取值 |
|---|---|---|
| 40 | OrdType | 1 Market(市价)、2 Limit(限价)、3 Stop(止损)、4 Stop-limit(止损限价)、D Previously quoted(先前已报价) |
| 59 | TimeInForce | 0 Day、1 GTC、3 IOC、4 FOK、6 GTD |
| 110 | MinQty | 必须执行的最小数量(在支持时) |
| 150 | ExecType | 0 New(新建)、F Trade(成交)、4 Canceled(已取消)、8 Rejected(已拒绝)、C Expired(已过期) |
| 39 | OrdStatus | 0 New(新建)、1 Partially filled(部分成交)、2 Filled(全部成交)、4 Canceled(已取消)、8 Rejected(已拒绝)、C Expired(已过期) |
| 14 / 151 | CumQty / LeavesQty | 已成交 / 仍未结。LeavesQty 为 0 表示订单已结束 |
| 31 / 32 / 6 | LastPx / LastQty / AvgPx | 本次成交的价格和数量 / 所有成交的平均价 |
棘手之处不在于发送订单,而在于读懂回复。一笔 IOC 可能产生一连串 ExecutionReport(35=8),而剩余部分如何报告则取决于交易场所。

有些交易场所在成交之前会额外发送一条确认(150=0),另一些则只发送一条聚合成交回报。FIX 4.2 会话表示成交的 ExecType 值(1 和 2)与 FIX 4.3 及更高版本(F)不同。因此,健壮的处理程序应以 CumQty、LeavesQty 和 OrdStatus 为依据,而不是依赖固定的消息数量。FIX 协议详解介绍了这些消息之下的会话层。
全额流动性与 Last Look:外汇为何与众不同
面向股票市场的讲解都假定存在中央限价订单簿,其中显示的报价是确定的。外汇交易场所可能在两个方面有所不同,而这两点都会直接影响 IOC 和 FOK。
可扫单流动性与全额流动性。在可扫单订单簿中,一笔订单可以像上面的示例那样,吃掉多家提供商的多个档位。在全额定价中,提供商为全部数量报出一个价格,各档位不能累加,因此 2M 的 FOK 应当与 2M 档位匹配,而不是与 1M 报价的总和匹配。所以,看起来相同的深度显示可能代表不同的含义。
Last Look。当提供商采用 Last Look 时,您的订单只是一个请求,提供商在短暂持有后仍可能拒绝。即使您发送时订单簿显示的数量足够,FOK 也可能被拒绝,IOC 的回报数量也可能小于显示数量。《全球外汇准则》(FX Global Code)要求采用 Last Look 的提供商向客户披露这一做法,因此请索取该披露信息。只有您记录下来,Last Look 造成的拒单才会出现在您的日志中。相关机制在我们的经纪商执行、A-book、B-book 与 Last Look 指南中有详细介绍。
限价设在哪里:一个计算模型
对 IOC 或 FOK 来说,关键参数不是 TIF,而是限价。把它设在当前报价上,大多数信号都会错过;不设限制,最差的成交又会吃掉优势。在这两个极端之间,存在一个可以计算的答案。
考虑一个短暂的信号,从信号价格算起,扣除佣金后的预期优势为 1.2 点。从发出信号到订单抵达交易场所,价格会发生变动。假设有两种状态:80% 的情况下,价格朝不利方向漂移约 0.2 点(标准差 0.3 点);20% 的情况下,快速行情使价格偏离约 2 点(标准差 1 点)。这些输入仅用于说明,实践中请根据您自己的订单日志进行估算。

| 相对信号价格的限价容差 | 成交率 | 每次成交平均净值 | 每个信号预期净值 |
|---|---|---|---|
| 0 点(限价等于信号价格) | 20.7% | 1.38 点 | 0.29 点 |
| 0.3 点 | 51.3% | 1.18 点 | 0.61 点 |
| 0.6 点 | 74.3% | 1.05 点 | 0.78 点 |
| 1.2 点(等于优势) | 84.2% | 0.98 点 | 0.82 点 |
| 2.0 点 | 90.0% | 0.89 点 | 0.80 点 |
| 不设限(市价单) | 100% | 0.64 点 | 0.64 点 |
以下三个结论不仅适用于这个例子:
- 最佳限价是盈亏平衡价,而不是报价。任何仍能留下正预期利润的成交都值得接受。在这个模型中,最大值恰好位于容差等于优势之处,因为下一笔边际成交的收益为零。
- 曲线在顶部附近很平坦。在 0.8 到 2 点之间,预期利润几乎不变。您不需要精确的容差,但您确实需要一个容差。
- 平均成交价是一个具有误导性的目标。最紧的限价每次成交的价格最好(1.38 点),每个信号的结果却最差(0.29 点),因为 79% 的信号从未成交。
该模型忽略了排队效应,并假设只要达到限价,全部数量就能成交。对于较大的订单,请用您的真实深度重新计算,因为限价还决定了能容纳多少数量。请用数据检验这些假设:我们关于回测与实盘执行差距的指南展示了如何把执行时间纳入测试。
处理部分成交,而不制造新的风险
部分成交不是错误,但它是一种新状态,算法必须为此制定规则。FOK 在入场时避免了这种状态;IOC 则把问题转移到您的逻辑中。请在上线前确定策略:
| 剩余部分策略 | 适用场合 | 需控制的风险 |
|---|---|---|
| 接受并管理已成交部分 | 优势与数量无关的入场 | 头寸太小,无法覆盖固定成本 |
| 以新价格重新发送剩余部分 | 信号仍然有效,优势仍高于容差 | 追价。限制重试次数,并在每次重试时重新检查优势 |
| 在另一交易场所对冲或补足 | 多腿交易 | 手数步长不同,且可能再次无法成交 |
| 平掉已成交部分 | 成交量低于可行数量 | 支付两次点差 |
两腿交易最需要谨慎。假设一笔对冲交易用 IOC 在交易场所 A 买入 2M,并在交易场所 B 卖出。如果 A 成交 1M,而算法仍卖出计划的 2M,它就持有 1M 的未对冲空头。EURUSD 每百万每点约 $100,10 点的不利波动就要损失 $1,000,很容易超过许多笔交易的优势。规则很简单:根据第一腿的 CumQty 确定第二腿的数量,绝不能根据请求数量。
还要换算到第二个交易场所的数量步长。如果第一腿成交 1,370,000,而交易场所 B 接受的步长为 100,000,您只能对冲 1,400,000 或 1,300,000,而不是精确数量。也要为这部分余量制定规则,并把未对冲余量当作一项风险限额。
第一腿使用 FOK 可以消除数量不匹配,但会产生更多未成交事件。第二腿使用 FOK 通常不是好的选择:第一腿已经成交时,对冲单被取消会让您完全暴露在风险之下。第二腿正是值得为执行确定性付出代价的地方。
哪种策略用哪种订单

| 场景 | 合理的默认选择 | 理由 |
|---|---|---|
| 延迟套利入场 | 限价 IOC,限价设在盈亏平衡价 | 优势在毫秒内衰减;部分成交仍能盈利,限价则截断尾部风险 |
| 对冲组合的第一腿 | 限价 FOK,或 IOC 并按 CumQty 对冲 | FOK 保护数量匹配;IOC 提高成交率,但需要更完善的逻辑 |
| 第一腿已成交时的第二腿 | 市价单或宽 IOC | 未对冲才是更大的风险 |
| 新闻驱动的入场 | 限价 IOC,控制数量 | 点差和深度变化很快,而市价单没有价格上限 |
| 紧急离场或强制止损 | 市价单或宽 IOC,重复直到空仓 | 确定性优先;FOK 可能让头寸继续敞口 |
| 配对或统计交易 | 限价 IOC 或短时被动限价单 | 持仓时间较长,因此支付的点差比速度更重要 |
| 赚取点差和再平衡 | 被动限价单,Day 或 GTD | 等待能带来收益,但必须在新闻和展期之前撤单 |
执行还取决于时机。在展期和新闻前后,点差扩大、深度变薄,因此在伦敦中午成交良好的限价,在这些时段可能失败或变得昂贵。请让容差和数量随当前点差调整,而不是全天固定不变。关于速度敏感型策略的深入分析,请参阅我们的延迟套利指南。
配置订单执行的七个步骤
1
2
3
4
5
6
7
自动化订单处理中的常见错误
- 假定请求的数量已经成交。头寸必须来自执行报告,而不是来自您发送的订单。
- 把被取消的 FOK 当作系统错误。这是正常结果。每次都报警只会让您习惯于忽略警报;应针对比率报警。
- 以相同价格循环重试。如果价格已经变动,重试同样会失败,而快速重试还可能突破消息限制。请重新定价,或者停止。
- 忽视未知状态。收不到回复时,订单可能仍然有效或已经成交。发送替换订单之前,请用 OrderStatusRequest(
35=H)查询,或在重新连接后核对头寸。 - 重复使用 ClOrdID 值。每笔订单(包括每次重试)使用唯一的标签 11,才有可能进行对账。
- 用过时的价格计算限价。基于延迟报价算出的限价不是太紧就是太宽。快速行情数据源才能让容差有意义。
- 用完美成交进行测试。让每笔订单都按报价全部成交的回测,无法区分市价单、IOC 和 FOK。请对深度和拒单建模,或用小数量进行前向测试。
- 在交易场所之间照搬设置。在一家经纪商上调好的容差对另一家几乎没有参考价值,因为深度、Last Look 和延迟都不相同。
需要衡量什么
选择订单类型是一个实证问题,只有完整的日志才能回答。报告应涵盖信号和尝试,而不仅仅是已完成的交易。
| 指标 | 定义 | 说明什么 |
|---|---|---|
| 成交比率 | 成交数量 / 请求数量 | 过低说明限价太紧或深度太薄 |
| 拒单率 | 被拒绝或被取消的订单 / 发送的订单 | 突然上升意味着流动性或经纪商发生变化 |
| 滑点 | 成交价减去信号时的参考价(带符号) | 每笔成交的执行成本 |
| 往返时间 | 从发送订单到收到首份执行报告 | 交易场所在一天中的不同时段是否变慢 |
| 每个信号净值 | 总结果 / 全部信号(包括错过的信号) | 应当决定容差的数字 |
请按品种、交易场所、小时和订单类型拆分这些数据,并比较每次改动前后的结果。SharpTrader 显示订单和绩效统计,包括盈亏、滑点和执行时间,可作为此类复盘的实用基础。特定配置中可用的订单类型和 TIF 值取决于连接器和经纪商,请针对您自己的账户进行确认。
围绕您自己的数据构建执行
SharpTrader 通过 FIX API 和其他协议连接经纪商,运行套利和非套利策略,并记录每笔订单的滑点和执行时间。如需根据这些数据调整参数,SharpTrader Optimizer 可以自动完成搜索。
常见问题
IOC 和 FOK 有什么区别?
两者都立即执行,绝不留在订单簿中。IOC 接受部分成交,并取消未成交的剩余部分。FOK 要求全部数量立即成交,否则整笔订单被取消,不发生任何交易。
FOK 比 IOC 更好吗?
总体而言,两者没有优劣之分。FOK 适合部分头寸毫无用处或会使对冲复杂化的交易。IOC 通常成交更频繁,因为总有一部分数量能够完成,但您的算法必须正确处理部分成交。
FOK 订单可以部分成交吗?
不可以。按照定义,FOK 订单要么全部成交,要么完全不成交。如果您看到部分执行,说明该订单在该交易场所并不是真正的 FOK,请检查经纪商如何映射这条指令。
IOC 订单未成交的部分会怎样?
它会被立即取消,绝不留在订单簿中。在 FIX 上,您会收到一份结束该订单的执行报告,根据交易场所不同,状态通常为 Canceled 或 Expired,LeavesQty 为 0。
市价单和 IOC 订单是一回事吗?
不完全是。市价单没有价格限制,而 IOC 通常有。许多交易场所确实按 IOC 或 FOK 的方式运行市价单,因此存活期可能相同,但只有限价才能保护价格。
IOC 和 FOK 的 FIX 值是什么?
在 TimeInForce 字段(标签 59)中,IOC 为 3,FOK 为 4。订单类型在标签 40 中单独设置,其中 1 为市价,2 为限价。
所有外汇经纪商都支持 IOC 和 FOK 吗?
不是。是否支持取决于经纪商、平台和连接类型。FIX API 连接通常提供更多控制,但每个交易场所都会公布自己接受的订单类型和有效期组合清单。
本文仅用于教育目的,不构成投资建议。订单簿和模型均为示例,并非交易结果。外汇交易存在重大亏损风险。