---
id: document_item.backtest
page_type: documentation_article
title: "回测（BackTest）"
description: "如何准备历史 .bin 数据、在 Moonbot 中运行 BackTest、分析测试结果，并注意在同一数据集上重复运行的特点。"
section: documentation
category: "“Menu”按钮"
url: https://moonbot.pro/zh/documentation/menu-button/backtest?format=md
locale: zh
alternate_ru: https://moonbot.pro/ru/documentation/menu-button/backtest?format=md
alternate_en: https://moonbot.pro/documentation/menu-button/backtest?format=md
parent: https://moonbot.pro/zh/documentation/menu-button?format=md
previous: https://moonbot.pro/zh/documentation/menu-button/log-analyzer?format=md
next: https://moonbot.pro/zh/documentation/menu-button/moon-news?format=md
status: published
updated_at: 2026-11-11T03:38:09+03:00
---

# 回测（BackTest）

**“回测”（BackTest）模块**用于在来自不同交易所的历史成交数据上测试交易策略（自动交易）并练习手动交易技巧。该模块仅在 **Moonbot 终端的 PRO 版本**中提供，需在“[Moon Credits](https://moonbot.pro/zh/documentation/bottom-area-with-service-information/moon-credits?format=md)”窗口中使用 **500 MoonCredits** 激活。

Moonbot 终端中的 **BackTest** 窗口通过 **Menu → BackTest** 打开，外观如下。

![](https://moonbot.pro/storage/editor-images/BackTest-W-eng.jpg)

![(dark)](https://moonbot.pro/storage/editor-images/BackTest-B-eng.jpg)

**BackTest** 窗口由两个主要控制区域组成：

- **上部区域：回测过程控制**\
  这里放置了启动和控制 .bin 文件播放所需的元素：**Select file**、**Start**、**Stop**、**Copy** **File**、**Paste** **File**、**“眼睛”**（查看图表）、**“剪刀”**（裁剪数据）、.bin 文件播放**进度条**。\
  点击 **Help** 字样，将在网站上打开本说明，其中详细介绍了 **BackTest** 的使用方法。
- **下部区域：下载和管理 .bin 归档**\
  用于下载 .bin 示例文件以及获取各交易所的历史数据，包含两个分区：
  - 分区 **Download Examples**\
    只有一个按钮，用于下载 BackTest 演示文件
  - 分区 **Exchange archives**\
    用于选择并下载真实的历史成交归档；其中包含交易所选择菜单 **Binance, Gate, OKX**、**Spot** 或 **Futures** 菜单、选择按天（**Daily**）或按整月（**Monthly**）下载归档的菜单、币种输入栏、选择具体日期或月份的菜单、用于处理 Bybit 交易所归档数据的 **Use Bybit gz** 按钮，以及带下载进度条的 **Download data** 按钮。\
    点击 **Download data** 按钮后，下载进度条右侧会依次出现如下信息：
    - **Recvd 1 / 183 Mb ... Recvd 183 / 183 Mb**（归档下载进度）；
    - **unpack data..** （解压归档）；
    - **Parsing 01.07.2025...Parsing 31.07.2025**（按天解析数据）；
    - **Not Found** （未找到可下载的归档数据）：如果币种名称有误，或所选日期在交易所没有归档数据，就会出现该提示。\
      所有操作成功完成后，会显示 **Done**。

      **BackTest** 窗口的下部区域可以隐藏：浅色主题下点击 **“...”** （省略号）按钮，深色主题下点击 **Hide** 按钮。

### 获取历史数据的方式

回测通过播放包含历史成交数据的文件来进行。\
这类文件的扩展名为 **.bin**。获取它们有以下几种方式：

#### 下载预先准备好的示例

点击 **Download Examples** 按钮，即可从我们的服务器下载现成的示例（.bin 文件），它们是币种图表上波动剧烈的片段。\
这些文件会保存到 **BackTest** 文件夹，该文件夹会在 Moonbot 根目录下自动创建。

目前会下载以下示例：

- Demo_BANANAS31 09-07-2025 10-18.bin
- Demo_GMX 09-08-2025 23-14.bin
- Demo_GMX 10-08-2025 06-33.bin
- Demo_HAEDAL 21-05-2025 17-04.bin
- Demo_LA 11-08-2025 00-39.bin
- Demo_LAYER 10-08-2025 05-39.bin
- Demo_REQ_05-21-04-23-57.bin
- Demo_TREE_07-29-17-16-05.bin

#### 在 BackTest 窗口中下载单日或整月归档

在 BackTest 窗口的下部，可以下载包含各交易所历史数据的 .bin 文件，步骤如下：

- 选择交易所（Binance、Gate、OKX）；
- 指定市场（**Spot** 或 **Futures**）；
- 选择周期：**Daily** 或 **Monthly**；
- 输入币种；
- 指定日期或月份；
- 点击 **Download data**。

下载的历史数据文件保存在 **BackTest** 文件夹中，位于形如 *币种-YYYY-MM* 的子文件夹内（例如 LTC-2025-07）。

**可用的历史数据范围：**

- **Binance Spot**：自 *17.08.2017* 起（最早可用的文件为 Binance_BTC_spot 17-08-2017.bin）；
- **Binance Futures**：自 *01.01.2020* 起（最早可用的文件为 Binance_BTC_futures 01-01-2020.bin）；
- **Gate Spot**：自 *01.01.2018* 起（最早可用的文件为 Gate_BTC_spot 01-01-2018.bin）；
- **Gate Futures**：自 *18.11.2019* 起（最早可用的文件为 Gate_BTC_futures 18-11-2019.bin）；
- **OKX Spot**：自 *01.09.2021* 起（最早可用的文件为 OKX_BTC_spot 01-09-2021.bin）；
- **OKX Futures**：自 *01.10.2021* 起（最早可用的文件为 OKX_BTC_futures 01-10-2021.bin）。

**要使用 Bybit 交易所的归档数据**，需要自行从交易所网站 🔗 [https://public.bybit.com/](https://public.bybit.com/) 将归档下载到电脑，例如 **ETHUSDT2026-02-07.csv.gz**。

然后在 **BackTest** 窗口中点击 **Use Bybit gz** 按钮，指定该归档在电脑上的路径，并点击 **Open**（打开）按钮。

之后，**BackTest** 文件夹中会创建一个以币种名称、年份和月份命名的文件夹，例如 **ETH-2026-02**，其中存放 **.bin** 文件，例如 **Bybit_ETH_spot 07-02-2026.bin**。

随后即可在 BackTest 窗口中打开该文件，并在该币种的图表上播放。

#### 使用 Moonbot 日志中现成的 .bin 文件

历史数据还可以从以下位置获取：

**a) Logs 文件夹**：终端会把交易历史写入该文件夹，用于在报告表中显示。

**b) Logs\\ImportantB 和 BackTest\\Important 文件夹**：如果在报告中点击某笔交易所在的行并勾选 **Important**（重要）复选框，这笔重要交易的 .bin 文件就会自动保存到这些文件夹。

以前这类文件只能在静态的 Pump Chart（拉盘图表）窗口中查看交易，现在可以通过 BackTest 完整播放。

.bin 文件的播放时长：如果打开的是 Logs 文件夹中的 .bin 文件，播放时间与它在报告图表上的时长完全相同；如果打开的是从交易所归档下载的 .bin 文件，则正好为 24 小时。

#### 处理 .bin 文件

##### 从较长的 .bin 文件中截取所需片段

为了在图表的特定区段上快速测试策略，可以只截取所需的片段，步骤如下：

1. 点击“眼睛”按钮，选择 .bin 文件，它会以静态形式在 **Pump Chart** 窗口中打开；
2. 在 **BackTest** 窗口中点击“**剪刀**”按钮；
3. 在图表上按住 **Ctrl** 和鼠标左键，选定片段的起点；
4. 按住鼠标左键不放，拖动到片段的终点（选中区域会以绿色高亮显示）；
5. 松开按键后，Moonbot 会提示将该区段另存为单独的 .bin 文件，保存到 **BackTest** 文件夹。

⚠️ 重要：如果图表上波动片段之前有一段较长的、没有成交标记的“空白”区域，它也会被写入最终文件。在成交稀疏的图表上，请尽量从所需区段的第一个成交标记开始选取。

使用“剪刀”按钮既可以在主窗口的图表上截取片段，也可以在 Chart 窗口中截取，但**仅限图表仍以成交标记（逐笔成交）显示时**。\
当图表变为迷你 K 线后，就无法再录制 .bin 了。

如果尝试在 BackTest 中播放这种“K 线”文件，文件名的位置会显示提示：**Nothing to play!**

##### 通过 BackTest 窗口将多个 .bin 文件合并为一个

如果您有同一币种的多个历史数据片段，例如在不同时间录制的 **BTC1.bin** 和 **BTC2.bin** 文件，可以把它们合并成一个 .bin 文件。当您想在由多个区段拼成的较长行情序列上测试策略时，这样做很方便。

要合并文件，请执行以下操作：

1. 点击 **Select file** 按钮，选择第一个片段 *BTC1.bin；*
2. 点击 **Start**，在图表上播放第一个片段；
3. 再次点击 **Select file**，选择第二个片段 *BTC2.bin；*
4. 点击 **Start**，紧接着第一个片段播放第二个片段；
5. 两个片段都播放完毕后，点击“剪刀”，然后：
   1. 按住 **Ctrl** 并在第一个片段的起点处按下鼠标左键；
   2. 不松开鼠标左键，将选区拖动到第二个片段的终点；
   3. 选中的区域会显示为绿色矩形；
   4. 松开鼠标左键，完成选取。
6. 在图表上选定区域后，终端会弹出保存确认窗口：\
   **Warning** \
   *Boss, save the BTC chart fragment, interval from 14:58:37 to 15:03:06 (269 sec) to file BackTest\*.bin?（即：是否将 BTC 图表 14:58:37 至 15:03:06（269 秒）这一区间的片段保存到文件 BackTest\*.bin？）* \
   **Yes / No**
7. 确认后，文件会保存到 **BackTest** 文件夹，文件名形如：**Demo_BTC 23-08-2025 14-58.bin**

**.bin 文件名中各部分的含义：**

- **Demo** ：前缀，表示这是演示文件；
- **BTC** ：币种，即所录制的历史成交序列所属的币种；
- **23-08-2025** ：片段的录制日期（2025 年 8 月 23 日）；
- **14-58** ：录制开始时间（14 时 58 分）。

##### 借助 BackTest 在 Pump Chart 窗口中“拼接”多个图表片段

“拼接”多个片段是 Moonbot 终端的一项**未列入文档的功能**，可以把同一币种的多个 .bin 文件合并成一张连续的图表。

要进行“拼接”，请在 **BackTest** 窗口打开的状态下，通过 **Menu → Trades History** 或“眼睛”按钮依次打开两个或更多**币种名称相同**的 .bin 文件。这样，新文件中的成交会**追加** 到前一个文件的图表上，而不是替换它。

选取片段时，重要的是保证它们**在时间上没有间断**。例如，如果您的 .bin 文件每个大约录制了 10 分钟，那么最好以 **7–9 分钟**的间隔进行拼接，以避免出现缺口或重叠。

**请注意：** \
– 交易所现有的**不同币种**，其 .bin 文件不能放在一起播放或“拼接”。每个 .bin 只会在*自身* 币种的图表上播放。 \
– 例外情况是已从交易所下架的币种的 .bin 文件（例如 *Coin1Delist.bin* 和 *Coin2Delist.bin*）。它们可以在 **ETH** 市场上播放和拼接，因为已下架的币种始终显示在 ETH 的图表上。

准备好所需的 .bin 文件后，为方便起见，可以用 … 或 **Hide** 按钮收起 BackTest 窗口的下部区域，只保留上部用于加载和播放 .bin 文件的控制面板，以便接下来进行回测。

#### 启动回测流程

下面以 Moonbot 示例集中的一个演示文件为例，说明如何启动回测。

1. 打开 **BackTest** 窗口\
   在终端主窗口中选择 **Menu → BackTest** ，将出现 **BackTest** 窗口
2. 下载演示示例。\
   点击 **Download Examples** 按钮，Moonbot 示例集中现成的 .bin 文件将下载到 **BackTest** 文件夹。
3. **选择要播放的文件。**\
   点击 **Select file**，在打开的资源管理器窗口中进入 *BackTest* 文件夹，选择演示文件，例如：**Demo_LA 11-08-2025 00-39.bin**，然后点击 **Ok**。所选文件的名称会显示在 BackTest 窗口中。
4. 准备好策略并开启模拟器模式：
   1. 启用您想要测试的策略
   2. 开启 **EMULATOR** 模式（通过 **Menu → Emulation mode**），并确认按钮显示为 **Autodetect: ON**。
5. 启动回测。\
   点击 **Start。**\
   所选文件中录制的历史成交将开始播放，并自动打开 **LA** 币种的图表。如果该币种已不在交易所上，播放始终在 **ETH** 市场上进行。
6. 观察播放进度。\
   文件名下方会显示 .bin 片段的加载进度条。
7. 控制播放：
   1. 点击 **Stop**，可随时停止播放；
   2. 再次点击 **Start** 会让 .bin 文件 **从头开始**播放。

⚠️ **注意！可以同时播放多个 .bin 文件**：为此，点击 **Select file** 按钮后可以选择多个 .bin 文件，而不是一个。\
点击 **Start** 按钮（在 **BackTest** 窗口中）后，所有这些文件会同时在各自币种的图表上开始播放。如果所选文件中有属于同一币种的 .bin 文件，那么第一个文件在该币种自己的图表上播放，第二个在 ETH 图表上播放，第三个及之后的文件在其他空闲的币种图表上播放。

#### 分析结果

在 .bin 文件播放期间，所有通过过滤器的已启用策略都会触发。

回测结束后：

1. 在 Moonbot 主窗口中点击 **Reports**；
2. 打开**报告表**；
3. 评估所测试策略的结果。

必要时修改策略参数，然后重新播放文件。\
重复这一测试循环，直到得到期望的结果。

使用 **Copy File** 按钮，可以把已加载到 BackTest 窗口中的 .bin 文件复制到剪贴板。

使用 **Paste File** 按钮，可以把它粘贴到另一个 Moonbot 终端的 **BackTest** 窗口，或粘贴到 Telegram 群组的消息中，与他人分享 .bin 文件。

![](https://moonbot.pro/storage/editor-images/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%BE%D0%B2.png)

![(dark)](https://moonbot.pro/storage/editor-images/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%BE%D0%B2.png)

#### 启动 BackTest 时模拟器模式的工作特点

⚠️ **重要**！如果在启动 BackTest 之前，Moonbot 终端的总体模式没有手动切换到 **EMULATOR** 模式，而是不小心留在了真实模式，那么点击 **Start** 按钮（在 **BackTest** 窗口中）时，终端会自动启用保护，并自行将总体模式切换为 **EMULATOR**。这样可以避免回测期间动用真实资金挂单的情况。

如果在 .bin 文件播放期间尝试手动把总体模式从 **EMULATOR** 切回真实模式，另一项保护功能会生效： \
– BackTest 窗口中会自动按下 **Stop** 按钮， \
– .bin 文件的播放将停止， \
– 币种图表上将开始显示真实成交。

此外，在 Moonbot 主终端中使用 BackTest 测试策略时，不会通过 UDP 向从终端发送控制命令。这是有意为之，目的是排除错误信号，避免从终端上意外执行命令。

#### 为什么同一份历史数据的两次回放可能得到不同的结果

在基于 K 线运行的传统算法中，一切都是确定的：输入相同，结果就相同。把“2+2”算十遍，得到的永远是“4”。**而在剥头皮交易中这是不可能的**。即使对同样的数据回放两次，盈利、交易次数和入场结构也可能不同。

下面以两个 Moonbot 终端为例，分析产生这种“随机性”的主要原因：它们以相同的设置交易同一个交易对，但运行在不同的独立服务器（VDS）上。

##### 1) 接收成交数据的延迟

如果一个终端收到成交数据比另一个晚 10 毫秒，它挂单也会晚 10 毫秒。这就足以让交易过程朝另一个方向发展：

- 第一个终端买入后及时卖出并盈利，
- 第二个终端买得更晚，没有赶上同一个高点，最后止损离场。

市场越活跃，这种效应越明显。最典型的例子是 **MoonStrike** 策略：一个终端来得及买入，另一个却来不及。

**回测在模拟器模式下运行**，并特意加入了随机延迟因素，以便尽可能真实地再现这种情况。

##### 2) 参数重新计算的离散性

终端中的参数计算**不是连续进行的**，而是按一定的频率进行。

- 第一个终端在 **T1** 时刻重新计算了市场状态
- 第二个终端在 **T2** 时刻做了同样的计算，两者仅相差 1 毫秒。

但就在这 1 毫秒内可能出现了一笔新成交，于是第二个终端看到的已经是**另一幅市场图景**。 \
结果：

- 订单参数会有所不同
- 检测可能在一个终端上触发，而在另一个终端上不触发。

回测中同样存在这一因素：按下 **Start** 的时刻必然不会与内部的重新计算周期完全重合。

##### 3) Sell 算法工作时的差异

Sell 订单的处理过程中也会出现类似的差异，尤其是使用了动态管理算法时，例如：

- **PriceDown** ：随时间逐步下调 Sell 订单；
- **SellLevel** ：根据之前的价格高点进行调整；
- **SellShot** ：订单在设定的区间内移动；
- **SellSpread** ：根据当前价差进行调整；
- 甚至普通的 **StopLoss**。

移动 Sell 订单（改价重挂） **并非瞬间完成**：与真实交易所一样，需要 10–20 毫秒。执行这一操作的时刻不同，会导致：

- 最终平仓价格不同；
- 交易的轨迹不同；
- 策略的结果不同。

**回测中同样会模拟移动订单时的随机延迟**，使其行为表现尽可能贴近真实交易。

## 导航

路径: [首页](https://moonbot.pro/zh?format=md) / [文档](https://moonbot.pro/zh/documentation?format=md) / [“Menu”按钮](https://moonbot.pro/zh/documentation/menu-button?format=md) / 回测（BackTest）

上级栏目: [“Menu”按钮](https://moonbot.pro/zh/documentation/menu-button?format=md)

上一页: [Log Analyzer](https://moonbot.pro/zh/documentation/menu-button/log-analyzer?format=md)

下一页: [Moon News](https://moonbot.pro/zh/documentation/menu-button/moon-news?format=md)

## 相关内容

- [Moon News](https://moonbot.pro/zh/documentation/menu-button/moon-news?format=md)
- [Exit（退出）](https://moonbot.pro/zh/documentation/menu-button/exit?format=md)
