ilapland 发表于 2026-7-15 16:04:37

求助EA如何通过WINAPI调用本地.BAT可执行文件

我的需求是:我想让EA在一天设定的交易时间内完成所有交易后,执行本地.BAT自动批处理文件实现电脑自动关机。

.BAT自动批处理文件我自己做好了,但是不知如何在EA调用执行这自动批处理个文件。

我看MQL5中有WINAPI这个文件夹,百度也说可以通过WINAPI之类的文件来执行这个文件。

不知可有高人知道的,指点一二?小弟在此不胜感激!

haircare1 发表于 2026-7-15 21:22:33

// 定义 Windows API 所需的类型
typedef long HINSTANCE;
typedef long HWND;
typedef string LPCWSTR;
typedef int INT;

// 直接导入 shell32.dll 中的 ShellExecuteW 函数
#import "shell32.dll"
HINSTANCE ShellExecuteW(
HWND    hwnd,
LPCWSTR lpOperation,
LPCWSTR lpFile,
LPCWSTR lpParameters,
LPCWSTR lpDirectory,
INT   nShowCmd
);
#import

//+------------------------------------------------------------------+
//| 脚本/EA 的启动函数                                                |
//+------------------------------------------------------------------+
void OnStart()
{
   // 指定要打开的 bat 文件的绝对路径(注意路径中的反斜杠需要双写)
   string batPath = "C:\\Path\\To\\Your\\script.bat";
   
   // 调用 ShellExecuteW
   // 参数说明:
   // hwnd: 父窗口句柄,填 0 即可
   // lpOperation: 操作类型,"open" 表示打开
   // lpFile: 文件路径
   // lpParameters: 参数,不需要则填空字符串 ""
   // lpDirectory: 默认工作目录,不需要则填空字符串 ""
   // nShowCmd: 窗口显示方式,1 代表正常显示 (SW_SHOWNORMAL)
   HINSTANCE result = ShellExecuteW(0, "open", batPath, "", "", 1);
   
   // ShellExecuteW 成功时返回值大于 32
   if(result > 32)
      Print("成功调用 ShellExecuteW 打开 bat 文件!");
   else
      Print("打开失败,错误码: ", (int)result);
}

Timer_Wang98 发表于 2026-7-16 09:18:28

MT4调用本地程序可以用WinExec或ShellExecuteEx API,在MQL4的dll调用中实现。注意要把MT4的DLL导入权限打开,BAT文件路径用绝对路径避免找不到文件。

ilapland 发表于 2026-7-16 12:04:05

谢谢二楼,讲解的非常清晰,正是我所需要的

ilapland 发表于 2026-7-16 22:07:55

haircare1 发表于 2026-7-15 21:22
// 定义 Windows API 所需的类型
typedef long HINSTANCE;
typedef long HWND;


// 定义 Windows API 所需的类型
typedef long HINSTANCE;
typedef long HWND;
typedef string LPCWSTR;
typedef int INT;

这个好像编译不了,提示错误是unexpected token,应该是语法上编译不通,但是查帮助文件这个语法是没有错误的。这就奇怪了,不管是放在MQL5哪部分里都编译不了

ilapland 发表于 2026-7-17 10:01:32

今天试了下,方法可行,但是typedef那一部分在MQL5里编译过不了,老是提示unexpected token,然后我改成了使用#define就可以了。
页: [1]
查看完整版本: 求助EA如何通过WINAPI调用本地.BAT可执行文件