1
交易所是什么
本节新词交易所 · 撮合 · 币 · USDT · 交易对
交易所就是一个让陌生人互相买卖东西的市场。它自己不卖东西,只负责把"想买的人"和"想卖的人"配对,每成交一笔就收一点手续费。
交易所 exchange
生活例子像闲鱼:你挂出一个二手手机卖 2000 块,别人来买。闲鱼不卖手机,只负责把买家和卖家配对(行话叫撮合)和收钱。区别在于交易所里卖的都是同一种东西(比如比特币),所以不用看货,只比价格。
Java 类比一个后端服务:账户系统(每个人有多少钱、多少币)+ 撮合引擎(把买单和卖单配对)。你要去的"策略交易组"是在这个服务之上做自动买卖的机器人。
币 和 USDT
大白话币就是被买卖的东西,最有名的是比特币(BTC)、以太坊(ETH)。它们的价格每秒都在变。
USDT 是一种特殊的币,价格被设计成永远约等于 1 美元。它就是交易所里的"钱",大家用它来标价格、算盈亏。
生活例子游戏里的"金币":你先把人民币换成金币,然后用金币去买装备。USDT 就是这个金币,1 USDT ≈ 1 美元 ≈ 7 块人民币。下文所有"U"都是 USDT 的简称。
交易对 symbol / trading pair
大白话"用什么买什么"。BTC-USDT 意思是用 USDT 买卖 BTC,价格 60000 表示 1 个 BTC 值 60000 U。
Java 类比每个交易对有自己独立的一套撮合,可以理解为 Map<String symbol, MatchingEngine>。
2
订单簿:大家在排队
本节新词订单 · 买单 · 卖单 · 订单簿 · 买一价 · 卖一价 · 价差 · 档位 · 成交
你想买,就提交一张"买单",写上愿意出的价格和数量;你想卖,就提交一张"卖单"。还没成交的单子全部排在一个公开的列表里,这个列表叫订单簿。
价格(U) 数量(BTC)
卖单 ↑ 60,050 1.0 ← 有人想以 60050 卖 1 个
(想卖) 60,020 0.5
60,010 0.3 ← 卖一价:现在最便宜的卖单
───────────────────────────── 中间这道缝叫"价差"
60,000 0.4 ← 买一价:现在出价最高的买单
买单 59,990 0.8
(想买) ↓ 59,950 1.2
红色是卖单(越往下越便宜),绿色是买单(越往上出价越高)。两边中间有一条缝:最高买价 60000 < 最低卖价 60010,所以此刻没人成交。这条缝叫价差(卖一价 − 买一价 = 10)。订单簿里每一个价格叫一"档",也叫一个档位,比如 60010 这一档挂着 0.3 个。
什么时候会"成交"
大白话买的人出价 ≥ 卖的人要价,就成交。比如有人突然出价 60010 买 0.3 个,正好碰上卖一价的那张卖单,这 0.3 个就成交了,这张卖单从订单簿上消失,卖一价变成 60020。
排队规则价格优先,时间优先。出价高的买单排前面,同样价格先来的排前面。跟银行排队叫号一样。
Java 类比两个 PriorityQueue:买单按价格从高到低,卖单按价格从低到高,同价按时间先后。买一价、卖一价就是两个队列的 peek()。
PriorityQueue<Order> bids = new PriorityQueue<>( // 买单
comparing(Order::price).reversed().thenComparing(Order::time));
PriorityQueue<Order> asks = new PriorityQueue<>( // 卖单
comparing(Order::price).thenComparing(Order::time));
// 新买单进来:while (asks.peek().price <= buy.price) 就成交
3
两种下单方式和手续费
本节新词限价单 · 市价单 · 挂单 · 吃单 · 手续费
限价单 limit order
大白话"我只接受这个价格或者更好的价格。"写死价格,价格不到就一直排着等。
例子现在卖一价 60010。你下"限价买单:59000 买 0.01 个",它不会马上成交,而是排进订单簿的买单那一边等着。哪天价格跌到 59000,才会成交。
市价单 market order
大白话"我不管价格,马上给我成交。"系统直接从订单簿里最便宜的卖单开始买,一个不够就买下一个。
代价快,但价格你控制不了。买得多的话,会越买越贵,这就是下一节要讲的"滑点"。
挂单 和 吃单 maker / taker
大白话挂单:你的单子没有马上成交,而是挂在订单簿上等别人来。你给市场"提供"了一个价格。
吃单:你的单子一进来就和订单簿上已有的单子成交了,你"拿走"了别人挂的价格。
为什么要区分手续费不一样。交易所希望订单簿上挂的单子多,所以挂单手续费通常更便宜,比如挂单 0.08%、吃单 0.1%(具体费率各家不同,这里只是举例)。
Java 类比挂单 = queue.offer(order),进队列等;吃单 = 从对面队列 poll() 走现成的单子。
手续费 fee
大白话每成交一笔,交易所按成交金额收一个百分比。买的时候收一次,卖的时候再收一次。
算一遍用 600 U 买了 0.01 个 BTC,手续费 0.1% → 付 0.6 U。之后以 610 U 卖掉,再付 0.61 U。两次一共 1.21 U。
4
滑点:你看到的价格不是你成交的价格
本节新词滑点 · 成交均价
滑点就是"你以为能成交的价格"和"实际成交的平均价格"之间的差。
滑点 slippage
生活例子菜市场有 3 个摊位卖白菜:第一家 2 块但只剩 3 斤,第二家 2.2 块有 5 斤,第三家 2.5 块。你要买 10 斤,只能三家都买,平均下来远不止 2 块。你看到的"2 块"只对前 3 斤有效。
在交易所订单簿上卖一价 60010 只有 0.3 个。你用市价单买 1 个,就得把 60010、60020、60050 三档都吃掉,实际的成交均价(总共花的钱 ÷ 买到的数量)比 60010 高,高出来的部分就是滑点。
第二种滑点还有一种是"慢了":你看到 60000 决定买,等下单请求到达交易所时,价格已经涨到 60030 了。跟单系统里说的滑点主要是这种(第 11 节会讲)。
拖一下:用市价单买不同数量订单簿就是第 2 节那张
你看到的价格(卖一价)60,010.00
实际成交均价–
滑点–
因此多花了–
成交均价 = 总共花的钱 ÷ 总共买到的数量。拖到 0.3 以下,滑点是 0;越往右,吃掉的档位越多,滑点越大。
5
一买一卖怎么算钱
本节新词一轮(round trip)· 盈亏 · 已实现盈亏 · 浮盈浮亏
买进来再卖出去,这一来一回叫"一轮"。英文 round trip 就是"往返"的意思。一轮的利润 = 卖出拿到的钱 − 买入花掉的钱 − 两次手续费。
一轮利润 profit per round trip
公式(卖价 − 买价) × 数量 − 买入手续费 − 卖出手续费
算一遍59000 买 0.01 个,60000 卖掉,手续费 0.1%:
差价:(60000 − 59000) × 0.01 = 10 U
手续费:590 × 0.1% + 600 × 0.1% = 0.59 + 0.60 = 1.19 U
一轮净赚:10 − 1.19 = 8.81 U
已实现盈亏 和 浮盈浮亏
大白话已实现:已经卖掉了,钱落袋了,赚多少亏多少已经定了。
浮盈 / 浮亏:还拿在手里没卖,按现在的价格算"如果现在卖"会赚多少、亏多少。价格一变它就变,所以叫"浮"。
例子59000 买了 0.01 个,现在价格 57000,没卖。浮亏 = (57000 − 59000) × 0.01 = −20 U。只要不卖,这 20 U 就还没真正亏掉,但也可能越亏越多。
6
网格交易:自动低买高卖
本节新词网格 · 区间 · 格子 · 踏空 · 被套 · 等差 / 等比
网格机器人做的事只有一件:在一个价格范围里,每跌一格就买一点,每涨一格就卖一点,一直重复。价格来回晃一次,它就赚一轮。
从一个想法开始
场景你觉得 BTC 接下来一段时间会在 55000 到 65000 之间来回晃,不会大涨也不会大跌。这个范围叫区间。区间的最高价 65000 叫上沿,最低价 55000 叫下沿。
做法把区间按 1000 一档切成 10 格(每一格叫一个格子,格与格之间的价差叫格距,这里是 1000):55000、56000 … 65000。当前价格 60000,所以
· 在 59000、58000 … 55000 各挂一张买单(跌下来就买)
· 在 61000、62000 … 65000 各挂一张卖单(涨上去就卖)
每张都是 0.01 个 BTC。
核心规则某一格的买单成交了 → 马上在上一格挂卖单。某一格的卖单成交了 → 马上在下一格挂买单。这样每一对"低一格买、高一格卖"就是一轮,赚一格的差价(上一节算过:约 8.81 U)。
一个细节上面的卖单要卖币,你手里得先有币。所以机器人启动时,会先用一部分钱按当前价买入这些币。下面的演示里:总资金 6000 U,先花 3000 U 买 0.05 个 BTC 给 5 张卖单备货,剩下 3000 U 留给买单。
Java 类比一个事件驱动的状态机:TreeMap<价格, 格子状态>,状态是 买单 / 卖单 / 空。每来一个"成交事件",就改掉这一格的状态,并在相邻那一格挂反向单。
一步一步看网格怎么跑每一步价格移动一格 · 手续费 0.1%
滚到这里会自动一步步播放,像一段录屏;点"暂停"或任何按钮就停下,可以自己接着点。先用"来回震荡"一路点"下一步":看左边格子里买单、卖单怎么交替出现,右边"网格已赚"怎么一轮轮增加。再换"一路上涨""一路下跌",对比最后两格:网格的总资产和"一开始全买 BTC 拿着"谁多。
选一种行情:
手里的 USDT–
手里的 BTC–
网格已赚(已实现)–
总资产(按现价)–
对比:一开始全买 BTC 拿着–
网格什么时候不赚钱
踏空价格一路涨出区间上沿。卖单全部成交,币全卖光了,手里只剩 USDT。价格再涨也和你没关系了,赚得比"一开始买了就拿着不动"少得多。在演示里选"一路上涨"就能看到。
被套价格一路跌出区间下沿。买单全部成交,钱全换成了币,而且都是比现在贵的价格买的,账面上是浮亏。只有等价格涨回来才能解套。选"一路下跌"看看。
格子太密格子分得越细,每一轮赚的差价越小,但手续费不变。差价小到跟两次手续费差不多时,就是白忙(第 5 节最后那个例子)。
常见误区 · 格子越多越赚格子越密,成交次数越多,但每一轮赚得越少。先算每格利润率 = 格距 ÷ 价格,它必须大于买、卖两次手续费加起来。例:价格 60000,手续费每边 0.1%(两边共 0.2%)。格距 1000 → 1000 ÷ 60000 ≈ 1.67%,大于 0.2%,能赚;格距 100 → 约 0.17%,小于 0.2%,每成交一轮都在亏。交易所的网格产品在参数页一般会直接显示每格利润率,建网格之前先看这个数。
等差 和 等比 arithmetic / geometric
等差每格价格差一样:55000、56000、57000 …(每格差 1000)
等比每格涨幅一样:比如每格都涨 2%:55000、56100、57222 …。价格范围很大时用等比更合理,因为从 100 涨到 101 和从 10000 涨到 10001 意义完全不同。
7
补仓、均价和定投(DCA)
本节新词仓位 · 补仓 · 持仓均价 · 回本 · 止盈 · DCA
仓位 和 补仓
大白话仓位:你手里现在拿着多少币。补仓:已经买了一些,价格跌了,再买一些。
持仓均价(持仓成本)
算一遍价格 100 时花 100 U 买了 1 个;跌到 80 又花 100 U 买了 1.25 个。
一共花 200 U,买到 2.25 个 → 均价 = 200 ÷ 2.25 ≈ 88.9。
价格只要涨回 88.9 就不亏了,不用等到 100。这就是补仓的作用:把均价拉低,回本更容易。
回本需涨多少现价 80,均价 88.9 → 需要涨 (88.9 − 80) ÷ 80 ≈ 11%。
止盈
大白话事先定好"赚到多少就卖"。比如"涨到比均价高 3% 就全部卖掉"。
DCA(定投 / 分批买入)Dollar-Cost Averaging
交易所的 DCA 机器人规则通常是:先买一笔;价格每跌一段(比如 5%)就再买一笔;等价格涨到均价上方一定比例(比如 3%)就全部卖出(止盈),然后重新开始。
Java 类比一个按条件触发的任务:if (price <= lastBuyPrice * 0.95) buy(); if (price >= avgCost * 1.03) sellAll();(lastBuyPrice 是上一次买入的价格,avgCost 是持仓均价,sellAll 是全部卖出)
8
马丁:每次补仓都翻倍
本节新词马丁(马丁格尔,Martingale)· 倍投
马丁是一种补仓方式:每次补仓的钱,是上一次的 2 倍(或其他倍数)。这样均价会被拉得非常快,一点小反弹就能回本赚钱。代价是:连续下跌时,需要的钱翻倍翻倍再翻倍。
名字从哪来
赌场倍投马丁原本是 18 世纪赌场里的一种下注法:猜硬币,输了就把下一把的赌注翻倍。第一把押 1 块输了,第二把押 2 块,再输押 4 块……只要赢一次,就能把之前输的全部赢回来,还多赚 1 块。
致命问题连输 10 把,第 11 把要押 1024 块,前面已经输了 1023 块。只要钱不够继续翻倍,就是一次性全亏光。
Java 类比跟重试的指数退避(exponential backoff)一个形状,amount = base * Math.pow(2, n)(base 是首单金额,n 是第几次补仓)。只不过退避翻倍的是等待时间,马丁翻倍的是真金白银。
普通补仓 vs 马丁补仓首单 100 U · 每跌 5% 补一次
拖动滑块,对比两组的"累计投入"和"均价":跌得越多,马丁的累计投入涨得越凶,但它的均价也更靠近现价,回本需要的反弹更小。
Tips · 开马丁之前,先算"补满要多少钱"首单 100 U、每次翻倍、最多补 7 次:一共要 100 + 200 + 400 + … + 12,800 = 25,500 U。如果每跌 5% 补一次,补满 7 次时价格已经比首单低了约 30%(0.95 的 7 次方 ≈ 0.698)。所以设马丁参数时先问两个数:补满一共要多少钱、那时价格跌了多少。钱不够补满,就把次数或倍数调小。
9
杠杆、保证金、强平(只讲够今天用的)
本节新词现货 · 合约 · 杠杆 · 保证金 · 强平 · 平仓
前面讲的都是现货:花钱买币,币真的到你账户里。合约不一样:你不真的买币,而是跟其他交易者就价格涨跌"对赌"(交易所在中间撮合、收手续费),而且可以用少量的钱押注大金额,这就是杠杆。
杠杆 和 保证金 leverage / margin
大白话保证金:你拿出来当押金的钱。杠杆:押金放大的倍数。10 倍杠杆 = 押 100 U,按 1000 U 的仓位算盈亏。
算一遍押金 100 U,10 倍杠杆,相当于买了 1000 U 的 BTC。
BTC 涨 5% → 1000 × 5% = 赚 50 U,押金变成 150 U(押金收益 +50%)。
BTC 跌 5% → 亏 50 U,押金只剩 50 U(−50%)。
BTC 跌 10% → 亏 100 U,押金全没了。
强平 liquidation,也叫"爆仓"
大白话押金快亏光时,交易所会强制帮你把仓位卖掉。把仓位了结、归零,行话叫平仓;被交易所强制平仓就是强平。它这样做是为了防止你亏的钱超过押金。你的押金基本就没了。
要记住杠杆越高,价格只要动一点点就会强平。20 倍杠杆,跌 5% 左右就爆了。实际会在押金还剩一点点的时候就强平,精确的算法 D2 再讲。
常见误区 · "只开 10 倍,不算高"押金能扛的跌幅大约是 1 ÷ 杠杆:10 倍约 10%,20 倍约 5%,100 倍只有约 1%。BTC 一天波动 5% 并不少见。而且实际强平比押金亏光更早(D2 会算出 10 倍是跌约 9.55% 就强平)。判断风险要看"能扛多少跌幅",不要只看"开了几倍"。
10
做多、做空和合约网格
本节新词做多 · 做空 · 合约网格
做多 long
大白话看涨。先买后卖,价格涨了赚钱。前面讲的全都是做多。
做空 short
生活例子你觉得某款手机下个月会降价。你先找朋友借一部,今天按 5000 卖掉;下个月降到 4000 时买一部还给朋友。你赚了 1000。如果手机反而涨到 6000,你就得花 6000 买回来还,亏 1000。
在合约里不用真的"借",合约直接支持做空:开一个做空的仓位(行话叫"开空单"),价格跌了你赚,涨了你亏。现货一般只能做多。
合约网格
大白话把第 6 节的网格搬到合约上。多了两件事:
① 可以加杠杆,赚得快,亏得也快,还有强平的风险;
② 可以选方向:做多网格(看涨,逻辑和现货网格一样)、做空网格(看跌,先卖后买)、中性网格(不猜方向,只赚来回晃的钱)。
11
跟单:自动抄高手的作业
本节新词带单员 · 跟单者 · 按比例跟单 · 固定金额跟单 · 分润
有人公开自己的交易,他叫带单员。你选择跟着他,他买什么,系统就自动帮你买什么,你叫跟单者。你赚了钱,要分一部分给他,这叫分润。
跟多少:两种方式
按比例带单员本金 10000 U,这次用 1000 U 买了 BTC,占他本金 10%。你本金 2000 U,系统就按同样的 10% 帮你买 200 U。
固定金额不管带单员买多少,他每开一单,你都固定跟 50 U。
跟单的滑点
大白话带单员先成交,系统收到消息,再去帮成百上千个跟单者一个个下单。这中间有延迟,价格已经动了,所以跟单者的价格几乎总比带单员差一点。
为什么这是你的活一个热门带单员可能有几千个跟单者。一条"带单员买入"的消息,要变成几千张订单,还要尽快、尽量公平地发出去。这正是你们组要解决的技术问题。
Java 类比发布-订阅 + 扇出:一条消息 → 查出 N 个订阅者 → 生成 N 个任务。跟发一条朋友圈、通知所有好友是一个形状。
12
词典和自测
七日冲刺页面上的词,这里基本都能查到。
自测 8 题
读完以后
回到 七日冲刺 D1,按这个顺序过一遍:先看网格动画(现在能看懂红线、绿线和圆点了),然后把马丁表的补仓倍数从 2 改成 1 对比一下,最后做 gridLevels 那道编程题。
你们组除了网格这类产品,还做量化交易:用程序按规则自动决定什么时候买卖、买多少、亏多少必须停。网格就是其中最简单的一种。量化怎么判断一个策略好不好,放在 D9 讲。