Skip to content

函数

在MQL5中,函数是封装特定功能的代码模块,可提高代码复用性和可维护性。从系统内置函数到自定义函数,掌握函数的使用是编写高效EA的关键。

一、函数的核心组成与分类

三大要素

  1. 返回值类型:指定函数执行后返回的数据类型(如int/double/void),void表示无返回值。
  2. 函数名:遵循标识符规则(字母/下划线开头,避免保留字),如CalculateProfit
  3. 参数列表:零个或多个参数,格式为(参数类型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函数支持多参数拼接:
    cpp
    Print("账户余额:", 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("浮盈在合理范围内。");  
    }  
}