MQL EA代码编译成功但启动时间未执行,请求排查原因
问题排查与修复方案
核心问题:定时器设置错误
MQL5的EventSetTimer()函数仅接受整数类型参数,单位为秒。你传入的0.1是浮点数,会被自动截断为0,导致定时器完全不触发,OnTimer()函数根本不会执行——这是代码到达设定时间后无反应的最直接原因。
次要问题:语法与变量错误
SaveToCSV()函数第一行的Kc是无效笔误代码,会直接中断函数逻辑- 函数中使用了未定义的
path变量,FileOpen()无法定位正确文件路径,最终无法完成CSV保存 - 时间记录精度不足:
TimeCurrent()仅精确到秒,无法满足100ms级别的时间戳需求
修复后的完整代码
input datetime StartTime = D'2023.08.17 10:00'; // 示例启动时间 input datetime EndTime = D'2023.08.17 10:05'; // 示例结束时间,5分钟后 input uint TimerIntervalMs = 100; // 定时器间隔(毫秒) bool isTimeToFetch = false; string csvData = "Time,Price\n"; // CSV表头 //+------------------------------------------------------------------+ //| 专家初始化函数 | //+------------------------------------------------------------------+ int OnInit() { // MQL5中用EventSetMillisecondTimer设置毫秒级定时器 EventSetMillisecondTimer(TimerIntervalMs); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 定时器函数 | //+------------------------------------------------------------------+ void OnTimer() { datetime currentTime = TimeCurrent(); uint ms = GetTickCount() % 1000; // 获取当前毫秒数 string fullTime = TimeToString(currentTime, TIME_DATE|TIME_SECONDS) + "." + IntegerToString(ms, 3); // 拼接毫秒级时间戳 if(currentTime >= StartTime && currentTime <= EndTime) { if(!isTimeToFetch) { isTimeToFetch = true; // 标记确保仅启动一次数据抓取 Print("Fetching data..."); } double price = SymbolInfoDouble(_Symbol, SYMBOL_BID); // 使用_Symbol自动获取当前图表品种,避免硬编码 csvData += fullTime + "," + DoubleToString(price, 5) + "\n"; // 5位小数精度 } else if(isTimeToFetch) // 若已启动抓取且当前时间超出时间范围 { isTimeToFetch = false; // 停止抓取 Print("Finished fetching data."); // 保存到CSV SaveToCSV("USDJPY_data.csv"); } } void SaveToCSV(string filename) { ResetLastError(); // 构造正确的文件路径:终端数据目录下的MQL5/Files文件夹 string path = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\" + filename; int fileHandle = FileOpen(path, FILE_WRITE|FILE_TXT, ','); // 用FILE_TXT更适合直接写入字符串,FILE_CSV适合逐行写入列数据 if(fileHandle != INVALID_HANDLE) { FileWriteString(fileHandle, csvData); FileClose(fileHandle); Print("Data saved to: ", path); } else { Print("Error in saving CSV file: ", GetLastError()); } } //+------------------------------------------------------------------+ //| 专家反初始化函数 | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { EventKillTimer(); // 关闭毫秒级定时器 } //+------------------------------------------------------------------+
额外注意事项
- 挂载EA时,确保图表品种为USDJPY,或依赖
_Symbol自动适配当前图表,避免硬编码出错 - 检查终端自动交易开关是否开启,EA需要该权限才能正常运行
- 查看终端
专家日志(快捷键Ctrl+L),可获取详细错误信息辅助排查
内容的提问来源于stack exchange,提问作者emptyfullstack
相关产品推荐
相关产品推荐

