MetaTrader5
下载MetaTrader 5中的所有符号历史数据
今天我们来聊聊如何使用专家顾问(EA)来下载MetaTrader 5中某个符号的所有历史数据。这段代码会扫描您经纪商的市场观察列表,并提取出可以下载所有可用ticks的符号。 这个工具可以帮助您下载所有符号的历史数据,以便进行回测,或者从这些ticks创建自定义图表。 请注意,终端会将ticks缓存到数据文件夹中,所以确保您的硬盘空间足够。 为了方便下载,我们首先需要一个下载管理器。 以下是 CDownloadManager 结构,它包含我们需要保留的所有信息: struct CDownloadManager { bool m_started, m_finished; string m_symbols[], m_current; int m_index;} 它包含了以下信息: 下载状态(已开始/已完成) 待扫描的符号列表 当前符号 正在扫描的符号索引 我们还需要读写硬盘,因为我们在处理符号时,需要创建两个快速的函数来从二进制文件中读写字符串。 保存字符串到文件的函数: void writeStringToFile(int f, string thestring) { // 保存符号字符串 char sysave[]; int charstotal = StringToCharArray(thestring, sysave, 0, StringLen(thestring), CP_ACP); FileWriteInteger(f, charstotal, INT_VALUE); for (int i = 0; i < charstotal; i++) { FileWriteInteger(f, sysave[i], CHAR_VALUE); }} 这个函数接收: 文件句柄 f,一个以写入和二进制标志打开的文件 要写入文件的字符串 它会写入字符串的字符长度,并将每个字符存储到文件中。 从文件读取字符串的函数: string readStringFromFile(int f) { string result = ""; // 加载符号字符串 char syload[]; int charstotal = (int)FileReadInteger(f, INT_VALUE); if (charstotal > 0) { ArrayResize(syload, charstotal, 0); for (int i = 0; i < charstotal; i++) { syload[i] = (char)FileReadInteger(f, CHAR_VALUE); } result = CharArrayToString(syload, 0, charstotal, CP_ACP); } return result;} 这个函数接收: 文件句柄 f,一个以二进制方式打开的文件 它会读取预期字符的长度,然后逐个读取字符到字符数组中,最后将字符数组转换为字符串返回。 接下来,我们需要一种方法来初始化下载管理器,并从市场观察中填充它: void grab_symbols() { // 仅从市场观察中获取符号 int s = SymbolsTotal(true); ArrayResize(m_symbols, s, 0); for (int i = 0; i < ArraySize(m_symbols); i++) { m_symbols[i] = SymbolName(i, true); }} 这个过程非常简单: 询问市场观察中有多少个符号(活动的) 调整 m_symbols 数组来接收这些符号 循环获取所有符号的名称 我们还需要一个管理下载符号数据的函数: void manage(string folder, string filename) { // 启动或导航到下一个符号 if (ArraySize(m_symbols) > 0) { // 如果没有开始 if (!m_started) { m_started = true; m_current = m_symbols[0]; m_index = 1; save(folder, filename); if (_Symbol != m_current) { ChartSetSymbolPeriod(ChartID(), m_current, _Period); } } else { m_index++; if (m_index
2025.02.22