- 9/3/2026
- 9/3/2026
- 9/3/2026
简短回答
存在两条路径,具体哪条适合你,完全取决于你接下来的用途。
如果你需要价格与你实际使用的交易账户完全匹配(包括该经纪商的点差和佣金假设),请直接从 MetaTrader 导出。如果你想快速获取长期的价格历史,且对经纪商的特定细节不太在意,请使用第三方供应商提供的预制数据集。
| 你的需求 | 最佳路径 | 格式 |
| 复现你自己的经纪商回测条件 | MetaTrader 导出脚本 | JSON 或 CSV |
| 快速获取多年的 EURUSD 历史数据 | 来自供应商的预制数据集 | CSV |
| 在 Excel 中打开 | 任一路径 | CSV |
| 加载到 Expert Advisor Studio | 任一路径 | JSON |
| 在 Python 或 R 中分析 | 任一路径 | CSV |
| 跨多个价格源进行测试 | 两者对比 | 任选其一 |
无论你最终得到什么,在信任它之前,请检查四件事:时区、时间框架、价格是买入价还是卖出价,以及缺少了多少根 K 线。如果不进行这些检查,人们可能会在错误的数据集上浪费两周时间来构建策略。
为什么专门选择这对货币
值得稍作说明。欧元兑美元是全球外汇交易中最活跃的工具,这为任何研究价格记录的人带来了两个实际好处:点差保持紧凑,且存档深度远超其他任何可用工具。
更深的存档意味着更长的测试样本。更紧凑的点差意味着成本假设对你的结果干扰更小。虽然这并不能保证在此处运行的系统可以无缝转移到点差较窄的货币对,且许多情况并非如此,但作为学习此工作流的入门工具,它几乎是无可比拟的。

该数据集实际包含的内容
模糊的术语在这里比技术问题带来的麻烦更多。一个标记为 “EURUSD M15” 的文件可能代表几种不同的含义。
| 字段 | 需要确定的内容 |
| 交易对 | EURUSD,以及任何经纪商后缀,如 .m 或 pro |
| 类型 | 单个跳动点(Ticks),或聚合后的 OHLC K 线 |
| 价格基准 | 买入价(Bid)、卖出价(Ask)或中间价(Mid) |
| 时区 | 服务器时间或 UTC,两者很少完全一致 |
| 时间框架 | M1, M5, M15, H1, D1 等 |
| 范围 | 精确的首个和最后一个时间戳 |
| 格式 | CSV 或 JSON |
| 缺口 | 移除、保留或填充 |
| 周末 | 作为空时段包含,或排除 |
| 夏令时 | 供应商如何处理每年两次的时间变更 |
MetaTrader 导出的 OHLC K 线通常带有经纪商服务器时间的买入价(Bid)。大多数数据馈送都是这样工作的,虽然 “大多数” 不代表 “全部”,所以请确认而非假设。
跳动点 vs K 线
跳动点是单个价格更新,到达时间不规则,在活跃时段有时每秒会到达多次。K 线则将这些跳动点聚合到固定间隔中,仅保留开盘价、最高价、最低价和收盘价。
| 维度 | 跳动点记录 | OHLC K 线 |
| 细节 | Every quote change | 每个间隔四个数值 |
| 规模 | 巨大,每年达数 GB | 可控 |
| 最适合 | 模拟执行和盘中行为 | 策略开发和常规分析 |
| 缺点 | 速度慢,且通常需要清洗 | 隐藏了每个间隔内发生的具体情况 |
最后的这个缺点比初学者预想的更重要。K 线可以告诉你最低价达到了 1.0840,但不能告诉你这个最低价是在最高价之前还是之后发生的,而这决定了你的保护性退出或目标价位是先被触发。
CSV 还是 JSON?
其实选择非常简单。
CSV 可以在 Excel、Google Sheets、pandas、R 以及几乎所有的图表包中打开。如果你是为了分析或涉及电子表格的操作,请选择它。
JSON 是 Expert Advisor Studio 所要求的格式。如果目标软件明确是该软件,请选择它。
你可以同时生成两种格式。无论如何,导出步骤仅耗时数秒。
从 MetaTrader 4 导出
这是让你获得自己账户价格的路径,这些步骤的记录版本是多年前录制的,因此请将界面细节视为近似值,并检查你的版本。
第 1 步:向平台加载更多 K 线
新安装的 MetaTrader 存储的历史价格非常少。打开 M1 级别的 EURUSD 图表,按住 Home 键,观察图表随着旧 K 线的到来而向后推进。当移动停止时,在 M5、M15 等每个你计划使用的框架上重复此操作。

你只需要做一次。之后,随着新报价的到来,历史数据会自然积累,这诚实地说,是构建深度存档的更好方式。大多数经纪商的馈送初始提供的历史数据远少于你的预期。
第 2 步:移除 65K 上限
点击工具,然后是选项,然后是图表选项卡。有两个字段很重要:历史记录中的最大 K 线数和图表中的最大 K 线数。在全新安装时,两者默认均为 65536,这限制了你可以导出的所有内容。
在每个字段中按住 9 键,直到数字停止增长,然后确认。之后再次按住 Home 键,会加载更多历史记录。
值得注意的是:你机器的内存和你经纪商自身的存档仍然会限制实际到达的数据量。提高上限可以允许更多数据;但它不会凭空创造原本不存在的 K 线。
第 3 步:放置导出脚本
- 点击文件,然后打开数据文件夹。
- 打开 MQL4,然后选择 Scripts。
- 将导出脚本粘贴到该文件夹中。
- 关闭窗口,在导航器面板中右键点击 Scripts,选择 刷新。
- 一旦 MetaTrader 完成编译,脚本名称就会出现。
MT5 用户应通过 MQL5 遵循相同的路径,但需使用 MT5 版本的脚本。


第 4 步:运行它。
将脚本拖到你的 EURUSD 图表上。会出现一个包含三个数值的小对话框:
- 最大 K 线数量: 我通常设置为 200,000。第一次运行时,100,000 就足够了,因为你目前积累的数据还不多。
- 点差: 输入当前数值即可。留零则会向上取整到下一个十点,因此典型的 EURUSD 三到五个点的点差会变成十个,而点差较大的品种(如二十三个点)则会变成三十个。这是为了保守起见。
- 每手佣金: 我的 JFD 账户每手收取六美元,所以我输入了六。
确认后,左上角会显示所输入的内容:M1 上的 200,000 根 K 线,M5 也是如此,高时间框架下的数量递减,以及大约 1,576 根日线。

第 5 步:查找输出结果。
点击文件,打开数据文件夹,进入 MQL4,然后进入名为 Files 的子文件夹。你的导出文件就在那里。
加载到 Expert Advisor Studio
打开软件,前往数据,然后将导出的文件拖到投放区,或点击上传。我习惯于直接拖拽。
在进行任何操作前,先检查结果。生成器的源选择器现在应该显示你经纪商的数据集,点击即可查看所覆盖的具体范围。我的数据范围是从 2018 年 2 月 21 日到我录制那场讲座的 2019 年 12 月。
为什么历史中心(History Center)不是正确的来源
在工具中选择历史中心,看起来是获取 EURUSD 价格的最直观地方。但通常并非如此。
试一下,MetaTrader 会明确警告你:你即将从 MetaQuotes 提取记录,而不是从持有你账户的交易公司提取。这个警告是有原因的。不同数据源之间的价格存在差异,有时非常明显,基于一家公司报价的系统在另一家公司的报价下表现可能会不同。
话虽如此,本文早期的版本夸大了这一点。正确的来源取决于你的目的:
| 目的 | 首选来源 |
| 复现你的实盘执行环境 | 你自己的经纪商 |
| 常规市场研究 | 任何知名的标准化数据集 |
| 检查规则是否在不同报价下依然有效 | 对比多个独立来源 |
| 在历史记录较少的全新账户上进行操作 | 使用第三方数据,稍后针对你的经纪商进行重新验证 |
在多个来源之间进行测试可以说是最有用的方法,但几乎没人会这么做。如果一个系统仅在某一个数据源上有效,这本身就说明了重要的问题。
在 Excel 中打开 CSV
避免双击打开。Excel 的自动解析会弄乱日期并丢弃前导零,你可能直到结果看起来很奇怪时才会注意到。
- 先打开 Excel,然后点击数据,选择“来自文本/CSV”选项。
- 选择文件,检查分隔符预览。
- 最初将时间戳列设置为“文本”,然后再进行有意识的转换。
- 确认小数解析正确,因为在某些机器上,区域设置会将 1.0840 变成 10840。
在进行任何严肃操作之前,先对照图表抽查几行数据。
在 Python 中使用
import pandas as pd
df = pd.read_csv(“eurusd_m15.csv”, parse_dates=[“time”])
df = df.sort_values(“time”).drop_duplicates(“time”)
print(df[“time”].diff().value_counts().head())
最后一行是最有用的。它统计了连续时间戳之间的间隔。在干净的 M15 记录中,你应该看到大部分是 15 分钟的间隔,而周末的缺口会表现为一小簇较大的数值。出现其他数值则需要调查。
检查时区
服务器时间和你的本地时钟很少能一致。当我录制原始演示时,我所在的地方是凌晨 0 点 15 分,而数据集显示的是晚上 10 点 15 分之后,因为服务器运行在 GMT 时区。
两小时的差异会使你分析中的每个交易时段边界发生偏移。针对伦敦开盘进行规则过滤的系统,可能会完全针对错误的时刻。
通过对比已知事件来确定偏移量:将日线边界或周日开盘时间与你的本地时钟进行对比。然后把它记下来,因为你会忘掉的。
在信任任何数据之前进行质量检查
原文声称最大间隔为三天即可证明没有缺失天数。这种推理站不住脚,因为三天的间隔描述的是一个普通的周末,并不能说明没有缺失日内 K 线。
以下是真正需要检查的内容:
| 检查 | 为什么这很重要 |
| 首个和最后一个时间戳 | 确认范围是否涵盖了你的需求 |
| 实际条数与预期条数的对比 | 揭示批发级缺口 |
| 重复的时间戳 | 会扭曲后续的所有计算 |
| 缺失日内 K 线 | 常见于节假日和服务器维护期间 |
| OHLC 一致性 | 最高价必须包含开盘价和收盘价;最低价亦然 |
| 不合理的跳跃 | 标记在导出过程中残留的错误报价 |
| 零成交量 K 线 | 有时是填充数据而非真实活动 |
| 周末间隔 | 应定期且可预测地出现 |
| 夏令时转换 | 每年两次,它们会将所有时间平移一小时 |
| 点差和佣金单位 | 点(Points)与点(Pips)的混淆会不断干扰成本模型 |
在这些检查上花费十分钟,以后能节省更多。我是用高昂代价换来的教训。
点差、佣金和掉期单位
单位造成的错误比任何其他单一因素都要多。
导出对话框中的点差是以点(Points)而非点(Pips)衡量的。在五位数的 EURUSD 报价中,十个点等于一个点(Pip)。输入零会触发前文所述的舍入规则,这会产生一个刻意悲观而非现实的假设,而这正是重点:向上方的惊喜总比向下方的意外好。
无论如何,实际点差会随交易时段而变化。在隔夜换汇(Rollover)和重大数据发布前后点差扩大是正常的,而你测试中的固定数值无法捕捉到这一点。
佣金按每手以你交易账户的货币进行输入。每手 6 美元意味着你的测试会在每个头寸上收取该费用。
掉期适用于持有过隔夜换汇(Rollover)的头寸,且完全不会出现在导出对话框中。任何持仓过夜的情况都需要从你的经纪商合约说明中单独提取掉期值。
需要多少历史数据才足够?
比你想象的要多,这也是原文论点最强有力的地方。
在短样本上运行系统可能会显示出一条完美的曲线。如果将同样的逻辑扩展到更多年份,那条曲线往往会崩溃,因为短窗口期恰好符合了规则。
是指导建议而非规则:
- 在测试中仅有几百个头寸,证明意义微乎其微。
- 跨越数年的数千个头寸,结果才开始具有参考价值。
- 至少包含一个高波动时期和一个平稳交易期。
- 预留一段永远不进行优化的片段,然后单独检查该段的表现。
一个在深度样本中产生 3,400 个头寸的规则集,比一个在六个月内产生 40 个头寸的规则集更值得关注,即使后者的曲线看起来更漂亮。
常见问题
| 症状 | 可能的原因 |
| 导航器中缺少脚本 | 放在了错误的文件夹中,或未刷新 |
| K线数量远少于预期 | K线顶端仍为 65536,或 Home 保持时间不够长 |
| 高时间框架导出为空 | 这些图表从未加载;请先打开每一个 |
| 时间戳看起来偏差了几个小时 | 服务器时区问题,并非错误 |
| Excel 将日期显示为数字 | 电子表格解析问题,而非导出问题 |
| 回测结果与同事的不同 | 价格来源、点差或佣金假设不同 |
| 特定日期附近存在缺口 | 节假日休市或服务器维护,通常是正常的 |
关于提到的工具
直接披露,因为之前的版本掩盖了这一点。
Expert Advisor Studio 以及上述描述的导出脚本是我有商业关联的产品。这并不意味着它们不适用,且无论你将结果加载到什么工具中,MetaTrader 的步骤都是通用的,但在权衡建议时,你应该了解这种关联关系的存在。
获取 EURUSD 价格历史的免费选项包括你经纪商自带的工具、多个公共数据集仓库以及各种开源导出脚本。鉴于货币历史数据的普及程度,任何对基础历史数据收费的行为都值得质疑。
常见问题
EURUSD 价格历史是免费的吗?
通常是免费的。除了拥有交易账户(包括模拟账户)外,经纪商的导出是免费的,且许多提供商会免费发布大量的存档数据。付费服务通常销售的是刻度级细节、跨越数十年的更长覆盖范围,或者是带有文档说明缺口处理机制的清洗数据集。对于大多数基于 K 线的开发工作,免费来源已完全足够。在订阅之前,请评估你实际在为什么付费,因为“高级”有时仅仅意味着在公开信息之上提供一个更整洁的界面。
为什么两个来源在同一分钟显示的价格不同?
因为货币交易是在场外进行的,而不是在中央交易所,因此不存在单一的官方价格。每家公司都会汇总来自其自身流动性提供商的报价,这会导致每个 K 线都存在微小差异,此外在点差和 K 线开盘的具体时间上也会存在差异。极小的点值差异是正常的。较大的偏差通常意味着时区不匹配或数据馈送问题,在基于这些数据进行任何构建之前,都值得进行调查。
我可以将导出的记录重新加载回 MetaTrader 吗?
是的,可以通过历史中心(History Center)的加载功能实现,但结果会有所不同,且平台在重新连接时有时会覆盖你添加的内容。对于列顺序和时间戳结构的格式要求非常严格。许多人发现使用外部分析工具比与平台自身的存档“作斗争”更容易。如果你尝试这样做,请先备份现有的存档,因为该操作无法轻易撤销。
我应该导出哪些时间框架?
导出你可能实际用到的所有时间框架,因为稍后重新生成意味着要重复整个加载过程。M1 是最有价值的,因为更高的时间间隔可以基于它重建,尽管重建时需要注意交易时段边界。请记住,覆盖数年的 M1 数据是一个巨大的文件,因此存储和处理时间都会增加。大多数人会选择 M1、M15、H1 和 D1 作为实用的初始组合。
这种方法适用于其他货币对吗?
是的,方法完全相同。加载每个图表,按住 Home 键直到价格停止波动,然后对该品种运行脚本。GBPUSD、USDJPY、AUDUSD 等其他货币对的行为方式相同,但报价精度有所不同:日元(JPY)对带有三个小数位而非五个,这会改变一个点(point)所代表的含义。根据不同品种调整点差和佣金数值,因为它们差异很大,永远不要假设一个品种的设置会自动转移到另一个品种。
经纪商的历史数据通常可以追溯到多久?
很少能达到人们期望的深度。新账户通常仅包含几个月的日内记录,且深度随时间框架而异,通常日线(daily bars)比分钟线(minute bars)能追溯得更远。随着你的平台保持连接并收集新报价,覆盖范围会逐渐扩大。任何需要立即获得十年级分钟级细节的人都需要第三方存档,因为等待经纪商的数据馈送积累到那个程度是不现实的。
我应该在分析前移除周末缺口吗?
这取决于你的用途。回测(Backtesting)通常可以很好地处理它们,因为市场当时确实是关闭的,将此视为缺失信息是不正确的。涉及连续回报的统计工作有时需要调整,因为周五到周一的波动所跨越的实际时间比时间戳显示的要长。请记录你所做的任何选择。未经记录的清洗数据是导致两个使用相同数据源的人得出不一致结论且无法查明原因的主要原因。
当供应商宣传“已清洗(cleaned)”时,是指什么意思?
通常是重复项删除、异常值过滤、缺口记录和时区标准化的一种组合。问题在于“已清洗”并没有统一的定义,因此一家供应商的过滤可能会移除真实的波动率峰值,而另一家供应商则可能不对明显的错误进行处理。请询问具体更改了什么以及如何更改。如果没有公布方法论,请将该标签视为营销手段,并照常进行自己的检查,可以将本页之前的表格作为起点。
披露: 仅限教育内容。如上所述,此处引用的某些工具与作者有商业联系。本页面的任何内容都不构成交易建议,且过去的价格行为并不代表未来的走势。

Petko Aleksandrov

