MQL4内置函数与指标调用实战
📊

MQL4内置函数与指标调用实战

从数学函数到技术指标信号追踪详解

MQL5 编程 难度 · 入门 2026-05-16 7 分钟阅读
#MQL4#技术指标#内置函数#EA开发

一、MQL4数学函数基础与应用

在MQL4程序开发中,数学函数是最常用的工具之一。它们用于处理价格数据、计算止损点位、生成随机数以及进行各种数值运算。MetaQuotes内置了完整的数学库,开发者无需自行实现基础算法,直接调用即可。理解这些函数的边界条件(例如负数开平方返回0)对避免程序逻辑错误至关重要。

MathAbs返回参数的绝对值,负数进去正数出来。MathCeil向上取整,哪怕小数只有0.001也会进一位;MathFloor相反,直接截断小数部分;MathRound按四舍五入规则,0.5及以上进1。MathMax和MathMin比较两参数返回大或小值。MathPow计算乘方,MathSqrt求平方根(负数得0),MathLog求自然对数(负数或0得-1),MathExp计算e的次幂,实测在指数约1e309时才溢出返回0,日常使用无需担心。

✦ 随机范围技巧
要得到5到10的随机整数,用 MathRand()%6+5;要得-20到-10用 (MathRand()%11+10)*(-1);要0.0~1.0三位小数用 MathRand()%1001/1000.0,注意必须除1000.0浮点以免整除归零。
int a=0;
MathSrand(TimeLocal());
while(a<5)
{
   MessageBox("random="+MathRand()%6);
   a++;
}

二、三角函数与弧度转换

MQL4的三角函数(MathSin、MathCos、MathTan、MathArcsin、MathArccos、MathArctan)参数均为弧度而非角度。若需计算20度正弦,必须先转弧度:20.0*3.14159/180.0。建议在文件头部用 #define PI 3.1415926535897 定义常量方便复用。MathTan接受范围约±2^63,超限变不确定;MathArcsin/Arccos只接受-1到1,否则返回0并写日志;MathArctan(0)返回0。

#define PI 3.1415926535897
MathSin(20.0*PI/180.0);

三、信息输出与调试函数

除MessageBox外,MQL4提供三个常用输出函数。Alert(...)弹出带声音的提示框,适合信号报警,可在终端设置中改音;Comment(...)在图表左上角显示信息,不阻断代码;Print(...)写入EA日志文件(MT4/experts/logs/日期.log),便于事后排查。三者最多各显示64个参数,double默认显示4位小数,数组需逐元素输出。

⚠ Alert阻塞注意
Alert会弹出窗口,连续调用虽不覆盖但需用户点确定,脚本中大量使用会卡住自动运行。正式EA建议用Comment显示状态,关键事件用Print记录。
Alert("signal type:",signalType);
Comment("some usefull information");
Print("processing...");

四、技术指标函数通用参数规则

几乎所有i开头的指标函数都遵循统一参数结构:symbol(品种,NULL或0为当前图)、timeframe(周期,0为当前或PERIOD_M1等常量)、shift(柱偏移,0为最后一根)。许多指标还有period(计算均值柱数)、ma_method(MODE_SMA/EMA/SMMA/LWMA)、applied_price(PRICE_CLOSE等七种价格)、mode(复杂指标选线如MODE_MAIN)。指标不必在图上加载,后台直接计算。

指标分两类:简单指标(AC、AD、AO等)单值直接返回;复杂指标(鳄鱼、ADX、布林、MACD等)需用mode参数指定返回哪条线。MetaEditor中按Ctrl+T打开工具箱帮助可查每个函数原型与参数说明,强烈建议新手随时翻阅。

五、常用技术指标函数示例

以下列举部分典型指标调用。iMA计算移动平均,iMACD取快慢线差并可用MODE_SIGNAL取信号线,iStochastic随机指标需%Kperiod、%Dperiod、slowing、method、price_field及mode,iBands布林带用mode选上轨MODE_UPPER或下轨MODE_LOWER,iAlligator鳄鱼指标需分别设 jaw/teeth/lips 周期与偏移及mode选线。这些函数返回double,可直接用于逻辑判断。

double ma=iMA(0,0,13,0,MODE_SMA,PRICE_CLOSE,0);
double macd=iMACD(0,0,9,21,9,PRICE_CLOSE,MODE_MAIN,0);
double upper=iBands(0,0,20,2,0,PRICE_LOW,MODE_LOWER,0);

以iStochastic为例,完整参数:iStochastic(symbol,timeframe,%Kperiod,%Dperiod,slowing,method,price_field,mode,shift)。price_field为0表示用最低/最高价,1表示收/收。mode选MODE_MAIN主线或MODE_SIGNAL信号线。这种结构在OsMA、RVI等也类似。

六、用随机指标追踪买卖信号

文章示范了基于随机指标交叉的信号的脚本:当主线由下穿上信号线则买,由上穿下则卖。核心是先取当前与前置柱的主线和信号线值,用逻辑与&&比较前态与现态。为分析多根柱,放入for循环遍历BARS_TO_ANALYSE根。最终用TimeToStr(Time[a])在Alert中显示时间,方便定位历史信号。

#define BARS_TO_ANALYSE 100
int start()
{
   double mainLine, prevMainLine, signalLine, prevSignalLine;
   for(int a=0;a<BARS_TO_ANALYSE;a++)
   {
      mainLine=iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_MAIN,a);
      prevMainLine=iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_MAIN,a+1);
      signalLine=iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,a);
      prevSignalLine=iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,a+1);
      if(prevMainLine<prevSignalLine && mainLine>signalLine)
         Alert("Signal to buy. Time: ",TimeToStr(Time[a]));
      if(prevMainLine>prevSignalLine && mainLine<signalLine)
         Alert("Signal to sell. Time: ",TimeToStr(Time[a]));
   }
   return(0);
}
✦ 作业拓展
可加入长周期MA(200~500)过滤:价高于均线不卖,低于不买。用iMA取均线值后在if中加条件即可减少假信号。

七、变量声明与多返回值函数

MQL4变量可同行逗号分隔声明并初始化,如 double a, b=2.0; 数组亦同。普通函数仅return一个值,但用&引用传参可修改外部变量实现多返回:void SuperFunc(int& v1, double& v2, string& v3) 内赋值后调用方生效。忽略&则内部改不动外部。多行注释用 /* ... */ 包裹,便于临时屏蔽代码块。

void SuperFunc(int& valueForReturn1,double& valueForReturn2,string& valueForReturn3)
{
   valueForReturn1=100;
   valueForReturn2=300.0;
   valueForReturn3="it works!!";
}
int v1=0; double v2=0; string v3="";
SuperFunc(v1,v2,v3);

八、常见坑与对比总结

新手常踩坑:把角度当弧度传入三角函数;MathRand未设种子导致回测信号重复;用Alert大量弹窗卡死;指标mode参数漏写导致复杂指标返回0;除法取整用错整型除丢失精度。相比MQL5,MQL4指标函数名带i前缀且返回double,MQL5多用矩阵缓冲区,但逻辑相通。掌握本文函数后,可顺利过渡到自定义指标与EA编写。

常见问题

在调用MathRand前用MathSrand(TimeLocal())设定随机种子,TimeLocal返回当前秒数保证每次不同,从而获得新随机序列。
使用iStochastic(symbol,timeframe,%Kperiod,%Dperiod,slowing,method,price_field,MODE_SIGNAL,shift),mode填MODE_SIGNAL即返回信号线,MODE_MAIN返回主线。
MQL4三角函数参数是弧度不是角度,需将角度乘PI/180转换,例如20度写MathSin(20.0*3.14159/180.0)。
调用iBands时mode参数填MODE_UPPER取上线,MODE_LOWER取下线,其余参数含period、deviation、applied_price等按需求设定。
用引用传参,在参数前加&,如void f(int& a, double& b),函数内赋值后外部变量即被修改,从而实现多值返回。