声音警报

为处理声音,MQL5 API 提供了一个函数:PlaySound

bool PlaySound(const string soundfile)

该函数播放 wav 格式的指定声音文件。

如果指定了文件名称而没有路径(如 "Ring.wav"),则该文件必须位于终端安装目录中的 Sounds 文件夹中。如果需要,你可以整理 Sounds 文件夹内的子文件夹。在这种情况下,soundfile 参数中的文件名应在前面带有一个相对路径。例如,"Example/Ring.wav" 指终端安装目录中的文件夹和文件 Sounds/Example/Ring.wav

此外,你可以使用位于终端的数据目录中的任何其它 MQL5 子文件夹中的声音文件。该路径必须在前面有一个前导斜杠(单斜杠 '/' 或双反斜杠 '\\'),这是用于文件系统中相邻文件夹层级之间的定界符。例如,如果声音文件 Demo.wav 位于 terminal_data_directory/MQL5/Files 中,则在 PlaySound 调用中,我们将写入路径 "/Files/Demo.wav"。

以 NULL 参数调用该函数将会停止声音播放。当旧文件正在播放时以新文件调用函数将会导致旧文件播放中断,新文件开始播放。

除了位于文件系统中的文件之外,还可以将指向资源(嵌入 MQL 程序中的数据块)的路径传递给该函数。具体说,开发人员可在编译时,根据沙盒内本地可用的文件创建声音资源。所有资源均位于 ex5 文件中,这确保用户拥有这些资源,并简化了程序作为单个模块的分发。

有关资源(不仅包括声音,还有图像、任意二进制文件和文本数据以及独立程序(指标))的所有使用方法的详细描述,可参见本书第七章中的对应 章节

如果找到文件,PlaySound 函数返回 true,否则返回 false。请注意,即使该文件不是音频文件而无法播放,该函数也将返回 true

声音回放与后续程序指令的执行并行异步执行。换言之,该函数在调用后立即将控制权交回给调用代码,而不会等待音频效果完成。

在策略测试程序中,不执行PlaySound 函数。

OutputSound.mq5 脚本允许你测试该函数的操作。

void OnStart()
{
   PRTF(PlaySound("new.txt"));
   PRTF(PlaySound("abracadabra.wav"));
   const uint start = GetTickCount();
   PRTF(PlaySound("request.wav"));
   PRTF(GetTickCount() - start);
}

程序尝试播放多个文件。文件 "new.txt" 存在(特意为测试创建),文件 "abracadabra.wav" 不存在,"request.wav" 文件包括在 MetaTrader 5 的标准分发中。通过两次调用 GetTickCount 来测量上次函数调用时间。

运行该脚本后,我们得到以下日志条目:

PlaySound(new.txt)=true / ok
PlaySound(abracadabra.wav)=false / FILE_NOT_EXIST(5019)
PlaySound(request.wav)=true / ok
GetTickCount()-start=0 / ok

找到了 "new.txt" 文件,因此函数返回 true,尽管该文件不能播放声音。对第二个不存在的文件的调用返回了 false,并且 _LastError 中的错误代码为 5019 (FILE_NOT_EXIST)。最后,最后一个文件(假设它存在)的播放从各方面来说应会成功:函数将返回 true,终端将播放音频。调用处理时间几乎为零(不考虑声音持续时间)。