MQL4内置函数与指标调用实战
从数学函数到技术指标信号追踪详解
一、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,日常使用无需担心。
- MathMod(value, value2) 返回除法余数,如5对2余1
- MathRand() 返回0~32767伪随机整数,默认种子为1,重复运行序列相同
- MathSrand(seed) 设定随机种子,常用TimeLocal()保证每次序列不同
- 用 % 运算符可把随机范围映射到任意区间,如MathRand()%6得0~5
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("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打开工具箱帮助可查每个函数原型与参数说明,强烈建议新手随时翻阅。
- symbol: 0或NULL表示当前图表品种,字符串如"EURUSD"指定其他
- timeframe: 0当前周期,PERIOD_H1等切换周期
- shift: 0最后柱,1倒数第二,类推
- applied_price: PRICE_CLOSE开盘最高最低典型加权中位等
- ma_method: 四种均值算法决定平滑方式
五、常用技术指标函数示例
以下列举部分典型指标调用。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);
}
七、变量声明与多返回值函数
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编写。
- 三角函数参数必须弧度化
- 随机种子用TimeLocal()保证差异
- 复杂指标必填mode否则取错线
- 浮点除法用1000.0非1000
- 调试优先Print和Comment而非Alert