限价单与市价单:一个保价格,一个保成交,你只能挑一个
你打开交易软件想买一只票,界面上给你两个按钮:一个写着「以市价买入」,另一个要你自己填一个价格。
大部分人第一次会犹豫两秒,然后点了市价——因为快,因为省事,因为「反正就差那么一点」。
差那么一点,通常确实无所谓。但有那么几种时刻,这个选择会决定你这笔交易是小赚还是大亏:市场剧烈波动的那一分钟、你想清仓一只没什么人买卖的票的那个下午、你的止损被触发的那一秒。这几个时刻的共同点是——恰好都是你最需要「不出意外」的时候,而这两种下单方式各自会在其中一个方向上给你意外。
先说人话:这两个按钮到底在承诺什么
先离开股票,说打车。
你在路边招手拦车。招到就上,车费按表走,多少钱要下车才知道。你确定的是「我一定能走」,不确定的是「花多少钱」——这是市价单。
换一种:你在打车 App 上设一个价,说我只愿意出 30 块,谁接谁来。你确定的是「最多花 30」,不确定的是「有没有人接、什么时候接、会不会一直没人接」——这是限价单。
两种叫车方式没有优劣,只有场景。赶飞机的时候你去路边招手,不会为了省十块钱在 App 上干等;不赶时间回家你挂个价慢慢等,也没什么损失。
回到市场,一模一样:
- 市价单:我不管什么价,现在就要成交。系统会拿当前市场上最靠近的对手价把你填满。保证成交,不保证价格。
- 限价单:我出这个价,不到这个价我不玩。单子会挂在那里排队等。保证价格,不保证成交。
这里有个很多人第一次没转过弯的地方:市场上任何一笔成交,都是两个人在一个价上碰头。你要立刻成交,意味着你必须去迁就那个已经挂在那里等的人的价格。 你不是「按屏幕上那个数字买」,你是「按别人愿意卖的那个数字买」。屏幕上那个最显眼的数字通常是最新成交价,是刚刚发生过的事,不是给你的报价。真正能碰到的是盘口——别人愿意卖给你的最低价(卖一)和别人愿意从你手上买的最高价(买一),这两个价中间永远隔着一道缝。市价单的代价,就是每次都要跨过这道缝。这道缝有多宽,取决于这个品种有多少人在盯着,也就是它的流动性好不好。这部分的细账,滑点那篇算得更细。
投资层:这个取舍在你的账户里长什么样
平时:真的无所谓
买卖活跃的大盘股,那道缝可能只有一个最小报价单位,薄得可以忽略。你一年做几笔,用哪种下单方式对最终收益的影响小到测不出来。这种时候纠结订单类型是在浪费注意力。
所以先记住一件事:这个选择只在少数几个时刻重要。 分辨出那几个时刻,比记住两个定义有用得多。
时刻一:你想买卖的东西没什么人碰
冷门小票、成交清淡的时段、临近收盘的最后几分钟。这种时候盘口上挂着的单子又少又零散,你一笔市价单打出去,可能第一层就被吃穿了,剩下的部分只能去更差的价位成交。你以为你在按 10 块买,实际均价可能是 10 块几毛——而这还只是你一个人的量造成的,专门有个词叫冲击成本:你自己的买单把价格顶上去了。
这种场合限价单几乎是唯一合理的选择。 代价是你可能挂一天也没成交,或者只成交了一部分——部分成交,就是你要买一万股只买到三千股,剩下七千股还挂在那里。这本身也是要处理的麻烦:你的持仓和你以为的持仓不一样了。
时刻二:消息出来的那一分钟
价格在剧烈跳动的时候,两种单子会用两种方式坑你。
市价单的坑:你点下去的那一刻和真正成交的那一刻之间隔着一段时间,价格可能已经跑掉了一大截。极端行情下市价单的成交价能让你怀疑人生。
限价单的坑更隐蔽:它不成交,而你以为它成交了。 你挂了个买单等回调,结果价格头也不回地涨上去,你的单子安静地挂在下面。这时候你的账户里什么都没发生——但你的计划里已经默认这笔买入完成了。后面所有的仓位安排、风险预算,全部建立在一个不存在的持仓上。
限价单最大的风险不是「没买到」,是「你以为你买到了」。
时刻三:止损被触发的那一秒(这是真正的分水岭)
这是全篇最重要的一段。
止损的意义在于「跌破这个位置我一定要走」。注意「一定」两个字——它要的是确定性地离场,不是「离场价格好看」。
如果你用限价单止损,价格跌破你的线,你挂了个限价卖单在那儿,结果价格一路往下没人接你的单,你的单子还挂着,仓位还在,亏损继续扩大。你的止损规则在纸面上执行了,在账户里没有。 这是最典型的一类事故:一套风控体系被一个订单类型的选择悄悄架空了。
所以业界的常见做法是:止损用市价单,宁可接受一个难看的成交价,也要保证真的走掉。 止损:从心理问题变成数学问题那篇讲的是「止损位怎么定」,这里补的是另一半——止损位定得再好,执行方式选错了也没用。
时刻四:A 股的「涨跌停」和「限价单」不是一回事
这里有个中文里特别容易混的地方,值得单独拎出来。
A 股有涨跌幅限制,一天最多涨/跌到某个价位,到了就「封住」。这个东西英文里也叫 price limit,但它和「限价单」(limit order)完全是两码事:前者是市场规则给所有人划的价格上下界,后者是你自己给自己这一笔单子设的价。
它们碰在一起会出一个很现实的问题:跌停板上,你的卖单是排不出去的。 因为跌停价上买方几乎没有量,全是排队等着卖的人。这时候你选市价单还是限价单,区别不大——都成交不了。这不是订单类型能解决的问题,这是流动性消失的问题。订单类型只在有对手盘的时候才有意义。
系统层:真实系统里,它长什么样
看完取舍,再看几个真实系统怎么把这件事写进代码。有意思的地方在于,三套系统的处理方式差别极大,而这个差别本身就在告诉你「这个概念到底有多重要」。
观察一:不是选一种,是每个动作各选一种
freqtrade 的配置里有一个专门的字典,把动作映射到订单类型:进场一种、出场一种、止损一种、紧急出场一种、强制进出场各一种。
这个设计比它看起来重要。它说明在真实系统里,「你用市价单还是限价单」根本不是一个问题,而是至少四五个问题——因为不同的动作对「保价格」和「保成交」的需求是相反的。
它的默认配置就把这个思路摆得很明白:日常的进场和出场倾向于挂单等价格(不着急,省下的那道缝就是利润),而止损、紧急出场、用户手动强制平仓这几类倾向于立刻走掉(要的是确定性)。这些默认值当然可以改,看的时候以你手上那个版本的文档为准;但这个按动作分开配的结构,比任何一个具体默认值都值得学。
顺带一个工程上的坑:它的文档提到,并非所有交易所都支持市价单,不支持的时候程序会拒绝启动。也就是说「用市价单」这个决定,有时候压根不由你定。
观察二:限价单没成交怎么办——超时、撤单、重挂
选了限价单,你就得回答一个新问题:等多久算等够了?
freqtrade 为此专门有一组「未成交超时」设置:进场单等多久、出场单等多久,超时就撤。撤了以后两边处理不一样——进场单撤了,这笔交易当作没发生;出场单撤了,等下一次信号再试着出。它还允许你限定出场单最多能超时几次,超过次数就触发紧急出场(走市价,直接走人)。
它的回测报告里甚至专门有两个计数器,统计整个回测期间有多少笔进场单、多少笔出场单是因为超时被撤掉的。
这两个数字,比很多人盯着的收益率更能说明一套规则在现实里可不可行。 如果一套规则在回测里三成的单子都没挂上,那它在实盘里的样子和曲线上画的完全是两回事。
观察三:回测里的限价单,成交条件宽松得可疑
这是本篇最该让你警惕的一点。
freqtrade 回测判断一笔限价单成不成交的逻辑,短得只有一行——你挂的价格只要落在这根 K 线的最高价和最低价之间,就算成交。
def _get_order_filled(self, rate: float, row: tuple) -> bool:
"""Rate is within candle, therefore filled"""
return row[LOW_IDX] <= rate <= row[HIGH_IDX]
停下来想想这个假设有多慷慨。现实里,价格「触及」过你的挂单价,和你的单子「被成交」,中间隔着一整条排队的人。价格闪一下就走,前面排着的量根本没轮到你。而在回测里,只要价格路过,你就一定成交,而且是按你想要的那个价成交。
它的文档对此其实很坦白,在回测假设那一节明确写了:只要价格在这根 K 线的高低范围内,所有订单都按请求的价格成交,不计滑点。这不是 bug,是回测在缺少 K 线内部细节时不得不做的简化。但你必须知道这个简化站在哪一边——它站在让你好看的那一边。想系统看这类假设,可以读回测里的成交假设。
它的模拟盘(不下真实单,只在本地推演)里还有一层更细的处理,思路是:市价单按当时盘口上的量来填并设一个滑点上限,限价单等价格触及才成交、否则按超时设置撤掉,而挂得太深、已经明显穿过市价的限价单会被当成市价单立刻成交掉。具体的比例阈值属于实现细节,可能随版本变化,重要的是这套分情况处理的机制本身。
观察四:有的系统里,压根没有「订单类型」这个概念
qlib 的订单对象是个很短的数据类,字段就那么几个:股票代码、数量、方向(买还是卖)、这笔单归属的时间区间,以及回测跑完后填上的成交数量。
没有价格字段。没有订单类型字段。
成交价从哪来?从交易所模块的一个配置里来——你告诉它用开盘价、收盘价还是别的什么价来撮合,它就统一按那个价成交,再乘上手续费。能不能成交则由另外两件事决定:这只票当天是不是停牌、你的量有没有超过当天成交量的某个比例上限。
这不是偷懒,是这类系统关心的问题根本不在这一层。它服务的是「用模型选出一篮子股票、按目标权重调仓」这种研究流程,颗粒度是天或更粗,纠结限价还是市价没有意义。
但你必须知道这个省略的代价:它默认了一种现实中不存在的订单——既保证按你指定的价格成交,又保证一定能成交。 前面讲的所有取舍,在这层建模里全部消失了。这不影响它做研究,但如果你拿这种回测结果去推断实盘表现,中间缺的那一块得你自己补回来。补法通常是把交易成本的假设调狠一点,替这个被省略掉的取舍买个保险。
再提醒一个命名陷阱:qlib 配置里有个叫 limit_threshold 的东西,看着像「限价」,实际管的是涨跌停判断——就是前面说的那个「市场规则划的上下界」,和限价单毫无关系。读别人的系统时,看名字猜含义是最常见的误读来源。
观察五:订单类型是个需要校验的输入,不是随便传的字符串
Vibe-Trading 的实盘下单封装里,订单类型这个参数只接受两个值,别的一律直接报错返回;而且一旦选了限价,就强制要求你必须给出限价价格。它的注释里写明这个函数「失败即关闭」——对调用方犯的错,它只返回错误,不抛异常、不猜你想干什么。
同一份代码里还有一层更重的东西:真实下单要先过一道授权闸门,检查有没有有效的授权、有没有过期、有没有被紧急停止;连「用数量下单但算不出这笔单值多少钱」这种情况都直接拒绝,理由写得很直白——定不了价就不放行。
这个细节值得停一下:一个系统对「订单类型」这种参数校验得越严,说明它越清楚这个参数错了会发生什么。在纸上,市价和限价是两个词;在真实下单接口那一端,它们是两种后果。
观察六:还有第三个维度——这张单子能活多久
选完类型,还有一个常被忽略的设置:订单的有效期。freqtrade 文档里列了几种常见的:
一直挂到你撤为止(可以部分成交,剩下的继续挂着);要么立刻全部成交、否则整单作废;要么立刻成交能成的部分、剩下的作废;以及一种「只准挂单不准吃单」的模式——如果这笔单会立刻成交,它就直接被取消。
这几种模式对应的是完全不同的意图。「立刻全部成交否则作废」是在说「我不接受半仓」;「只准挂单」通常是为了拿交易所对挂单方的费率优惠。文档同时给了个很直接的提醒:不清楚影响的话别动默认值。这个提醒本身就说明,这几个选项的后果远比它们的名字复杂。
那到底怎么选
不给你一张万能表,给你三个问题。每次下单前在心里过一遍:
第一,这笔单不成交,会怎么样? 如果答案是「我的风控就废了」(止损、被迫平仓、追加保证金),选市价,别犹豫。如果答案是「那就算了,等下次机会」,选限价。
第二,这个品种现在有多少人在交易? 盘口薄、买卖价差宽的时候,市价单的代价会突然放大好几倍。越冷门的东西越要挂单。
第三,我的量相对于市场大不大? 量大的时候不管选哪种,你都得面对自己把价格推走的问题——那已经不是订单类型能解决的了,得靠拆单和择时。
还有一条元规则:如果一套规则的收益,会因为你把订单类型从限价改成市价就消失,那这套规则本来就不成立。 它赚的不是判断的钱,是那道缝的钱,而那道缝在现实里大概率跨不过去。
常见误用与失效边界
以为限价单「更安全」。 限价单在价格上更安全,在执行上更危险。它把不确定性从「价格」搬到了「成不成交」——不确定性没消失,只是换了个地方待着,而且换到了一个你更不容易发现的地方。
用限价单做止损。 前面说过,这是把一套风控体系架空的最快方式。止损要的是离场的确定性。
把回测里的成交当成实盘能成交。 回测判定成交的条件通常宽松得多——价格触及即成交、按你要的价成交、不计排队。回测里那些「挂在低点精准接到」的单子,实盘里有相当一部分接不到,而且接不到的往往正是行情最好的那几笔。
忘了部分成交。 你以为一笔单子只有「成」和「不成」两种结果,实际还有第三种。持仓和计划对不上,后面所有的仓位计算都会偏。
在没有对手盘的地方纠结订单类型。 跌停板、停牌、极端流动性枯竭的时候,两种单子都成交不了。这时候该复盘的是「为什么会持有一个跑不掉的东西」,而不是「该用哪种单」。
把订单类型当成可以后期优化的细节。 它是执行层的决定,但会反过来改变策略层的结论。一套依赖「总能在理想价位挂到单」的规则,和一套「随时准备付出跨缝代价」的规则,是两套完全不同的规则,不是同一套规则的两种参数。
小结
- 市价单保成交不保价格,限价单保价格不保成交。世界上没有第三种单,虽然某些回测系统的建模让你以为有。
- 这个取舍平时无所谓,只在三种时刻要命:品种冷清、行情剧烈跳动、必须离场的止损时刻。
- 真实系统的做法是按动作分别配置:日常进出场倾向挂单等价格,止损和紧急平仓倾向立刻成交。这个结构比任何一个默认值都值得记。
- 选了限价单,就得回答「等多久、超时了怎么办、只成交一部分怎么办」——这几个问题在回测报告里通常有专门的计数器,那些数字比收益率更能说明一套规则在现实里活不活得下去。
- 回测判定限价单成交的条件普遍很宽松(价格路过即算成交、按请求价成交、不计排队),这个简化永远站在让你好看的那一边。
- 除了类型,还有有效期这一层:一直挂着、全成或全撤、成多少算多少、只准挂单不准吃单,各自对应不同的意图。
一句话记住这篇:急着走的时候别讲价,不急的时候别乱撒钱。
本文所引源码与文档均来自上述快照版本,是阅读代码得出的机制说明,不是运行结果;具体行为请以你手上那个版本为准。回 量化与 AI 投研概念库 看其它概念各自在说什么;本站内容为投资教育,不构成任何投资建议,边界见 免责声明。
本文为投资教育整理,关键数据与结论请结合下列权威来源验证。
- freqtrade 源码快照 b3404c9(2026-08-18):docs/configuration.md 的 Understand order_types 与 Understand order_time_in_force 两节、docs/configuration.md 的 Considerations for dry-run、docs/backtesting.md 的 Assumptions made by backtesting、freqtrade/optimize/backtesting.py 的 _get_order_filled 与 check_order_cancel、freqtrade/config_schema/config_schema.py 的 order_types 定义 ↗
- qlib 源码快照 79633dd(2026-07-23):qlib/backtest/decision.py 的 Order 数据类、qlib/backtest/exchange.py 的 deal_price 与 limit_threshold ↗
- Vibe-Trading 源码快照 3a752d5(2026-08-04):agent/src/trading/connectors/alpaca/sdk.py 的 place_order、agent/src/live/sdk_order_gate.py ↗