让 AI 写的币安交易脚本先上现货测试网:换哪几个地址、哪些接口用不了、数据为什么会清空
用 AI 写出一段币安交易脚本不难,难在写完之后怎么安全地试。币安给现货 API 准备了一个测试网:资金是虚拟的,限频和过滤器和实盘基本一致,但只有 /api 接口、数据大约每月清空一次。
1. AI 写的脚本,为什么先别碰真钱 #
让 ChatGPT、Claude 或 DeepSeek 写一段「价格跌到某个位置就挂单买入」的脚本,很快就能跑起来。问题在于,你很难只靠读代码确认它每一处都对:买卖方向、数量单位、价格精度、循环退出条件,任何一处写反,真账户上就是真成交。AI 给出的代码看起来越完整,越容易让人跳过验证这一步。
币安给现货 API 准备了一个专门的测试环境:注册现货测试网的用户会自动拿到多种资产的余额,这些不是真实资产,只能在测试网里用;测试网上的资金全部是虚拟的,既转不进来,也转不出去。脚本在这里下错一百单,损失也是零。
2. 接测试网:先拿一把测试网的 Key,再换掉地址 #
文档给的步骤只有两步:第一步,登录测试网网站并生成 API Key;第二步,照常按现货 API 文档写代码,只是把接口地址换成测试网的。
| 类型 | 实盘地址 | 测试网地址 |
|---|---|---|
| REST API | https://api.binance.com/api | https://testnet.binance.vision/api |
| WebSocket API | wss://ws-api.binance.com/ws-api/v3 | wss://ws-api.testnet.binance.vision/ws-api/v3 |
| WebSocket 组合行情流 | wss://stream.binance.com/stream | wss://stream.testnet.binance.vision/stream |
表里只列了三行。文档原表里还有 REST 备用域名、单路行情流、SBE 行情流和 FIX 接口在测试网的对应地址,用到时去原页查。
让 AI 改代码时,把这件事说成一句明确的要求:所有地址集中写在一个配置项里,默认指向测试网。脚本里散落着好几处写死的 api.binance.com,换环境时漏掉一处,就会出现「一半请求打测试网、一半打实盘」的情况。按文档第一步,测试网要单独生成 API Key;别拿主站账户的 Key 去连测试网,也别反过来。
testnet.binance.vision 返回的提示是:Service unavailable from a restricted location according to 'b. Eligibility' in https://www.binance.com/en/terms。提示里援引的是币安服务条款的资格(Eligibility)条款。看到这段提示,就说明你所在的网络位置用不了,别去找绕过的办法。
3. /sapi 开头的接口,测试网上没有 #
文档的回答是:测试网只提供 /api 开头的接口,/sapi 开头的不能用。能用的是这几类:
- 行情数据:REST 接口、WebSocket API 请求、WebSocket 行情流
- 交易:REST 接口、WebSocket API 请求
- 账户:REST 接口、WebSocket API 请求
- 用户数据流(User Data Streams)
这对 AI 写的脚本有个直接后果:如果代码里有调用 /sapi 开头的接口,那部分在测试网上根本跑不到,测试网跑通了也不代表它没问题。上实盘前,把脚本里所有接口路径列出来,凡是 /sapi 开头的,单独标出来,清楚知道「这几处从没被测过」。
4. 钱是假的,限制是真的 #
资金虚拟,不等于规则放宽。文档的说法是:测试网上的 IP 限频、下单频率限制、交易所过滤器和交易对过滤器,总体上和现货 API 一致;并建议用户定期查询接口拿最新的限频和过滤器,比如请求 /api/v3/exchangeInfo。
AI 写的代码里,最值得查的是有没有写死的数字:最小下单数量、价格精度、每秒请求次数。这些数字要是写成代码里的常数,对某个交易对成立,换个交易对就未必成立。让脚本启动时先读 exchangeInfo,按返回的过滤器去修正数量和价格,测试网和实盘用同一段逻辑,比两边各写一份常数稳妥。请求被限频拒绝时脚本怎么退避、会不会疯狂重试,也正好在测试网上试出来。
5. 数据会突然清空:约每月一次,不提前通知 #
测试网用上一段时间,就会碰到某天订单记录全部清空。文档里这个问题的标题就叫「All my data has disappeared! What happened?」,回答是:
- 测试网会定期重置到空白状态,挂着的单和已成交的单都会清掉;
- 重置时,所有用户会自动重新拿到一份各类资产的余额;
- 重置大约每月一次,不提前通知;
- 自 2020 年 8 月起,重置时 API Key 会保留,不用重新申请。
脚本要是假设「上次挂的单还在」「持仓一定是我上次留下的数」,重置那天就会出错。让 AI 写脚本时加一条要求,每次启动都先查当前挂单和余额,再决定下一步,而不是读本地缓存的状态。你自己的测试记录也别只放在测试网上,需要留存的成交结果,脚本跑的时候就写进本地日志。
另外一个小细节:文档说测试网上 klines 和 uiKlines 两个请求始终返回相同的数据。如果 AI 写的逻辑依赖两者的差别,测试网上是验证不出来的。
6. 签名方式:HMAC、RSA、Ed25519 的密钥各由谁生成 #
测试网文档顺带讲了三种 API Key 的区别,选哪种会影响你怎么保管密钥:
| 类型 | 谁生成签名用的密钥 | 文档里的要点 |
|---|---|---|
| HMAC-SHA-256 | 币安替你生成 secret | 文档介绍 RSA 时,把 RSA 写成它的替代方案 |
| RSA | 你自己生成公私钥,只把公钥交给币安,用私钥签名 | 支持 2048 到 4096 位,推荐 2048;签名用 PKCS#1 v1.5,不支持 PSS |
| Ed25519 | 同样是你自己生成密钥对、只交公钥 | RSA 之外的另一种非对称方案 |
RSA 和 Ed25519 的私钥由你自己生成,币安那边只拿到公钥。文档在生成私钥那一步写的是:这个文件不要给任何人。「任何人」也包括 AI 对话框:让 AI 帮你写签名代码,给它看公钥格式、给它看报错信息都行,私钥和 secret 一个字符都别贴进去。实盘 Key 该开到哪一档权限,照给 AI 开 Binance API 的最小权限配置来开。
7. 如果要切回实盘,先对着这张表过一遍 #
- 地址:所有接口地址是不是只从一个配置项读取,切实盘时改的是这一处,没有漏网的写死地址。
- 没测到的部分:脚本里 /sapi 开头的接口有哪些,你是否清楚它们在测试网上从没跑过。
- 过滤器:数量、价格精度是不是按
exchangeInfo实时修正,而不是 AI 给的常数。 - 状态:脚本启动时会不会先查挂单和余额,测试网重置那种「一切清空」的情况它能不能正常处理。
- 密钥:实盘 Key 是单独新开的,权限只开到这个脚本真正需要的那一档,私钥和 secret 没有进过任何 AI 对话。
地址、过滤器、状态、密钥这四项,最好在让 AI 写代码的时候就提出来,而不是写完再返工。可以把下面这段贴在你的需求前面:
写这段调用币安现货 API 的脚本时,必须满足下面四条:
1. 所有接口地址(REST、WebSocket)集中写在一个配置项里,默认指向现货测试网 https://testnet.binance.vision/api;切到实盘时只改这一处,代码其他地方不许出现写死的地址。
2. 启动时先请求 /api/v3/exchangeInfo,按返回的过滤器修正下单数量和价格精度;不要把最小下单量、价格精度、请求频率写成常数。
3. 启动时先查询当前挂单和账户余额,按查询结果决定下一步;不要假设上次运行留下的订单或持仓还在。
4. API Key、secret 和私钥从环境变量读取,不要写进代码;也不要让我把它们贴给你,示例里一律用占位符。
AI 交回代码后,逐条在代码里找到这四条各落在哪一行,别凭它一句「已按要求实现」就放行,道理和AI 错判时怎么识别一样。
— PromptDeck, 2026-09-16