量化喵是独立第三方信息站,不是欧易(OKX)官方。注册按钮含邀请码 OK30001 完整披露 →

欧易 · 基础

欧易模拟盘怎么用:先拿假钱把策略跑通

写好了一个策略脚本,手指悬在回车键上,该不该让它在真账户上跑?这种犹豫是对的。新手量化最贵的学费,往往不是亏在行情上,而是亏在一个写反的判断、一个少打的小数点上——而这些错,本来在模拟盘里五分钟就能暴露。

这篇我们(量化喵编辑组)把欧易模拟盘讲透:它是什么、为什么上真金前必须先走它、怎么开、用 ccxt 怎么连(关键就一行),以及它会在哪些地方悄悄骗你。读完你应该能把自己的脚本切到模拟盘里安全地反复折腾,确认一切正常,再用改一行代码的代价切回真金。

invite_codes.env1

模拟盘(Demo Trading)是什么

欧易的模拟盘叫 Demo Trading(模拟交易)。简单说,它是一个用虚拟资金运行的平行账户:行情、界面、下单流程都跟实盘一样,唯独你下单花的不是真钱,而是系统发给你的一笔假 USDT。你在里面买卖、挂网格、跑脚本,赚了亏了都跟你的真实余额没关系。

对量化的人来说,这里有个必须先记住的前提:模拟盘要用它自己的 API Key。你得在模拟交易环境里单独建一把 Demo Trading API Key;官方文档给的路径就是单独创建,别指望给实盘 Key 加个开关。好在代码这一侧几乎不用改——你为实盘写的脚本,换上模拟盘的凭证、再打开模拟盘开关,就能原样拿去先验证一遍。

为什么上真金前必须先走它

道理很朴素:程序不会犹豫。人手动下单,按确认前还能瞄一眼方向、数量对不对;脚本不会,它会忠实地把你写错的逻辑连续执行下去。一个搞反的买卖方向、一个循环里漏掉的退出条件,在实盘上就是真金白银连续往外流。

模拟盘把这类错误的代价降到了零。你可以放心地让脚本撞墙——下错单、撤错单、把价格写成市价导致瞬间成交,这些在模拟盘里都只是消耗虚拟 USDT,而每一次「撞」都帮你提前抓出了一个本会在实盘要你命的 bug。我们的经验是,新策略在模拟盘跑头几轮,十有八九能揪出至少一个自己没料到的问题。

除了抓 bug,模拟盘还帮你确认两件更基础的事:鉴权通不通(三个凭证填对了没)、回调对不对(下单后返回的字段、撤单状态、余额变化是不是你以为的那样)。这些都跟真金无关,纯属流程层面的验证,放在模拟盘做最划算。

怎么开模拟盘账户

开模拟盘比开 API 简单得多,不需要额外审批。下面是大致路径,以欧易(OKX)当前界面为准(入口位置偶有微调):

  1. 登录欧易,在 App 或网页端找到账户/交易区域的「模拟交易」或「Demo Trading」入口,通常在交易页面的账户切换处,或个人中心里。
  2. 点进去切换到模拟盘环境。切换后界面会有明显标识(比如顶部出现「模拟」字样),提醒你现在花的是假钱。
  3. 系统会给你一笔虚拟资金。额度用完了,一般能在模拟盘界面里手动重置,继续练。
  4. 如果你只想用网页/App 点点点地试网格、跟单这些内置机器人,到这一步就够了——直接在模拟盘环境里设参数跑即可。
  5. 如果你要用脚本连模拟盘,先在模拟交易环境里单独建一把 Demo Trading API Key(建 Key 的流程可参考我们的 API 量化入门),再靠代码里的开关切到模拟盘。

ccxt 怎么连模拟盘

这一节是脚本党最关心的。用 ccxt 连模拟盘,跟连实盘的区别有两处:多一行开关,以及凭证填的是模拟盘那把 Key 而不是实盘的。字段结构还是那三个:apiKey、secret,以及 password(也就是你建 Key 时设的 Passphrase,ccxt 里这个字段叫 password,新手最常漏)。

import ccxt

# 注意:这三项要填模拟盘(Demo Trading)那把 Key,不是实盘的
okx = ccxt.okx({
    'apiKey':   '模拟盘的_apiKey',
    'secret':   '模拟盘的_secret',
    'password': '模拟盘的_Passphrase',   # 欧易特有,ccxt 里叫 password
})

# 关键一行:让 ccxt 给后续请求带上模拟盘标记头
okx.set_sandbox_mode(True)

# 自检:这一行必须打印 1,否则你还在实盘
print(okx.headers.get('x-simulated-trading'))

# 之后所有请求都带模拟盘标记,用的是虚拟资金
balance = okx.fetch_balance()
print('模拟盘 USDT 可用:', balance['USDT']['free'])

set_sandbox_mode(True) 这一行做的事,是让 ccxt 给后续所有请求都带上模拟盘标记头 x-simulated-trading: 1。欧易的模拟盘和实盘用的是同一个 REST 主机,请求落在哪个环境全看这个头,所以别想着靠 URL 分辨。加上它,你的查余额、下单、撤单全部走假钱;去掉它(或改成 False),同一份代码就回到真金。

你可能在别处见过「在初始化时把 sandboxMode 写进 options 里」的写法。那个写法切不到模拟盘:ccxt 里给请求加模拟盘标记头的动作,是 set_sandbox_mode() 这个方法自己做的,构造函数里写 options 根本不会调到它,头没加、标记也没置上,发出去的请求和实盘一模一样。所以别拿配置项代替上面那一行,老老实实调 okx.set_sandbox_mode(True),再用那句 print 自检。

还有一个更要命的点:模拟盘的 API Key 必须单独建。按欧易官方文档给的路径——登录欧易 → 交易 → 模拟交易 → 个人中心 → 模拟盘 API,在模拟环境里创建一把 Demo Trading API Key;官方给的就是这条路径,不是给实盘 Key 加个开关。而模拟盘和实盘共用同一个 REST 主机,只靠 x-simulated-trading: 1 这个请求头区分,这意味着:如果你填的是实盘 Key、又没把头带上,那些「以为在模拟」的单子会实打实地打到实盘。如果开关切好了还报鉴权错误,多半是凭证本身用错了(最常见的就是把实盘那套填进了模拟盘脚本),可以回头对照 API 常见报错清单 排查。

连上之后,把你写好的下单/撤单脚本(参考 入门那篇 的示例)整个搬过来,加上这行 sandbox 开关,就能放心反复跑了:就算手滑把限价写到了市价附近真成交了,花掉的也只是虚拟 USDT。

📋 连模拟盘下单示例
用上面这段 ccxt 脚本连欧易模拟盘时,最容易出岔子的是漏掉 set_sandbox_mode(True)。少了这一行,请求就不带 x-simulated-trading: 1 这个头,那么无论填的是哪把 Key,请求都会打到实盘:填的是实盘 Key,fetch_balance 返回的就是实盘余额——账户是空的时候最容易看走眼,以为自己在模拟盘。所以别靠「有没有报错」判断自己在哪一边,把上面那行自检打印出来看。而模拟盘和实盘的 REST 主机是同一个,只靠那个头区分,所以想看 URL 判断自己在哪个环境靠不住,唯一站得住的自检是 print(okx.headers.get('x-simulated-trading')),必须打印出 1。确认头带上了,再把整条流程走一遍:下一个 BTC/USDT 限价买单(数量 0.0001,价格写死在远低于市价的位置,挂着不成交),create_order 正常返回订单号,sleep(2) 之后用 cancel_order 撤掉、状态变成 canceled。这样跑一遍就能确认「连模拟盘 → 查余额 → 下单 → 撤单」这条链是通的,几分钟的事,全程零成本。

模拟盘骗你的地方

模拟盘很好,但它有它的天花板,而且这个天花板会让人产生错觉。下面几条是你必须心里有数的:

滑点和成交价被美化了

实盘里,你的单子要和市场上真实的对手盘撮合,价格经常没你挂的那么理想——这叫滑点。模拟盘的撮合往往更「听话」,成交价更接近你的理想价。结果就是:同一套参数,模拟盘的收益曲线常常比实盘好看。别把模拟盘的收益当成实盘的预期。

深度和流动性不真实

真实市场里,大单会「吃穿」盘口、推动价格;冷门交易对可能根本撮合不动你的单。模拟盘对这些往往简化处理,你下多大的单它都给你成交得很顺。等到了实盘、尤其是做流动性差的币,这种顺滑就消失了。

你的情绪也是假的

这点最常被忽略,却最致命。模拟盘亏了你不心疼,所以你能严格执行止损、不乱改参数。真金一上,看着浮亏的数字是真的,手就开始痒——提前止盈、扛单不止损、临时加仓,这些情绪操作模拟盘永远教不会你。把策略在模拟盘跑得再漂亮,实盘的第一课往往是先跟自己的情绪打一架。

极端行情演不出来

插针、闪崩、交易所偶发的拥堵延迟,这些极端时刻才是真正考验策略和风控的地方,而模拟盘的日常运行很难复现它们。所以模拟盘跑得稳,不等于你的策略扛得住极端行情。

别被模拟盘的收益骗了:模拟盘验证的是「流程对不对」,不是「能赚多少」。它的滑点、深度、情绪都被简化或抹掉了,收益普遍比实盘乐观。把它当成排错和练手的沙盒,而不是收益的预演。加密资产价格波动剧烈,任何模拟盘表现都不代表实盘结果。

从模拟盘切实盘的顺序

把上面这些综合起来,推荐你每次上新策略都按这个固定顺序走:

  • 模拟盘连续跑一段。不是跑通一次就算,而是让它连着跑够时间,覆盖几轮涨跌,确认下单、撤单、回调、余额变化全都符合预期。
  • 切实盘:一行开关 + 一套凭证。set_sandbox_mode(True) 去掉或改 False,同时把凭证换回实盘那把 Key(模拟盘的 Demo Trading Key 在实盘上用不了)。这正是先在模拟盘验证的价值——切换的代价被压到了很小。
  • 实盘第一次只用很小的钱。用你就算全亏了也不心疼的金额,把它当学费。模拟盘没法复现的滑点和深度,这时候才会露出来。
  • 盯着它跑头几天。别真撒手,确认实盘行为和模拟盘看到的一致,再逐步加码。

这个顺序不复杂,但它能把「新手期最容易犯的致命错误」挡在真金之外。先模拟盘,再小额实盘,先活下来,再谈收益——这是我们反复强调的一句话。

常见问题

模拟盘要单独申请 API Key 吗?

要单独建。模拟盘的 Key 必须在模拟环境里另建一把:登录欧易 → 交易 → 模拟交易 → 个人中心 → 模拟盘 API,在那里创建 Demo Trading API Key;官方给的就是这条路径,不是给实盘 Key 加个开关。更要留神的是,模拟盘和实盘用的是同一个 REST 主机,两边只靠请求头 x-simulated-trading: 1 区分,所以想靠 URL 看出自己在哪个环境是靠不住的。在 ccxt 里调 set_sandbox_mode(True) 会自动带上这个头,跑之前打印一次 okx.headers.get('x-simulated-trading'),不是 1 就说明你还在实盘。

模拟盘的钱是真的吗?亏了用补吗?

模拟盘用的是虚拟资金,不是真钱,亏了也不会从你账户扣一分。它的作用是让你在零成本的环境里把脚本、参数、下单撤单流程跑顺。额度用完了一般能在模拟盘界面里重置,具体以欧易后台当前的入口为准。

在模拟盘赚钱了,实盘也能赚同样多吗?

不能直接照搬。模拟盘的成交往往比实盘理想——它的滑点、深度、撮合速度都被简化了,而且你下假钱时心态也轻松。同样一套参数,实盘可能因为成交价更差、深度不够、或者你自己手抖,跑出完全不同的结果。模拟盘验证的是流程对不对,不是收益能有多少。

set_sandbox_mode 和配置里的 sandboxMode 有什么区别?

不等价,只在配置里写 sandboxMode 不会切到模拟盘。ccxt 的 set_sandbox_mode() 是个方法,它做了两件事:把 options 里的 sandboxMode 设上,并给 headers 加上 x-simulated-trading: 1——加这个头的动作只发生在这个方法里。而在构造函数的 options 里写 sandboxMode 根本不会调到这个方法,头没加、标记也没置上,发出去的请求和实盘一模一样。所以只用 okx.set_sandbox_mode(True),写完打印一次 okx.headers.get('x-simulated-trading') 自检,是 1 才算切过去了。

模拟盘跑通了,切实盘要改几行代码?

代码本身基本只动一行——把 set_sandbox_mode(True) 去掉或改成 False;但凭证要跟着换,模拟盘那把 Demo Trading Key 在实盘上用不了,得填回实盘的 apiKey、secret 和 Passphrase。这正是先在模拟盘跑的好处:验证逻辑时用假钱,确认无误后改一行就上真金。但切实盘的第一次,务必只用很小的金额,并盯着它跑一阵,因为模拟盘没法复现真实的滑点和深度。

把模拟盘用熟之后,你就有了一个零成本的试验场——任何新策略、任何改过的代码,都先丢进去跑顺再说。接下来可以去看怎么把 风控写进脚本,或者用 网格估算器 把参数先算清楚。无论走哪条路,记住今天这篇的顺序:先模拟盘,再小额实盘。