You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:42:07