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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:47:24