OASIS BLOG
← 回到七日冲刺D2 笔记 →
写给没碰过股票、期货、合约的 Java 程序员

D1 零基础速成笔记

从"交易所到底是什么"讲起,一直讲到网格、马丁、跟单。每个新词第一次出现时都会先解释清楚,再往下讲。页面里带下划虚线的词,点一下就能看解释。

怎么读按顺序读,后面的章节都建立在前面的基础上。一共 12 节,大约 2–3 小时。
每个概念都分四层大白话 → 生活例子 → 算一遍 → Java 类比。前两层看懂就够了。
读完以后回到七日冲刺的 D1,再看网格动画和那道编程题,会轻松很多。
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 就还没真正亏掉,但也可能越亏越多。
算一轮改数字试试
差价收入–
两次手续费–
一轮净利润–

把卖价改成 59100,差价只有 1 U,但手续费还是约 1.19 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 再讲。
押金 100 U,拖一拖简化版:押金亏完就算强平

先把杠杆拉到 20、涨跌拉到 −5%,看"押金还剩"变成 0;再把杠杆拉回 2,同样跌 5% 只亏 10 U。说明杠杆越高,能扛的下跌越小(最后一格"跌多少会强平")。

相当于持有–
盈亏–
押金还剩–
跌多少会强平–
常见误区 · "只开 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 个任务。跟发一条朋友圈、通知所有好友是一个形状。
跟一单算一算带单员本金 10000 U
你跟着买入–
你的收益(扣滑点前)–
滑点损失–
分给带单员–
你最后到手–

这里按"卖出后的盈利"来算分润,并且忽略了手续费。不同平台的分润规则不一样,比如有的按周期结算,有的要先补上之前的亏损才分。

12

词典和自测

七日冲刺页面上的词,这里基本都能查到。

自测 8 题

读完以后

回到 七日冲刺 D1,按这个顺序过一遍:先看网格动画(现在能看懂红线、绿线和圆点了),然后把马丁表的补仓倍数从 2 改成 1 对比一下,最后做 gridLevels 那道编程题。

你们组除了网格这类产品,还做量化交易:用程序按规则自动决定什么时候买卖、买多少、亏多少必须停。网格就是其中最简单的一种。量化怎么判断一个策略好不好,放在 D9 讲。