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

如何在MQL5中调用.cpp文件?调用BPNN1.dll函数失败求助

在MQL5中调用C++代码及修复DLL调用失败问题

嘿,我来帮你搞定这两个问题!先理清楚MQL5调用C++代码的正确姿势,再针对你贴的DLL调用代码排查问题。

一、怎么在MQL5中调用.cpp文件?

MQL5没办法直接调用未编译的.cpp源文件,必须先把你的C++代码编译成符合要求的DLL,再通过MQL5的#import指令导入使用。具体步骤如下:

  • 第一步:编译符合MQL5要求的DLL
    推荐用微软Visual Studio来编译,兼容性最好,重点注意这几个设置:
    1. 必须编译32位版本:MQL5运行在32位环境下,64位DLL会直接调用失败,把Visual Studio的解决方案平台改成x86;
    2. 调用约定用__stdcall:MQL5默认用这个调用约定,不匹配会导致栈错误,函数声明要加上__stdcall;
    3. 用extern "C"避免名字修饰:C会给函数名做特殊修饰,MQL5找不到对应的函数,所以导出函数要包裹在extern "C"里。
      给你个C
      代码示例:
    extern "C" __declspec(dllexport) const char* __stdcall Train(
        double* inpTrain, 
        double* outTarget, 
        double* outTrain, 
        int ntr, 
        int UEW
    ) {
        // 这里写你的神经网络训练逻辑
        static char retMsg[256]; // 用静态数组存返回结果,避免函数结束后内存被释放
        strcpy(retMsg, "训练执行完成");
        return retMsg;
    }
    
  • 第二步:在MQL5中导入DLL
    编译好DLL后,把它放到MQL5终端的MQL5\Libraries目录下,或者和你的EA/脚本同目录,然后用#import导入就行,和你现在的写法类似,但要注意语法细节。

二、排查你的DLL调用失败问题

看了你贴的MQL5代码片段,先揪几个明显的问题,再列核心排查点:

1. 先修正语法错误

你的Train函数声明最后一个参数后面多了个逗号(int UEW,这里),这会导致MQL5编译失败,先把这个逗号删掉!修正后的代码:

#import "BPNN1.dll"
string Train(
    double &inpTrain[], 
    double &outTarget[],
    double &outTrain[], 
    int ntr, 
    int UEW
);
#import

2. 核心匹配问题排查

  • 调用约定不匹配:检查你的C++代码里,Train函数是不是用了__stdcall调用约定。如果用的是默认的__cdecl,MQL5调用时会直接崩溃或者返回错误;
  • 数组传递逻辑一致:你注释里说数组是二维转一维的,要确保MQL5里的数组存储顺序(比如旧数据在前)和C++里的处理逻辑完全一致,不然会出现数据错乱;
  • 字符串返回值的坑:MQL5的string和C++的std::string不兼容,DLL不能直接返回std::string,必须返回const char*,而且要用静态内存或者全局内存(别用栈上的局部变量,函数结束后内存会被释放),不然MQL5拿到的会是乱码或者无效指针;
  • DLL位数不对:再确认你的DLL是32位编译的,别不小心搞成64位了;
  • 权限和路径问题:
    • 打开MQL5终端的设置,确保工具->选项->EA交易里勾选了允许导入DLL;
    • 把DLL放到MQL5\Libraries目录下,或者和你的EA/脚本同目录,不然MQL5找不到文件。

内容的提问来源于stack exchange,提问作者Jaffer Wilson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:44:22