函数
在MQL5中,函数是封装特定功能的代码模块,可提高代码复用性和可维护性。从系统内置函数到自定义函数,掌握函数的使用是编写高效EA的关键。
一、函数的核心组成与分类
三大要素:
- 返回值类型:指定函数执行后返回的数据类型(如
int
/double
/void
),void
表示无返回值。 - 函数名:遵循标识符规则(字母/下划线开头,避免保留字),如
CalculateProfit
。 - 参数列表:零个或多个参数,格式为
(参数类型1 参数名1, 参数类型2 参数名2)
。
分类:
- 系统内置函数:MT5预定义函数(如
Print
/AccountInfoDouble
),直接调用无需声明。 - 自定义函数:用户根据需求编写的函数,需先定义后调用。
二、系统内置函数:
MT5提供大量内置函数,覆盖账户信息、数学运算、字符串处理等场景。以下是高频使用场景:
1. 账户信息获取
通过AccountInfoDouble
/AccountInfoInteger
/AccountInfoString
等获取账户数据:
cpp
double balance = AccountInfoDouble(ACCOUNT_BALANCE); // 账户余额
double profit = AccountInfoDouble(ACCOUNT_PROFIT); // 浮盈/浮亏
double equity = AccountInfoDouble(ACCOUNT_EQUITY); // 账户净值权益
double margin = AccountInfoDouble(ACCOUNT_MARGIN); // 保证金
double margin_free = AccountInfoDouble(ACCOUNT_MARGIN_FREE); // 可用保证金
double margin_level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // 保证金 比例
string company = AccountInfoString(ACCOUNT_COMPANY); // 券商名称
string currency = AccountInfoString(ACCOUNT_CURRENCY); // 账户货币
string server = AccountInfoString(ACCOUNT_SERVER); // 账户货币
printf("账户余额=%G",balance);
printf("账户利润=%G",profit);
printf("账户权益=%G",equity);
printf("账户保证金=%G",margin);
printf("可用保证金=%G",margin_free);
printf("保证金比例=%G",margin_level);
printf("券商名称=%s",company);
printf("账户货币=%s",currency);
printf("账户服务器=%s",server);
2. 数学运算
cpp
double absValue = MathAbs(-10.5); // 绝对值(10.5)
int maxNum = MathMax(5, 10); // 取最大值(10)
double roundNum = MathRound(3.7); // 四舍五入(4)
3. 字符串处理
cpp
string symbol = Symbol(); // 获取当前交易品种
int strLen = StringLen(symbol); // 字符串长度(如"EURUSD"长度6)
bool contains = StringFind(symbol, "USD") != -1; // 检查是否包含"USD"
官方文档使用:
- 按
F1
查看函数详细说明(参数、返回值、示例),如Print
函数支持多参数拼接:cppPrint("账户余额:", balance, " 货币:", currency);
三、自定义函数:封装专属功能
通过自定义函数避免重复代码,提高开发效率。
1. 定义语法
cpp
返回值类型 函数名(参数列表)
{
// 方法体(实现具体功能)
return 结果; // 有返回值时必须使用
}
2. 示例:计算两数之和
cpp
// 定义:接收两个double参数,返回和
double AddNumbers(double num1, double num2)
{
double sum = num1 + num2;
return sum; // 返回计算结果
}
// 调用:传入参数并接收返回值
void OnTick()
{
double result = AddNumbers(10.5, 5.5);
Print("两数之和:", result); // 输出16
}
3. 无返回值函数(void
)
cpp
// 定义:打印账户信息
void PrintAccountInfo()
{
Print("余额:", AccountInfoDouble(ACCOUNT_BALANCE));
Print("浮盈:", AccountInfoDouble(ACCOUNT_PROFIT));
}
// 调用:直接执行,无需接收值
PrintAccountInfo();
四、函数库:代码模块化的终极形态
将常用函数封装为库(.mq5
文件),通过#include
引入,避免重复编写。
1. 创建函数库
cpp
// MyTradingTools.mq5
double CalculateRisk(double balance, double riskRatio)
{
return balance * riskRatio; // 计算风险金额
}
2. 引入与使用
cpp
#include "MyTradingTools.mq5" // 引入库文件
void OnTick()
{
double risk = CalculateRisk(10000, 0.02); // 使用库函数
Print("风险金额:", risk); // 输出200
}
五、实战练习:判断账户浮盈状态
需求:编写函数判断账户浮盈是否超过/低于指定标准,返回状态码并弹窗提示。
1. 自定义函数实现
cpp
// 定义:接收基准值,返回状态码(1=浮盈超过,-1=浮亏低于,0=中间状态)
int CheckProfit(double threshold)
{
double profit = AccountInfoDouble(ACCOUNT_PROFIT);
if (profit > threshold) return 1;
else if (profit < -threshold) return -1;
else return 0;
}
// 调用与逻辑判断
void OnTick()
{
int result = CheckProfit(100); // 基准值500
if(result == 1)
{
Alert("账户浮盈已超过100美元!");
}else if(result == -1)
{
Alert("账户浮亏已低于-100美元!");
}else{
Print("浮盈在合理范围内。");
}
}