从本章开始,我们将学习一些在开发EA时可能会非常实用的一些附加功能和技巧。
转义字符
在MQL4的字符串常量(即用双引号括起来的文本)中,如果您希望包含某些特殊字符,如双引号本身、单引号或反斜杠符号,您需要在这些特殊字符前加上一个反斜杠 (\
) 作为转义符。这样做的目的是告诉编译器,紧跟在反斜杠后面的字符应该被视为普通文本字符,而不是具有其特殊语法含义的字符。
- 插入双引号 (
"
): 使用\"
string example1 = "这是一段包含\"引号\"的文本。"; // Print(example1); 输出将是: 这是一段包含"引号"的文本。
- 插入单引号 (
'
): 使用\'
(虽然在 MQL4字符串中单引号通常不需要转义,但这样做更规范)string example2 = "It\'s a beautiful day."; // Print(example2); 输出将是: It's a beautiful day.
- 插入反斜杠 (
\
): 使用\\
string example3 = "文件路径是 C:\\MQL4\\Experts\\"; // Print(example3); 输出将是: 文件路径是 C:\MQL4\Experts\
- 插入换行符 (Newline): 如果希望字符串在显示或打印时能够跨越多行,可以使用
\n
转义序列来插入一个换行符。string multiLineText = "第一行文本\n第二行文本"; // Alert(multiLineText); 将会分两行显示: // 第一行文本 // 第二行文本
利用图表注释函数 Comment()
显示信息
MQL4提供了一个内置函数 Comment()
,允许您在当前图表的左上角直接显示文本信息。这个功能非常实用,可以用来实时展示 EA 的状态、关键参数设置、当前订单信息、指标读数或任何其他您认为对监控 EA 运行有帮助的内容。
一种常用的组织和显示多行图表注释的方法是:
- 根据信息类别声明多个字符串变量(例如,一个用于显示EA参数设置,另一个用于显示当前状态或交易信号等)。
- 在
OnTick()
函数的逻辑中,更新这些字符串变量的值。 - 使用字符串连接(通常是
+
运算符)并将换行符\n
插入其间,将这些独立的字符串组合成一个最终的、包含多行内容的字符串。 - 在
OnTick()
函数的末尾调用
Comment()
函数,并将这个组合好的字符串作为参数传递给它。这样做可以确保图表注释在每个 tick (或每次OnTick()
函数执行) 后都能得到更新。
代码示例:
// --- 假设在外部参数或全局变量中定义了 ---
// extern int FastMAPeriod = 10;
// extern int SlowMAPeriod = 20;
// string currentStatus = "等待信号..."; // 一个全局或静态变量用于存储状态
// --- 在 OnTick()
函数内部 ---
// 1. 准备要显示的信息字符串
string settingsInfo = StringFormat("MA周期: %d / %d", FastMAPeriod, SlowMAPeriod);
// 使用 StringFormat 更灵活
string statusInfo = ""; // 例如, statusInfo = "已开买单,订单号: " + OrderTicket();
// 2. 根据当前状态更新 statusInfo
if (g_BuyTicket > 0)
statusInfo = "持有买单: #" + (string)g_BuyTicket;
else if (g_SellTicket > 0) statusInfo = "持有卖单: #" + (string)g_SellTicket;
else
statusInfo = "当前无持仓,等待信号...";
// 3. 在OnTick()
函数的末尾,组合并显示注释
Comment(settingsInfo, "\n", // 第一行:设置信息,后跟换行符 statusInfo // 第二行:状态信息 );
// Comment() 函数也支持直接传入多个参数,它们会被自动连接起来,中间可以插入 "\n" 实现换行
在这个示例中,StringFormat()
是MQL4中的一个内置函数,用于格式化字符串,类似于其他编程语言中的printf或format函数,返回一个格式化后的字符串。 "MA周期: %d / %d"
这是格式化字符串的模板 %d
是占位符,会被后面的参数依次替换,这里有两个%d
,分别对应两个移动平均线的周期。settingsInfo
用于显示移动平均线的周期参数,statusInfo
用于显示当前的订单状态。通过 "\n"
将它们分隔开,最终在图表上会显示为两行文本。