市场数学:盈利、亏损、和成本(基础篇)
◍ 算清每笔单子的真实盈亏
很多交易者只看终端里跳出来的浮盈数字,却没意识到那只是毛利润,没扣点差也没算掉期。MT5 里一笔市价单的盈亏,本质是(收盘价-开盘价)× 合约规模 × 手数,再按报价精度折算成账户货币;点差在成交瞬间就已经吃掉了一小段净值。 开盘价和收盘价之间的点差并不进入你的盈亏公式,但它决定了你进场那一刻的隐性成本。以 EURUSD 为例,若 broker 点差为 1.2 点、你做 0.1 手,开仓即浮亏约 1.2 美元,这部分不会在平仓公式里显现,却真实存在。 最精准的盈亏算法不是用 OrderProfit(),而是结合订单开仓价、当前 tick 价与成交量重算,尤其当订单被部分平仓时,终端自带字段会和实际不符。掉期利息也常被低估:MT5 的 OrderSwap() 在跨日、节假日与三层掉期日会得到不同值,直接读取比自己拍脑袋估算可靠。 想验证这套逻辑,打开 MT5 策略测试器跑一段历史,对比终端显示的 Profit 与你用开平仓价手算的结果,差值往往就是点差与掉期残留。外汇和贵金属杠杆高,点差与掉期会侵蚀胜率,实盘前务必在模拟账户把这套核对跑通。
为什么盈亏细节迟早会咬人
写 EA 时大多数人不会先去抠平仓盈亏到底怎么算。MQL5 甚至 MQL4 都把计算函数封装好了,直接调 OrderProfit()、HistoryDealGetDouble() 就能拿数,谁还去翻模型。
但跑实盘一段时间后,问题会自己冒出来:点差滑点下的净盈亏对不上、部分平仓的浮动计算看不懂、不同订单类型的手续费归属模糊。这些以前觉得无关紧要的细节,积累到一定交易量就会变成对账黑洞。
我翻过不少公开资料,发现这一块内容稀少且零散,没有成体系的中文梳理。于是自己推导了一套完整数学模型,后面会带你把订单相关的每一项都算明白。外汇和贵金属杠杆高,算错一笔就可能误判策略真实表现,建议边读边开 MT5 验证。
「把点差、佣金、掉期拆进盈亏公式」
写 EA 之前得先搞清楚一笔单子到底赚在哪、亏在哪。MQL5 有 OrderCalcProfit 这种内置函数,但只调函数不懂底层的量化关系,遇到点差滑点佣金掉期叠加时就容易算偏。下面把最简模型逐步加料,拆到能直接落进代码为止。 先忽略点差、佣金、掉期,纯按出价算:买单 PrBuy = Lot * TickValue * [(PE-PS)/Point],卖单 PrSell = Lot * TickValue * [(PS-PE)/Point]。其中 Point 是最小价格变动,TickValue 是动一个点对应的盈亏值,PE/PS 都是 Bid 层面的收盘价与开盘价。MQL5 里这俩量可用预定义变量或 SymbolInfoDouble 拿。 但真实成交买入按 Ask 开、卖出按 Bid 开;平仓反过来。修正后:PrBuy = Lot*TickValue*[(Bid2-Ask1)/Point],PrSell = Lot*TickValue*[(Bid1-Ask2)/Point]。这里 Bid1 卖开、Ask1 买开、Bid2 买平、Ask2 卖平。 佣金两种常见算法:Comission = Lot*TickValue*ComissionPoints,或 Comission = Lot*ContractSize*BidAlpha*ComissionPercent/100。ContractSize 也是内置可取的品种参数,BidAlpha 是把基准货币掉期折算成账户货币的乘数,分四种:同币为1、直盘取 Bid、过渡盘取对应汇率 Bid、无直盘取 1/Ask。以 USDJPY 为例,合约规模默认 100000,点值 TickValue 约 1000 日元每手每点(依报价精度)。 掉期利息结构类似:Swap = Lot*TickValue*SwapPoints*SwapCount,或 Lot*ContractSize*BidAlpha*SwapPercent/100*SwapCount。SwapCount 粗略可用 MathFloor((EndTime-StartTime)/(24*60*60)) 估算持仓过夜天数。 把点差单独拧出来:PrBuy = Lot*TickValue*[(Bid2-Bid1)/Point] + (-Lot*TickValue*S1),PrSell 同理用 S2。可见经纪商在点差上拿走的 SpreadBuy = -Lot*TickValue*S1,且买开时即被抽走 S1 对应的点值。开立多头与平空头在点差处理上等价,这套等式可直接塞进任何 MQL5 EA 做实时盈亏分解。
◍ 点差藏在中间价的上下半边
不少人默认点差只在买入那一瞬间被经纪商吃掉,其实这是错觉。把一天切到下一天的 0:00 看,几乎所有货币对都会先朝下跳一截再等幅弹回,根因就是此刻点差瞬间放大、市场深度短暂解体。 Bid 和 Ask 本质是镜像:把 EURUSD 倒成 USDEUR,出价变要价、要价变出价,只是把市场深度反转。图表上通常不画 Ask 线,但周期拉大后 Ask 与 Bid 会自然收敛融合,高频交易里这半点差绝不能无视。 定义中间价 Mid = (Ask + Bid) / 2,可反推 Bid = Mid – (S*Point)/2、Ask = Mid + (S*Point)/2。代入买卖盈亏原式后得到: PrBuy = Lot * TickValue * [(Mid2 – Mid1)/Point] – Lot * TickValue * (S1/2 + S2/2) PrSell = Lot * TickValue * [(Mid1 – Mid2)/Point] – Lot * TickValue * (S1/2 + S2/2) 说明经纪商收的点差成本同时挂在入场和平仓两处,各吞半边。 把负值合计单独拎出来就是 Spread = -Lot * TickValue * ((S1*Point)/2 + (S2*Point)/2),理想不含费的利润则是 ProfitIdealBuy = Lot * TickValue * [(Mid2 – Mid1)/Point]。汇总和贵金属属高风险,点差随流动性突变可能让实测滑点偏离理论值。 TickValue 本身动态且分品种,不拆组件直接算只是近似。用极限式 Lim[dP->0] 可逼出精确盈亏函数,它不仅能反推最准计算率,还能暴露走势失衡——这才是后面抓价差漏洞的基石。