MT4历史数据导出至Excel时出现空白行问题求助
MT4脚本导出CSV空白行问题排查与修复
问题根源
你的代码同时使用了FILE_CSV文件模式和手动拼接带\n的整行字符串,这是导致空白行的核心原因:
FILE_CSV模式下,FileWrite会自动为每一次调用添加换行符;- 你手动在拼接字符串时加入了
\n,导致每行被写入后额外多一个换行,最终在文件中表现为空白行。
另外,原代码中用StringSubstr处理四位年份的操作存在潜在风险(比如不同时区或格式下字符串长度变化会导致截取错误),可以一并优化。
修复方案(两种可选)
方案1:移除FILE_CSV模式,手动控制CSV格式
直接使用FILE_WRITE | FILE_ANSI打开文件,保留手动拼接整行的逻辑,确保只有手动添加的\n作为换行:
#property script_show_inputs input datetime StartDateTime = D'2023.11.21 00:00'; input datetime EndDateTime = D'2023.11.22 12:00'; int OnInit() { string filename = "MyMT4Data.csv"; // 移除FILE_CSV,仅用FILE_WRITE和FILE_ANSI int file_handle = FileOpen(filename, FILE_WRITE | FILE_ANSI); if (file_handle == INVALID_HANDLE) { Print("Failed to open file: ", filename); return(INIT_FAILED); } for (int i = Bars - 1; i >= 0; i--) { datetime barTime = Time[i]; if (barTime >= StartDateTime && barTime <= EndDateTime) { // 直接生成四位年份的时间字符串,避免截取风险 string timeStr = StringFormat("%04d.%02d.%02d %02d:%02d:%02d", Year(barTime), Month(barTime), Day(barTime), Hour(barTime), Minute(barTime), Second(barTime)); string line = timeStr + "," + DoubleToString(Open[i], Digits) + "," + DoubleToString(High[i], Digits) + "," + DoubleToString(Low[i], Digits) + "," + DoubleToString(Close[i], Digits) + "\n"; FileWrite(file_handle, line); } } FileClose(file_handle); return(INIT_SUCCEEDED); }
方案2:保留FILE_CSV模式,让MT4自动处理CSV格式
不再手动拼接整行和换行符,将每个字段作为FileWrite的独立参数,由MT4自动添加分隔符和换行:
#property script_show_inputs input datetime StartDateTime = D'2023.11.21 00:00'; input datetime EndDateTime = D'2023.11.22 12:00'; int OnInit() { string filename = "MyMT4Data.csv"; int file_handle = FileOpen(filename, FILE_WRITE | FILE_CSV | FILE_ANSI); if (file_handle == INVALID_HANDLE) { Print("Failed to open file: ", filename); return(INIT_FAILED); } // 写入表头(可选,让Excel更易读) FileWrite(file_handle, "Time", "Open", "High", "Low", "Close"); for (int i = Bars - 1; i >= 0; i--) { datetime barTime = Time[i]; if (barTime >= StartDateTime && barTime <= EndDateTime) { string timeStr = StringFormat("%04d.%02d.%02d %02d:%02d:%02d", Year(barTime), Month(barTime), Day(barTime), Hour(barTime), Minute(barTime), Second(barTime)); // 每个字段作为独立参数传入,MT4自动处理逗号分隔和换行 FileWrite(file_handle, timeStr, Open[i], High[i], Low[i], Close[i]); } } FileClose(file_handle); return(INIT_SUCCEEDED); }
额外说明
两种方案都优化了时间字符串的生成,用StringFormat直接输出四位年份,避免了原代码中StringSubstr截取可能导致的格式错误;方案2还可通过添加表头提升CSV文件的可读性。
内容的提问来源于stack exchange,提问作者Alan Wong
相关产品推荐
相关产品推荐

