M合约模拟盘模拟交易·虚拟资金
—

模拟规则

这是一个用币安真实行情驱动的模拟盘:行情是真的,账户、撮合、风控、强平全部由我们自己实现,不会产生任何真实下单,USDT 由本地服务发放。

这一页的原则是一句话:宁可说做不到,不要编数字。凡是我们拿不到真实数据的地方,宁可拒单、暂停撮合、显示「--」,也不给你一个看起来合理、实际是编的数。

和真实交易所的差别

下面 9 条是明确知道并选择接受的差距。每一条都对应一个「本可以造假但选择不造」的决定。

1.你的单不进真实盘口,不产生市场冲击

现象
无论下多大的单,币安那边的价格不会因为你而动一下。
为什么
要模拟「大单把价格推走」得建市场冲击模型,那是研究课题,不是能「大概估一个」的东西。
对你
你只会遇到逐档吃单的滑点。真实交易里大单还要承担把价格推走的成本,这部分你练不到。

2.多个模拟用户可以吃掉同一档流动性

现象
十个人同时市价买,都能按同一个价格成交。
为什么
要做流动性竞争就得引入一套全局流动性账本,所有人抢同一份深度。
对你
不会出现「别人抢先、你的成交价变差」。真实市场里会。

3.挂单的排队位置是估算的

现象
委托列表里的「前方排队」带 ≈ 号时,是估算值。
为什么
币安不公开队列内部顺序,任何人都只能从公开数据里推断。我们的办法是「下单时估一个上限,之后用盘口总量夹逼、用成交量消耗」。
对你
你的限价单成交时机可能比真实早一点或晚一点。

4.盘口深度最多 1,000 档

现象
吃穿一半以上可见深度的市价单会被**拒单**,不会硬成交。
为什么
币安快照上限就是 1,000 档,这已经是能拿到的全部。超出的部分价格是多少,我们不知道。
对你
特别大的单下不出去。这是有意的——拒单比编一个价格给你诚实。

5.没有保险基金,也没有自动减仓(ADL)

现象
极端行情下你不会被「自动减仓」。
为什么
这两套机制的工程量接近再做一个撮合引擎。
对你
比真实交易所安全。真实市场里盈利方的仓位可能被强制减掉。

6.穿仓不追偿

现象
全仓爆仓后余额归零,不会变成负数。
为什么
模拟盘让用户背一笔虚拟债务没有意义。
对你
真实交易里极端行情可能倒欠交易所钱,这里不会。

7.行情断线期间暂停撮合

现象
顶部出现黄色横幅时,下单入口全部禁用;这段时间的价格变动不产生任何成交。
为什么
拿不到行情就不知道那一刻的真实价格。恢复后也不补算——不伪造历史。
对你
断线期间你的挂单、止损、触发单都不会触发。恢复后按恢复那一刻的行情继续。

8.挂单冻结的保证金比币安保守

现象
同时挂多空对敲单时,占用的资金比币安多。
为什么
我们把预留的吃单手续费也算进冻结里。
对你
方向是保守的:你可能觉得「钱不够用」,但不会出现超额开仓。

9.杠杆分层表每天同步一次

现象
币安盘中调整分层表时,我们最多滞后到次日 UTC 00:05。
为什么
调表是低频事件,日级同步足够;同步失败时保留旧表,不猜新值。
对你
极少数情况下,「当前杠杆最多能开多大」和币安当下的值不一致。

还有一条曾经被记为差别的:跨层杠杆超限时我们直接拒单。后来和币安核对过, 币安也是拒单(错误码 -2027),所以这条不算差别。

撮合与排队

你的单不会发到币安。它们进的是我们自己的挂单簿,靠两股真实数据来推动:币安的盘口快照(你看到的深度)和币安的逐笔成交(谁在什么价位成交了多少)。

  • ·市价单:按当前盘口逐档吃,成交均价就是逐档加权的结果。这就是你看到的滑点。
  • ·限价单:价格比对手价更优、吃不到的部分挂进队列当挂单方(Maker); 价格已经穿透盘口的部分立刻成交,按吃单方(Taker)收费。
  • ·条件单(止盈止损):入簿时不冻结保证金,触发那一刻才转成市价单或限价单, 重新走一遍完整的下单校验——所以触发时也可能被拒(比如那时候余额不够了)。
  • ·模拟用户的挂单互相不撮合。你的挂单要成交,得等币安那边在你的价位上真的成交了足够的量。

盘口深度与市价单拒单

我们从币安拿到的深度最多 1,000 档,这已经是公开数据的全部。界面上的盘口按你选的精度合并之后每侧显示 20 行, 但撮合用的是完整的那 1,000 档。

一笔市价单如果要吃掉超过一半的可见深度,会被直接拒单。 因为再往下的价格我们不知道——真实交易所那里还有深度,我们这里没有。 按「最后一档再加点滑点」硬成交,等于编一个数给你。

前方排队是怎么估的

委托列表里有一列叫前方排队:在你这个价位上,排在你前面还有多少量没成交。 币安不公开队列内部顺序,这个数是推出来的,分三步:

  • ·下单时估一个上限:你挂进去的那一刻,这个价位上已有的挂单量就是排在你前面的量。 如果这个价位超出了可见范围,只能估——这时候界面上会显示 ≈。
  • ·盘口更新时夹逼:下一张快照里这个价位总量变小了,说明前面的人要么成交要么撤了, 前方排队量跟着往下压。估算过的单一旦进入可见范围,直接换成真实值。
  • ·成交发生时消耗:币安在这个价位每成交一笔,就从你前方的量里扣掉。 扣到 0 之后,再成交的量才轮到你,按你的挂单价成交。

所以会出现这种情况:最新价已经碰到你的挂单价了,单子却还没成交。 这是对的——价格碰到只说明有人在那个价位成交,不等于排在你前面的量已经被吃完。真实交易所也是这样。

保证金、强平与资金费

公式和币安一致,唯一的区别是上面列出来的那几条。所有依赖账户全局状态的数(强平价、保证金率、 可用余额、未实现盈亏)都由服务端算,界面只负责显示,不自己算一份。

挂单方(Maker)--吃单方(Taker)--

按成交价 × 数量收。全站一个费率档,不按等级分。手续费按币安规则在开仓和平仓时各收一次。

强平清算费(只在被强平时收,比普通手续费高)

--

  • ·起始保证金 = 名义价值 ÷ 杠杆。名义价值按标记价算,不按最新成交价。
  • ·维持保证金按杠杆分层表算:仓位越大,要求的维持保证金比例越高, 能用的最高杠杆也越低。这张表每天从币安官方接口同步。
  • ·保证金率 = 维持保证金 ÷ 保证金余额。这个数达到 100% 就触发强平, 所以账户面板上它越高越危险。
  • ·全仓用整个账户的钱扛所有仓位,一个仓位亏损会拉低全部仓位的安全垫;逐仓每个仓位单独一份保证金,爆了只亏那一份。

强平

触发条件是权益跌到维持保证金以下(恰好相等也触发)。逐仓逐个仓位判,全仓按整个账户判。 触发之后的执行顺序:

  • ·先撤掉这个币对上的挂单,把冻结的保证金释放出来
  • ·下一张强平单,按当前盘口逐档吃。比破产价还差的档位不吃——吃了就要亏到别人头上
  • ·吃不完的部分,按破产价平掉(破产价就是「这个仓位的保证金刚好亏光」的那个价)
  • ·依次扣:已实现盈亏 → 吃单手续费 → 清算费。每一项最多扣到剩余资产为 0,不会把余额扣成负数

两点和真实交易所不同:我们不做部分强平(触发就平掉整个仓位); 也没有保险基金和自动减仓,所以吃不完的部分直接按破产价接管。

仓位表里的强平价有时候会显示 --,背后有三种互不相同的原因:

  • ·保证金相对仓位过于充足:算出来的强平价是负数或者根本不在合法价格区间内, 说明当前价格走到 0 也碰不到强平线。
  • ·双向持仓下的对冲:这个币对的多空仓位数量接近对冲,理论上不会被强平, 暂时算不出一个具体价格。
  • ·全仓行情未到齐:账户里还有别的币对没收到标记价,算不出全仓强平价。

三种情况都是"暂时算不出来",不是页面故障,我们不会拿一个凑出来的数字顶上。

资金费

永续合约靠资金费把合约价格拉回现货附近:费率为正时多头付给空头,为负时反过来。 费率用的是币安的真实费率,我们不自己算。

  • ·结算时间跟着币安走:币安的标记价推送里带着下一次结算时间,到点就结算, 币安调整结算间隔(默认 8 小时,按币对设置)我们自动跟上。
  • ·金额 = 仓位名义价值 × 费率,名义价值按标记价算。逐仓仓位从这个仓位的保证金里付。
  • ·行情断过线、拿不准结算那一刻的费率和标记价时,这一期不结算,也不事后补——同样是不编数字。
  • ·结算完会立刻扫一遍风控:资金费付出去之后保证金不够了,会当场触发强平。

账户与重置

  • ·开户发 10,000 USDT 模拟资金,同时记一笔「开户赠送」流水。
  • ·账户的铁律是余额等于全部流水之和。每一次余额变动——盈亏、手续费、资金费、强平、 逐仓划转——都有一条流水,在历史记录里能从上往下一路对到当前余额。

重置模拟账户

重置不是直接把余额改回去。为了守住上面那条铁律,服务端走的是正常流程: 撤掉全部挂单 → 按标记价平掉全部仓位 → 再补一笔「账户重置」流水把余额调回初始值。 所以重置之后,历史记录里那一串平仓成交是真实存在的。

  • ·24 小时只能重置一次。冷却中时按钮不可点,界面会显示什么时候能再来。
  • ·重置会影响排行榜:统计周期内重置过的账户,不进当期的日榜和周榜 (否则亏完就重置,收益率可以刷)。
  • ·排行榜的收益率以期初权益为分母,胜率按平仓成交算, 当期有成交才上榜。权益快照每天 UTC 00:00 拍一次,错过的那天不补。