在 MQL5 中使用 AutoIt:基础篇打通纯代码做不到的 GUI 自动化(基础篇)
🤖

在 MQL5 中使用 AutoIt:基础篇打通纯代码做不到的 GUI 自动化(基础篇)

(1/3)· 想用 MQL5 删脚本、读日志、关警报却卡在系统限制?AutoIt 传动层补上这块拼图

实战向 第 1/3 篇
很多交易者以为 MQL5 能包办终端里所有操作,结果在添加删除脚本、读取工具箱日志时被图形界面挡住。纯代码碰不到 Win32 控件,手动点又跟不上行情节奏。用 AutoIt 补齐这块能力前,先认清它的兼容边界,否则白写一套调用。

「用 AutoIt 给 MT5 补上键鼠自动化」

MQL5 本身跑在策略测试器和图表事件里,没法直接模拟系统级键鼠操作。想在 MT5 客户端之外做界面点击、跨窗口搬运数据,得靠外部脚本配合,AutoIt 是 Windows 下轻量可行的方案。 实际工程中常见做法是:MQL5 EA 通过 FileOpen / FileWrite 把信号或状态写进本地文件,AutoIt 脚本轮询该文件,触发后调用 WinActivate、Send、MouseClick 等函数操作 MT5 窗口。这样 EA 只管逻辑,AutoIt 只管执行,互不阻塞。 一篇 2022-02-21 发布的社区示例帖记录过这种组合用法,当时获得 1803 次查看、9 条讨论,说明手动交易者确实有跨工具联动需求。外汇与贵金属杠杆高,任何自动点击方案都可能因窗口错位或网络延迟误单,上真仓前务必在模拟环境跑通。

用 AutoIt 补上 MQL5 管不到的活

纯 MQL5 在控制 MT5 客户端界面这件事上天生缺一块:它没法直接往图表里塞脚本或 EA,也读不到工具箱里智能系统、日志这些选项卡的内容。之前有人用自写 DLL 去驱动 MT4 的图形界面,思路可行但门槛高,要懂 C++ 和导出约定。 本文换一条更轻的路:借 AutoIt 的窗口传动能力,在 MQL5 侧封一个类,把那些原生做不到的活接过来。可验证的落点很具体——能在图表上增删脚本与 EA;能扒到工具箱窗口中智能系统、日志选项卡的文字;能自动读警报消息并关掉警报弹窗。 最后还会复刻 MT4 那篇里的老功能:通过程序在终端设置里写入 MetaQuotes ID。外汇与贵金属交易端操作涉及实盘风险,这类自动化改的是客户端状态,误触可能动到正在跑的 EA,动手前先在模拟端跑通。

◍ 用 AutoIt 给 MT5 界面补脚本能力

AutoIt 是 Windows 平台下的 GUI 自动化脚本语言,除了管窗口,还能直接读写界面组件、模拟键鼠输入。它带了一个叫 AutoItX 的 dll,只实现部分语言功能,但足够让 MQL5 的 gui 获得类似脚本的操控力。 先说落地前提:AutoIt 免费,x86 版能跑在 Windows 10 及更早系统,本身是 32 位程序但带 64 位组件和 64 位 AutoItX。装完别急着写代码,它的帮助文件里「安装」一节值得翻一遍,因为局限会直接决定你能不能控住目标软件。 硬限制有两条。第一,它只稳稳认 Win32 标准组件;程序若用定制控件或跨平台框架(比如某些非原生 UI 的终端外壳),基本就废了。第二,AutoItX 只暴露了原语言的一部分功能,同一个组件用完整 AutoIt 能搞定的事,走 dll 可能做不到。 验证兼容性靠自带的 AutoIt Window Info Tool。拖 Finder 覆盖到 MT5 界面任意位置,就能抓出按钮、下拉、选项卡这类「控件」的属性。一个应用可有多个窗口,子窗口挂靠主窗口后,里面的控件算主窗口的一部分——精确定位时,窗口归属要先搞清。 把 Finder 拖到 MT5 的选项菜单,勾上冻结、始终在顶、Spy++ 逻辑检测,窗口选项卡会给出标题和类别作唯一标识;切到控件选项卡,重点看 ClassnameNN:它是控件类型加实例数字,类型直接决定该调哪类 AutoIt 函数。开 MT5 实测拖一遍,比看文档快。

「把 AutoItX 接进 MT5 的第一步」

要让 MT5 在运行时找到 AutoItX 的 dll,最省事的办法是把 AutoItX 安装目录(默认在 Program Files (x86) 内)里 AutoItX 文件夹下的对应 dll 直接拷到 MT5 安装目录的 Libraries 文件夹。注意 64 位和 32 位 MT5 构建要拿对应的 dll,头文件 AutoItX3_Dll 里列了所有公开函数原型,是后续导入的依据。 实际写 MQL5 程序时,不建议在每个 ea 或脚本里重复写导入声明。建一个 autoIt.mqh 包含文件,统一导入 dll 暴露的函数原型,并在其中 #include windef.mqh——这是 MetaQuotes 做的 Win32 API 数据类型桥接,免得你自己用 MQL5 重写那些 Windows 特有类型。 调用顺序上有个硬规矩:任何 AutoItX 函数之前必须先 AU3_Init() 初始化 dll。函数成功通常返回 1,失败返回 0;void 型函数出错时要么吐出带 "0" 的字符串,要么返回空结构,此时用 AU3_error() 查错。 字符串引用类函数带缓冲区大小参数,调用前必须用 StringInit 显式设好长度。若缓冲区不够,函数只填进分配到的空间、其余截断,且事先没法预知所需额度——这是必须记住的怪癖。带 ByHandle 后缀的函数(如 AU3_WinCloseByHandle)按句柄识窗体,调试时比按标题找更不容易错。 下面这段是从 autoIt.mqh 摘出的声明片段,看清楚 AU3_Init 无参、AU3_error 无参返回 int、带字符串缓冲区的函数都带 nBufSize 形参:

MQL5 / C++
class="macro">#pragma once
class=class="str">"cmt">///////////////////////////////////////////////////////////////////////////////
class=class="str">"cmt">//
class=class="str">"cmt">// AutoItX v3
class=class="str">"cmt">//
class=class="str">"cmt">// Copyright(C)class="num">1999-class="num">2013:
class=class="str">"cmt">//	- Jonathan Bennett <jon at autoitscript dot com>
class=class="str">"cmt">//	- See "AUTHORS.txt" for contributors.
class=class="str">"cmt">//
class=class="str">"cmt">// This file is part of AutoItX.  Use of this file and the AutoItX DLL is subject
class=class="str">"cmt">// to the terms of the AutoItX license details of which can be found in the helpfile.
class=class="str">"cmt">//
class=class="str">"cmt">// When using the AutoItX3.dll as a standard DLL this file contains the definitions,
class=class="str">"cmt">// and function declarations required to use the DLL and AutoItX3_DLL.lib file.
class=class="str">"cmt">//
class=class="str">"cmt">///////////////////////////////////////////////////////////////////////////////
class="macro">#ifdef __cplusplus
class="macro">#define AU3_API class="kw">extern "C"
class="macro">#else
class="macro">#define AU3_API
class="macro">#endif
class=class="str">"cmt">// Definitions
class="macro">#define AU3_INTDEFAULT(-class="num">2147483647)	class=class="str">"cmt">// "Default" value for _some_ class="type">int parameters(largest negative number)
class=class="str">"cmt">//
class=class="str">"cmt">// nBufSize
class=class="str">"cmt">// When used for specifying the size of a resulting class="type">class="kw">string buffer this is the number of CHARACTERS
class=class="str">"cmt">// in that buffer, including the null terminator.  For example:
class=class="str">"cmt">//
class=class="str">"cmt">// WCHAR szBuffer[class="num">10];
class=class="str">"cmt">// AU3_ClipGet(szBuffer, class="num">10);
class=class="str">"cmt">//
class=class="str">"cmt">// The resulting class="type">class="kw">string will be truncated at class="num">9 characters with the the terminating null in the 10th.
class=class="str">"cmt">//
class=class="str">"cmt">///////////////////////////////////////////////////////////////////////////////
class=class="str">"cmt">// Exported functions
class=class="str">"cmt">///////////////////////////////////////////////////////////////////////////////
class="macro">#include <windows.h>
AU3_API class="type">void WINAPI AU3_Init(class="type">void);
AU3_API class="type">int AU3_error(class="type">void);
AU3_API class="type">int WINAPI AU3_AutoItSetOption(LPCWSTR szOption, class="type">int nValue);
AU3_API class="type">void WINAPI AU3_ClipGet(LPWSTR szClip, class="type">int nBufSize);
AU3_API class="type">void WINAPI AU3_ClipPut(LPCWSTR szClip);
AU3_API class="type">int WINAPI AU3_ControlClick(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl, LPCWSTR szButton, class="type">int nNumClicks, class="type">int nX = AU3_INTDEFAULT, class="type">int nY = AU3_INTDEFAULT);
AU3_API class="type">int WINAPI AU3_ControlClickByHandle(HWND hWnd, HWND hCtrl, LPCWSTR szButton, class="type">int nNumClicks, class="type">int nX = AU3_INTDEFAULT, class="type">int nY = AU3_INTDEFAULT);
AU3_API class="type">void WINAPI AU3_ControlCommand(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl, LPCWSTR szCommand, LPCWSTR szExtra, LPWSTR szResult, class="type">int nBufSize);
AU3_API class="type">void WINAPI AU3_ControlCommandByHandle(HWND hWnd, HWND hCtrl, LPCWSTR szCommand, LPCWSTR szExtra, LPWSTR szResult, class="type">int nBufSize);

AutoIt 控件与鼠标接口的 C 声明长清单

做 MT5 外接自动化时,常需要借 AutoIt 的 DLL 去操控第三方窗口里的控件。下面这组 AU3_API 声明覆盖了 ListView、TreeView、文本框、显隐与坐标获取等动作,是 DLL 导入 MT5 前必须对齐的函数签名。 AU3_ControlListView 与 AU3_ControlListViewByHandle 都走 szCommand + 两个扩展参数拿结果,区别只在定位方式:前者用窗口标题/文本/控件名,后者直接用 HWND 句柄,后者在已知句柄时更稳。 带 ByHandle 后缀的函数(如 AU3_ControlEnableByHandle、AU3_ControlGetTextByHandle)普遍比标题定位版少两个字符串参数,回调延迟倾向更低。AU3_ControlMove 默认 nWidth 与 nHeight 为 -1,表示不改尺寸只移位置。 鼠标侧 AU3_MouseClick 的 nX、nY 若传 AU3_INTDEFAULT 则点击当前光标位;nSpeed 默认 -1 代表用 AutoIt 全局速度。AU3_MouseClickDrag 则强制要求起止坐标,无默认值。 把这些声明原样贴进 MT5 的 #import 区块,就能在 EA 里直接调 AU3_ControlSend 向控件发键、用 AU3_ControlGetText 抓报价框文本,外汇与贵金属品种波动快,这种外挂式读取有断连风险,参数需自己压测。

MQL5 / C++
AU3_API class="type">void WINAPI AU3_ControlListView(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl, LPCWSTR szCommand, LPCWSTR szExtra1, LPCWSTR szExtra2, LPWSTR szResult, class="type">int nBufSize);
AU3_API class="type">void WINAPI AU3_ControlListViewByHandle(HWND hWnd, HWND hCtrl, LPCWSTR szCommand, LPCWSTR szExtra1, LPCWSTR szExtra2, LPWSTR szResult, class="type">int nBufSize);
AU3_API class="type">int WINAPI AU3_ControlDisable(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl);
AU3_API class="type">int WINAPI AU3_ControlDisableByHandle(HWND hWnd, HWND hCtrl);
AU3_API class="type">int WINAPI AU3_ControlEnable(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl);
AU3_API class="type">int WINAPI AU3_ControlEnableByHandle(HWND hWnd, HWND hCtrl);
AU3_API class="type">int WINAPI AU3_ControlFocus(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl);
AU3_API class="type">int WINAPI AU3_ControlFocusByHandle(HWND hWnd, HWND hCtrl);
AU3_API class="type">void WINAPI AU3_ControlGetFocus(LPCWSTR szTitle, LPCWSTR szText, LPWSTR szControlWithFocus, class="type">int nBufSize);
AU3_API class="type">void WINAPI AU3_ControlGetFocusByHandle(HWND hWnd, LPWSTR szControlWithFocus, class="type">int nBufSize);
AU3_API HWND WINAPI AU3_ControlGetHandle(HWND hWnd, LPCWSTR szControl);
AU3_API class="type">void WINAPI AU3_ControlGetHandleAsText(LPCWSTR szTitle, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szText, LPCWSTR szControl, LPWSTR szRetText, class="type">int nBufSize);
AU3_API class="type">int WINAPI AU3_ControlGetPos(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl, LPRECT lpRect);
AU3_API class="type">int WINAPI AU3_ControlGetPosByHandle(HWND hWnd, HWND hCtrl, LPRECT lpRect);
AU3_API class="type">void WINAPI AU3_ControlGetText(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl, LPWSTR szControlText, class="type">int nBufSize);
AU3_API class="type">void WINAPI AU3_ControlGetTextByHandle(HWND hWnd, HWND hCtrl, LPWSTR szControlText, class="type">int nBufSize);
AU3_API class="type">int WINAPI AU3_ControlHide(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl);
AU3_API class="type">int WINAPI AU3_ControlHideByHandle(HWND hWnd, HWND hCtrl);
AU3_API class="type">int WINAPI AU3_ControlMove(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl, class="type">int nX, class="type">int nY, class="type">int nWidth = -class="num">1, class="type">int nHeight = -class="num">1);
AU3_API class="type">int WINAPI AU3_ControlMoveByHandle(HWND hWnd, HWND hCtrl, class="type">int nX, class="type">int nY, class="type">int nWidth = -class="num">1, class="type">int nHeight = -class="num">1);
AU3_API class="type">int WINAPI AU3_ControlSend(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl, LPCWSTR szSendText, class="type">int nMode = class="num">0);
AU3_API class="type">int WINAPI AU3_ControlSendByHandle(HWND hWnd, HWND hCtrl, LPCWSTR szSendText, class="type">int nMode = class="num">0);
AU3_API class="type">int WINAPI AU3_ControlSetText(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl, LPCWSTR szControlText);
AU3_API class="type">int WINAPI AU3_ControlSetTextByHandle(HWND hWnd, HWND hCtrl, LPCWSTR szControlText);
AU3_API class="type">int WINAPI AU3_ControlShow(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl);
AU3_API class="type">int WINAPI AU3_ControlShowByHandle(HWND hWnd, HWND hCtrl);
AU3_API class="type">void WINAPI AU3_ControlTreeView(LPCWSTR szTitle, LPCWSTR szText, LPCWSTR szControl, LPCWSTR szCommand, LPCWSTR szExtra1, LPCWSTR szExtra2, LPWSTR szResult, class="type">int nBufSize);
AU3_API class="type">void WINAPI AU3_ControlTreeViewByHandle(HWND hWnd, HWND hCtrl, LPCWSTR szCommand, LPCWSTR szExtra1, LPCWSTR szExtra2, LPWSTR szResult, class="type">int nBufSize);
AU3_API class="type">void WINAPI AU3_DriveMapAdd(LPCWSTR szDevice, LPCWSTR szShare, class="type">int nFlags, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szUser, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szPwd, LPWSTR szResult, class="type">int nBufSize);
AU3_API class="type">int WINAPI AU3_DriveMapDel(LPCWSTR szDevice);
AU3_API class="type">void WINAPI AU3_DriveMapGet(LPCWSTR szDevice, LPWSTR szMapping, class="type">int nBufSize);
AU3_API class="type">int WINAPI AU3_IsAdmin(class="type">void);
AU3_API class="type">int WINAPI AU3_MouseClick(class=class="str">"cmt">/*[in,defaultvalue("LEFT")]*/LPCWSTR szButton, class="type">int nX = AU3_INTDEFAULT, class="type">int nY = AU3_INTDEFAULT, class="type">int nClicks = class="num">1, class="type">int nSpeed = -class="num">1);
AU3_API class="type">int WINAPI AU3_MouseClickDrag(LPCWSTR szButton, class="type">int nX1, class="type">int nY1, class="type">int nX2, class="type">int nY2, class="type">int nSpeed = -class="num">1);

◍ 用 WinAPI 接管 MT5 外部窗口与鼠标像素

上面这批 AU3_ 开头的导出函数,本质是把 Windows 桌面自动化能力暴露给 MQL5 侧的 DLL 调用层。对做价格行为复盘的交易者来说,最有用的不是下单接口,而是 Mouse、Pixel、Win 这三类——它们能让你在 MT5 图表之外抓取状态。 比如 AU3_PixelGetColor 接收屏幕坐标 nX、nY,返回该点 RGB 颜色值;AU3_PixelSearch 在 lpRect 矩形区域内按 nStep 步长找 nCol 指定色,命中就把坐标写回 pPointResult。实盘里你可以用它盯一个固定位置的报价数字颜色变化,而不用读窗口文本。 鼠标侧 AU3_MouseMove(nX, nY, nSpeed) 的 nSpeed 默认 -1 表示瞬时跳转,设 1~100 则按轨迹移动,某些券商防脚本会检测轨迹平滑度。AU3_MouseDown / Up 的 szButton 默认 LEFT,可做模拟点击挂单面板。 窗口侧 AU3_WinActivate 按 szTitle 激活,AU3_WinGetClientSize 取客户区矩形,配合前面的像素函数就能算图表在屏幕上的绝对坐标偏移。外汇与贵金属杠杆高、滑点大,这类外部自动化只建议在模拟账户验证,实盘启用前先确认券商不封禁。 下面这段声明直接贴进你的 au3_link.h 即可编译对接,注意 LPRECT、LPPOINT 要与调用方结构体对齐,否则可能读到野指针。

MQL5 / C++
AU3_API class="type">void WINAPI AU3_MouseDown(class=class="str">"cmt">/*[in,defaultvalue("LEFT")]*/LPCWSTR szButton);
AU3_API class="type">int WINAPI AU3_MouseGetCursor(class="type">void);
AU3_API class="type">void WINAPI AU3_MouseGetPos(LPPOINT lpPoint);
AU3_API class="type">int WINAPI AU3_MouseMove(class="type">int nX, class="type">int nY, class="type">int nSpeed = -class="num">1);
AU3_API class="type">void WINAPI AU3_MouseUp(class=class="str">"cmt">/*[in,defaultvalue("LEFT")]*/LPCWSTR szButton);
AU3_API class="type">void WINAPI AU3_MouseWheel(LPCWSTR szDirection, class="type">int nClicks);
AU3_API class="type">int WINAPI AU3_Opt(LPCWSTR szOption, class="type">int nValue);
AU3_API unsigned class="type">int WINAPI AU3_PixelChecksum(LPRECT lpRect, class="type">int nStep = class="num">1);
AU3_API class="type">int WINAPI AU3_PixelGetColor(class="type">int nX, class="type">int nY);
AU3_API class="type">void WINAPI AU3_PixelSearch(LPRECT lpRect, class="type">int nCol, class=class="str">"cmt">/*class="kw">default class="num">0*/class="type">int nVar, class=class="str">"cmt">/*class="kw">default class="num">1*/class="type">int nStep, LPPOINT pPointResult);
AU3_API class="type">int WINAPI AU3_ProcessClose(LPCWSTR szProcess);
AU3_API class="type">int WINAPI AU3_ProcessExists(LPCWSTR szProcess);
AU3_API class="type">int WINAPI AU3_ProcessSetPriority(LPCWSTR szProcess, class="type">int nPriority);
AU3_API class="type">int WINAPI AU3_ProcessWait(LPCWSTR szProcess, class="type">int nTimeout = class="num">0);
AU3_API class="type">int WINAPI AU3_ProcessWaitClose(LPCWSTR szProcess, class="type">int nTimeout = class="num">0);
AU3_API class="type">int WINAPI AU3_Run(LPCWSTR szProgram, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szDir, class="type">int nShowFlag = SW_SHOWNORMAL);
AU3_API class="type">int WINAPI AU3_RunWait(LPCWSTR szProgram, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szDir, class="type">int nShowFlag = SW_SHOWNORMAL);
AU3_API class="type">int WINAPI AU3_RunAs(LPCWSTR szUser, LPCWSTR szDomain, LPCWSTR szPassword, class="type">int nLogonFlag, LPCWSTR szProgram, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szDir, class="type">int nShowFlag = SW_SHOWNORMAL);
AU3_API class="type">int WINAPI AU3_RunAsWait(LPCWSTR szUser, LPCWSTR szDomain, LPCWSTR szPassword, class="type">int nLogonFlag, LPCWSTR szProgram, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szDir, class="type">int nShowFlag = SW_SHOWNORMAL);
AU3_API class="type">void WINAPI AU3_Send(LPCWSTR szSendText, class="type">int nMode = class="num">0);
AU3_API class="type">int WINAPI AU3_Shutdown(class="type">int nFlags);
AU3_API class="type">void WINAPI AU3_Sleep(class="type">int nMilliseconds);
AU3_API class="type">int WINAPI AU3_StatusbarGetText(LPCWSTR szTitle, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szText, class=class="str">"cmt">/*[in,defaultvalue(class="num">1)]*/class="type">int nPart, LPWSTR szStatusText, class="type">int nBufSize);
AU3_API class="type">int WINAPI AU3_StatusbarGetTextByHandle(HWND hWnd, class=class="str">"cmt">/*[in,defaultvalue(class="num">1)]*/class="type">int nPart, LPWSTR szStatusText, class="type">int nBufSize);
AU3_API class="type">void WINAPI AU3_ToolTip(LPCWSTR szTip, class="type">int nX = AU3_INTDEFAULT, class="type">int nY = AU3_INTDEFAULT);
AU3_API class="type">int WINAPI AU3_WinActivate(LPCWSTR szTitle, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szText);
AU3_API class="type">int WINAPI AU3_WinActivateByHandle(HWND hWnd);
AU3_API class="type">int WINAPI AU3_WinActive(LPCWSTR szTitle, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szText);
AU3_API class="type">int WINAPI AU3_WinActiveByHandle(HWND hWnd);
AU3_API class="type">int WINAPI AU3_WinClose(LPCWSTR szTitle, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szText);
AU3_API class="type">int WINAPI AU3_WinCloseByHandle(HWND hWnd);
AU3_API class="type">int WINAPI AU3_WinExists(LPCWSTR szTitle, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szText);
AU3_API class="type">int WINAPI AU3_WinExistsByHandle(HWND hWnd);
AU3_API class="type">int WINAPI AU3_WinGetCaretPos(LPPOINT lpPoint);
AU3_API class="type">void WINAPI AU3_WinGetClassList(LPCWSTR szTitle, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szText, LPWSTR szRetText, class="type">int nBufSize);
AU3_API class="type">void WINAPI AU3_WinGetClassListByHandle(HWND hWnd, LPWSTR szRetText, class="type">int nBufSize);
AU3_API class="type">int WINAPI AU3_WinGetClientSize(LPCWSTR szTitle, class=class="str">"cmt">/*[in,defaultvalue("")]*/LPCWSTR szText, LPRECT lpRect);
AU3_API class="type">int WINAPI AU3_WinGetClientSizeByHandle(HWND hWnd, LPRECT lpRect);
让小布替你跑这套
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到 AutoIt 类跑出来的终端状态快照,你不必自己编译 DLL 也能核对脚本是否挂对图表。

常见问题

MQL5 运行在终端沙箱内,没有 Win32 API 权限,只能走事件和对象接口;涉及真实窗口句柄和鼠标键盘模拟的任务需要外部自动化层介入。
不能。它只对标准 Win32 组件可靠,用跨平台框架或自绘控件的软件大概率读不到属性,先用 Finder 拖一下验证兼容性。
不是。AutoItX 只是 DLL 形态的部分实现,有些脚本函数没暴露给 COM 接口,设计前要查官方组件清单避免踩空。
小布盯盘已把常见的终端读取与警报处理封装成内置诊断,普通用户打开品种页就能看,不必自己部署 AutoIt 环境;进阶玩家仍可参考本文结构做私有扩展。
主程序是 32 位但带 64 位 AutoItX 组件,正常安装即可;调用 DLL 时确认终端架构匹配对应版本的 AutoItX 就不会加载失败。