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)。

价格订单类型,标签 40市价、限价、止损、止损限价。设定您接受的最差价格。
时间有效期,标签 59IOC、FOK、Day、GTC、GTD。设定订单可以等待多久。
数量成交规则仅全部成交(FOK)、任意数量(IOC),或在支持时设定最小数量(标签 110)。

外汇中的市价单:“按市价”究竟是什么意思

市价单的意思是:现在就给我成交,价格是次要的。它没有限价,因此执行确定性最高,但对成交价格毫无保护。如果订单簿已经变动或流动性稀薄,订单会逐级向上吃掉可用档位,直到数量成交完毕。这一成本就是滑点,我们在如何测量并降低外汇滑点指南中有深入讲解。

外汇市场还有两个细节,是基于交易所的讲解通常会略过的:

  • 不存在单一的中央订单簿。您的经纪商或 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
订单簿逐档成交示意图,比较买入 200 万 EURUSD 时的市价单、IOC 限价单和 FOK 限价单:市价单以 1.085018 全部成交,IOC 以 1.085005 成交 100 万,FOK 被取消
同一订单簿,三种指令。订单簿是构造的示例,计算结果准确。
指令 成交量 平均价格 相对最优卖价的成本 结果
市价,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 订单如下:

35=D | 11=A1001 | 55=EUR/USD | 54=1 | 38=2000000 | 40=2 | 44=1.08502 | 59=3

把 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),而剩余部分如何报告则取决于交易场所。

200 万 IOC 订单的 FIX 生命周期:NewOrderSingle,两份成交执行报告使 CumQty 升至 100 万,随后是针对剩余 100 万的取消或过期报告,LeavesQty 为零,算法只对冲已成交数量
只有当 LeavesQty 降至 0 时,IOC 才算完成。您的头寸是 CumQty,绝不是您请求的数量。

有些交易场所在成交之前会额外发送一条确认(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 指南中有详细介绍。

为什么这对衡量很重要:在采用 Last Look 的交易场所,主动订单可能显示出出色的滑点统计,因为样本中只有对提供商有利的成交。低平均滑点加上高拒单率,并不是好的执行。

限价设在哪里:一个计算模型

对 IOC 或 FOK 来说,关键参数不是 TIF,而是限价。把它设在当前报价上,大多数信号都会错过;不设限制,最差的成交又会吃掉优势。在这两个极端之间,存在一个可以计算的答案。

考虑一个短暂的信号,从信号价格算起,扣除佣金后的预期优势为 1.2 点。从发出信号到订单抵达交易场所,价格会发生变动。假设有两种状态:80% 的情况下,价格朝不利方向漂移约 0.2 点(标准差 0.3 点);20% 的情况下,快速行情使价格偏离约 2 点(标准差 1 点)。这些输入仅用于说明,实践中请根据您自己的订单日志进行估算。

示意模型:每个信号的预期净点数随限价容差上升,在容差约 1.2 点处达到约 0.82 点的峰值,而不设限的市价单降至 0.64 点,同时成交率从 21% 升至 100%
示意模型,并非交易结果:1.2 点优势和两种状态的价格漂移。漂移在容差之内时才会成交。
相对信号价格的限价容差 成交率 每次成交平均净值 每个信号预期净值
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;否则挂被动限价单,并使用 Day、GTC 或 GTD
这只是决策的起点。最终以交易场所规则和您的成交数据为准。
场景 合理的默认选择 理由
延迟套利入场 限价 IOC,限价设在盈亏平衡价 优势在毫秒内衰减;部分成交仍能盈利,限价则截断尾部风险
对冲组合的第一腿 限价 FOK,或 IOC 并按 CumQty 对冲 FOK 保护数量匹配;IOC 提高成交率,但需要更完善的逻辑
第一腿已成交时的第二腿 市价单或宽 IOC 未对冲才是更大的风险
新闻驱动的入场 限价 IOC,控制数量 点差和深度变化很快,而市价单没有价格上限
紧急离场或强制止损 市价单或宽 IOC,重复直到空仓 确定性优先;FOK 可能让头寸继续敞口
配对或统计交易 限价 IOC 或短时被动限价单 持仓时间较长,因此支付的点差比速度更重要
赚取点差和再平衡 被动限价单,Day 或 GTD 等待能带来收益,但必须在新闻和展期之前撤单

执行还取决于时机。在展期和新闻前后,点差扩大、深度变薄,因此在伦敦中午成交良好的限价,在这些时段可能失败或变得昂贵。请让容差和数量随当前点差调整,而不是全天固定不变。关于速度敏感型策略的深入分析,请参阅我们的延迟套利指南。

配置订单执行的七个步骤

1

为错过的交易定价。确定未成交的代价。对可选入场来说,代价为零;对对冲或离场来说,代价就是敞口风险。

2

计算可接受的最差价格。用预期优势减去佣金和安全边际,把限价设在这个盈亏平衡点上。

3

选择存活期。吃单时使用 IOC 或 FOK,挂单时使用 Day、GTC 或 GTD。

4

设定最小有效成交量。如果小额成交无法覆盖固定成本,请使用 FOK,或在支持时设定最小数量。

5

编写剩余部分规则。定义重试方式、最大尝试次数,以及如何处理未对冲余量。

6

确认交易场所规则。检查支持的订单类型与 TIF 组合、数量步长、剩余部分的报告方式,以及是否采用 Last Look。

7

记录并复盘。记录每一笔订单,包括拒单和撤单,并根据真实成交数据调整限价。

自动化订单处理中的常见错误

  • 假定请求的数量已经成交。头寸必须来自执行报告,而不是来自您发送的订单。
  • 把被取消的 FOK 当作系统错误。这是正常结果。每次都报警只会让您习惯于忽略警报;应针对比率报警。
  • 以相同价格循环重试。如果价格已经变动,重试同样会失败,而快速重试还可能突破消息限制。请重新定价,或者停止。
  • 忽视未知状态。收不到回复时,订单可能仍然有效或已经成交。发送替换订单之前,请用 OrderStatusRequest(35=H)查询,或在重新连接后核对头寸。
  • 重复使用 ClOrdID 值。每笔订单(包括每次重试)使用唯一的标签 11,才有可能进行对账。
  • 用过时的价格计算限价。基于延迟报价算出的限价不是太紧就是太宽。快速行情数据源才能让容差有意义。
  • 用完美成交进行测试。让每笔订单都按报价全部成交的回测,无法区分市价单、IOC 和 FOK。请对深度和拒单建模,或用小数量进行前向测试。
  • 在交易场所之间照搬设置。在一家经纪商上调好的容差对另一家几乎没有参考价值,因为深度、Last Look 和延迟都不相同。

需要衡量什么

选择订单类型是一个实证问题,只有完整的日志才能回答。报告应涵盖信号和尝试,而不仅仅是已完成的交易。

指标 定义 说明什么
成交比率 成交数量 / 请求数量 过低说明限价太紧或深度太薄
拒单率 被拒绝或被取消的订单 / 发送的订单 突然上升意味着流动性或经纪商发生变化
滑点 成交价减去信号时的参考价(带符号) 每笔成交的执行成本
往返时间 从发送订单到收到首份执行报告 交易场所在一天中的不同时段是否变慢
每个信号净值 总结果 / 全部信号(包括错过的信号) 应当决定容差的数字

请按品种、交易场所、小时和订单类型拆分这些数据,并比较每次改动前后的结果。SharpTrader 显示订单和绩效统计,包括盈亏、滑点和执行时间,可作为此类复盘的实用基础。特定配置中可用的订单类型和 TIF 值取决于连接器和经纪商,请针对您自己的账户进行确认。

围绕您自己的数据构建执行

SharpTrader 通过 FIX API 和其他协议连接经纪商,运行套利和非套利策略,并记录每笔订单的滑点和执行时间。如需根据这些数据调整参数,SharpTrader Optimizer 可以自动完成搜索。

了解 SharpTraderSharpTrader 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 连接通常提供更多控制,但每个交易场所都会公布自己接受的订单类型和有效期组合清单。

本文仅用于教育目的,不构成投资建议。订单簿和模型均为示例,并非交易结果。外汇交易存在重大亏损风险。