成交以后
一笔买单出现多条成交:平均价应该怎样算
别把几个价格直接平均。先算每段花了多少,再除以总数量。

一张买单下面出现三条成交价,不代表你下了三次单。你的委托可能先和一小笔卖单成交,再和后面的数量继续成交。要算整张订单实际买入的平均价,不能把三个价格直接相加除以三,必须让成交数量更大的那一笔占更大分量。
成交均价 = 所有成交金额之和 ÷ 所有成交数量之和
其中,每笔成交金额 = 该笔成交价 × 该笔成交数量。这个算法常被叫作“按数量加权”,说人话就是:买得多的价格,对最终平均价影响更大。在表格里,微软的加权平均公式示例用价格与数量做 SUMPRODUCT,再除以数量的 SUM,计算的是同一个关系。
先分清订单和成交,不然公式也会算错
订单是你提交的一张买卖要求,成交是这张要求真正和市场里的另一边配对成功的一小段。一张订单可能完全没成交,也可能一次成交完,还可能被拆成多次成交。英文记录里常把每一小段叫 fill 或 trade。
假设你想买 10 个 ABC。市场上当时愿意按某个价格卖出的只有 2 个,系统先完成这 2 个;随后又在另一个价格完成 5 个,再完成 3 个。你仍只下了一张 10 个的订单,但产生了三段成交。
记录怎样展示取决于载体。网页可能把多次撮合聚合成一条可读结果,账户成交明细或某些导出载体则可能提供更细的行。不要因为网页只有一行就断言只撮合了一次,也不要因为文件有多行就把每一行当成独立下单。
为什么三个价格不能直接除以三
看一个教学示例。以下数字只为演示算法,不是实时行情:
| 成交价 | 成交数量 | 成交金额 |
|---|---|---|
| 10.00 USDT | 1 个 | 10.00 USDT |
| 10.20 USDT | 2 个 | 20.40 USDT |
| 10.50 USDT | 7 个 | 73.50 USDT |
直接平均三个价格,得到约 10.23;但第三个价格买了 7 个,显然应该影响更大。正确做法是先把成交金额相加:10 + 20.4 + 73.5 = 103.9 USDT;再把数量相加:1 + 2 + 7 = 10 个;最后用 103.9 ÷ 10,得到成交均价 10.39 USDT。
可以做一个反向检查:平均价应落在最低成交价与最高成交价之间。每笔成交对结果的影响,取决于该笔数量占总成交数量的比例;不能只看哪一笔数量最大,就断定均价应靠近它的价格。若结果跑到区间外,通常是单位、方向或公式抄错。
从记录里抄哪几列
手工复算前,先确保这些行确实属于同一张订单。最可靠的是当前载体提供的共同订单编号。Binance 现货账户成交数据的公开字段说明中,每条成交可包含 orderId、price、qty、quoteQty、commission、commissionAsset 和 time。网页或 CSV 不保证逐列照搬 API,因此只使用你眼前载体真实提供的字段。
- 订单编号:用于把多条成交归到同一张订单;没有时不能假装已经精确归组。
- 交易对和方向:确认都是同一交易对、同为买入或同为卖出。
- 成交价:使用实际成交价,不拿限价或屏幕最新价代替。
- 成交数量:通常是基础资产数量,注意列名与单位。
- 成交金额:有现成 quoteQty 就保留;没有再用价格乘数量复算。
- 时间:用于检查区间与先后,不能单靠时间相近认定同一订单。
- 手续费及资产:单独保存,暂时不要塞进均价公式。
可对照 Binance 的现货账户成交字段文档理解这些名字。该接口属于签名账户接口,本文不要求你创建 API Key;普通用户从页面或官方下载文件核对即可。
用四步算完一张订单
- 筛行:按订单编号归组,再复核交易对、方向和时间。若文件没有订单编号,先保留不确定标记。
- 算每行金额:成交价乘成交数量。文件已有成交金额时,同时保留原值,别覆盖。
- 分别求和:一列加总数量,一列加总金额。小数位尽量保留到原记录精度。
- 最后相除:总成交金额除以总成交数量,只在展示结果时做必要舍入。
若记录给出的每行成交金额和“价格 × 数量”在末位略有不同,先查显示精度。页面可能缩短了价格或数量,而后台汇总使用了更多小数。不要为了让乘法表面相等,手动改写原始字段。可以把“官方原值”和“我的复算值”分成两列。
Binance 的现货术语把 cummulativeQuoteQty 解释为每次成交的“价格 × 数量”累计值。若订单记录直接给出累计成交金额和已成交数量,可用两者相除做总体复核;但某些历史订单的数据可能不可用,不能把空缺或特殊值当成真实零。
部分成交后撤单,分母用哪个数量
原委托 10 个,只成交 6 个就撤销,均价分母是已成交的 6,不是原计划的 10。剩余 4 个没有成交价,也没有成交金额,把它放进分母会把平均价错误压低。
教学示例:订单先以 20 成交 2 个,又以 21 成交 4 个,随后取消剩余 4 个。总成交金额是 40 + 84 = 124,总成交数量是 6,均价约 20.6667。不能用 124 除以原委托数量 10。
订单状态也要一并保存。PARTIALLY_FILLED 表示只完成了一部分;CANCELED 表示剩余订单被取消,不会抹掉取消前已经发生的成交。订单历史回答“整张委托后来怎样”,成交明细回答“实际完成了哪些段”,两份记录各有用途。
手续费要不要放进平均价
复核交易所显示的成交均价时,先不要把手续费加进成交金额,也不要从成交数量里扣掉。平均成交价描述撮合结果;手续费是成交以外的费用记录。把费用偷偷并入公式,算出来的是另一种“含费成本”,无法再与页面均价直接比较。
如果你确实要算“含费后的每单位成本”,应另起一列,并先统一手续费单位。手续费若以买到的资产扣,净得到数量会变化;若以报价资产扣,支出金额会变化;若以 BNB 等第三种资产扣,还需要明确采用哪个时点的换算价。不同口径都可能有用途,但必须给结果写清名称、单位和换算依据。
最简单的记录方式是同时保留:
- 平台成交均价:总成交金额 ÷ 总成交数量;
- 每种资产的手续费合计:按手续费资产分别相加;
- 净到账或净支出:只在同一种资产内部做加减;
- 自定义含费成本:如果需要,另写口径,不覆盖前三项。
买单与卖单公式一样,解释角度不同
无论买还是卖,只要交易对相同,成交均价都可以用“报价资产成交金额 ÷ 基础资产成交数量”。ABC/USDT 的结果单位是“每个 ABC 值多少 USDT”。买单里它表示平均买入价,卖单里表示平均卖出价。
容易错的是资金方向。买入时,你付出报价资产、收到基础资产;卖出时相反。但公式的单位没有翻转。若把 USDT 数量除以 ABC 金额,或者把卖出收到的 USDT 当成基础资产数量,结果会完全失去意义。
不同交易对也不能直接混算。ABC/USDT 和 ABC/FDUSD 的报价资产不同,即使都在买 ABC,也应先各自算均价。若要合并成一个成本,需要额外做币种换算并记录汇率时点,那已经不是简单的订单成交均价。
放进表格后,最常见的五个坑
不要跨订单凑成一个“订单均价”
同一天买了三次相同交易对,可以算“这三张买单合在一起的加权均价”,但结果不能再叫某一张订单的成交均价。先分别按订单编号算每张单,再决定是否为了自己的记录做更大范围汇总。汇总标题要写清交易对、方向、时间区间和是否含费。
买单和卖单也不要混在同一个平均价里。把卖出数量当成负数虽然能做某些持仓计算,却回答不了“这张买单实际均价是多少”。
成交均价、持仓成本与已实现盈亏是不同问题,本文公式只解决第一项。
已有成交金额时,为什么仍值得做一次乘法
文件给出每笔 quoteQty 或成交金额时,优先保留平台原值。再用显示的价格乘数量,是为了发现列错位、单位错误和显示精度差异,不是为了用自己的短小数覆盖官方字段。两者末位不完全相等时,应记录差值并查看原始精度。
总体均价可先用“平台成交金额合计 ÷ 成交数量合计”;另算一列“显示价格 × 显示数量”的复算值作检查。这样既尊重原始记录,也能看出差异来自哪一行。若某些历史字段明确不可用,就把该行标为缺失,不要按零参与求和。
用反推法检查一处抄错
算出均价后,用“均价 × 总数量”反推总成交金额。反推值应与原成交金额合计一致到可解释的精度。若差得很大,逐行检查是否把价格列和金额列调换、漏掉一行、重复导入,或把逗号小数当成千位分隔符。
教学示例:三笔合计数量 8,总成交金额 82.4,均价应为 10.3。用 10.3 × 8 反推仍是 82.4。若你算出 1.03 或 103,先查单位和小数点,不要立刻把差异解释成手续费。
- 长数字变科学计数法:订单编号可能被表格改写或截断。导入时把标识列设为文本,并保留原始 CSV。
- 小数精度被格式吞掉:显示两位不代表原数据只有两位,不要复制屏幕短值覆盖源字段。
- 数字被当成文字:求和得到零或漏行时,检查小数点、千位符与地区格式。
- 重复导入:同一文件导入两次会让总量翻倍。用订单编号、成交编号和时间组合检查重复。
- 筛选区间漏边界:跨日成交要统一时区,确认开始与结束时点是否包含边界记录。
第一次打开文件时,先另存工作副本。所有公式、标色、删除重复行都在副本里做;原始 CSV 只读保存。
这样算错可以重来,也方便回查并对照小数或编号有没有在后续处理中改变;保留副本本身不能独立证明原始记录的真实性。
算完以后,用四个问题验算
至少有两笔成交,而且删掉一笔后仍有成交可算时,还可以做“删一行测试”:暂时在副本里去掉一笔成交,重新计算均价。先记下删除前的均价:被删成交价高于这个均价,删除后的均价应下降;被删成交价低于它,删除后的均价应上升;两者相等,均价不变。若方向相反,公式引用范围很可能错了。测试只在工作副本中进行,原始记录不删除。
平台页面显示的平均价若与复算不同,先比较统计范围。页面可能按一张订单聚合,你的表格却混入了同日其他订单;页面可能用完整精度,你抄的是缩短后的显示值;页面也可能只展示选定时间范围。把范围、单位和精度对齐后仍不一致,再带着具体差值求助。
只成交一笔时,公式仍然成立
若整张订单只有一条成交,成交金额就是价格乘数量,再除以同一个数量,平均价自然回到该笔成交价。这是一个很好的表格测试:单行组算不回原价格,说明公式引用、数字格式或单位至少有一处错误。
多行组则可以逐步扩展。先用前两行算一次,再加入第三行,看均价怎样移动。新加入的成交价高于加入前的均价,整体均价应向上移动;低于加入前的均价,整体均价应向下移动;两者相等,均价不变。移动幅度还取决于新行数量,数量越小,影响越轻。
如果加入一笔很小的成交后均价突然大幅跳动,常见原因是把成交金额误放进数量列,或其中一行用了不同报价资产。先查列与单位,再讨论市场原因。
数量为零或缺失的行,不能硬放进公式
导出文件里若出现状态行、汇总行或缺少成交数量的行,先确认它是不是实际成交。没有成交数量,就不能作为一笔成交参与加权;用零作分母还会让公式报错。保留原行并标注待确认,不要为了让表格能算就随手填一个数量。
订单记录里的原始数量也不能补到成交明细里。原始数量是计划值,只有真实成交数量才能进入平均价分母。
对手方数量多不等于你应该看到相同数量的明细行。聚合方式由当前记录载体决定。你能验证的是手上这些行的范围、共同标识和加总关系,不能用公式倒推出平台没有展示的每一次内部匹配。页面切换或重新导出后粒度不同,也要分别注明来源,不把两份记录简单拼接后去重。
- 所有行是否同一订单、同一交易对、同一方向?
- 总成交数量是否等于订单记录里的已成交数量,或能解释差异?
- 平均价是否落在本组最低与最高成交价之间,每笔影响是否与其数量占总量的比例一致?
- 手续费是否按资产单列,没有混进成交均价?
若第一步就缺少共同订单编号,不要把“时间很近”写成“确定属于同一单”。可以先在订单、成交与资金记录导出指南里确认应该保留哪几份记录,再向官方支持询问当前载体是否提供关联字段。对外求助只给必要的交易对、时间、截短的编号和计算过程,不发送密码、验证码或 API Secret。
平均价的数学只有一行,真正难的是选对行、保留单位和不改原始数。只要把“先归组、再乘法、分别求和、最后相除”按顺序做,多条成交就不会再变成一团看不懂的数字。