MQL5语言帮助文件人话版(二十四)第二章(下) 语句和表达式

| 发表于 6 小时前 | 显示全部楼层 |复制链接
最后由 麻爪 于 2026-10-8 13:15 编辑

九、数组索引运算
注明:原手册中叫“指数”运算,纯粹是翻译错误,这块与数学上的“指数”没任何关系。

数组索引运算符 `[]` 用于定位数组中的元素位置,括号前面写数组名,括号内写入值为整数的表达式(例如变量 `i`),运算结果就是数组对应位置的元素值。其语法格式为:数组名[索引值] 。

MQL 4中几乎所有数组(包括系统内置的 K 线价格数组)都遵循从 0 开始编号的规则,第一个元素索引 `0`, 第二个元素索引 `1`, 第 n 个元素 → 索引 `n-1`。比如`Close[0]`通常代表当前K线的实时价,而不是最近一个完成的K线的收盘价。因为MQL4语言中,默认把当前K线的索引定义为0,上一个是1,上上个是2,离当前K线越远,索引数字越大。 需要注意的是,在MQL5语言中,各数组下标顺修被反过来了,0号是最老的,最大号是最新的。

索引可以是任意整数表达式,括号里不是只能写数字,还可以写变量、公式、函数返回值,只要最终结果是整数就行。而最常见的就是用循环变量 `i` 依次遍历数组。所谓循环变量就是在循环结构里,用来「计数、控制循环次数」的变量,最常见的命名是 `i`、`j`、`k`。它每跑完一轮循环就自动变化一次,既能标记当前跑到第几轮,也能拿来当数组的索引用。后面学到for循环的时候再细聊。

数组索引运算符 `[]` 基本上是只用于数组,包括一维数组、多维数组(后面跟多个`[]` ,最多到四维)。不管是系统自带的,还是用户自己编的,数组只有 N 个元素的话,索引最大只能到 `N-1`,写 `array[N]` 会触发 “数组越界” 运行错误,EA 会直接崩溃。结构体和类的成员用点·符号来访问,与此不同。

像`Close`、`High`、`Low`、`Open` 这类,就是 K 线价格数组,是MQL5 系统原生内置的时间序列数组,按照最新的为0,最早的为N的顺序排列。不需要你手动声明、赋值或维护,只要把 EA / 指标加载到 K 线图表上,系统就会自动绑定当前图表的品种和周期,实时更新数组里的数据。Open[0]就是当前K线开盘价,Low[3]就是当前K线往前数第四个K线的最低价,诸如此类。这种用法只针对当前图表,如果你要指定品种,指定周期,那就需要用到系统提供的 i 系列价格函数,到时候再讲。

十、点操作符 ( . )
点操作符(.)也叫成员访问运算符,是 MQL5 里访问结构体、类对象内部成员的核心运算符。和数组用 [] 按「位置序号」取元素不同,点操作符是按「成员名称」来访问对象内部的属性和功能,是写 EA 时操作行情结构体、交易结构体、调用系统类的必备语法。

标准格式:对象名.成员名

对象名指一个具体的实例(结构体变量、类的对象)的名字,不能直接写类型名;成员名指该对象所属类型预先定义好的成员变量名或成员函数名。

比如我们之前聊过的交易请求结构体,各成员赋值的过程,就是用点操作符完成的。
  1. MqlTradeRequest request = {0};  // 定义并初始化交易请求结构体
  2. // 用点操作符给每个成员赋值
  3. request.action = TRADE_ACTION_DEAL;  // 交易动作:即时成交
  4. request.symbol = _Symbol;            // 交易品种
  5. request.volume = 0.1;                // 交易手数
  6. request.type = ORDER_TYPE_BUY;       // 订单类型:买单
  7. request.price = tick.ask;            // 成交价格
  8. request.sl = 0;                      // 止损价
  9. request.tp = 0;                      // 止盈价
复制代码

十一、范围解析操作符(::)
范围解析操作符,也叫作用域解析符,核心作用是明确指定成员所属的作用域,从指定的枚举、类、命名空间中访问对应的常量、静态成员。就像点操作符用于结构体/类,范围解析操作符绝大多数情况下作用于枚举。

标准格式:枚举类型名::枚举值名

十二、函数调用与参数传递基本规则
函数是 MQL5 代码的核心组织单元,不管是调用系统内置的行情、交易函数,还是写自定义的指标、策略逻辑,都离不开“函数调用”和“参数传递"。

函数定义时,括号里声明的变量叫”形参“。它相当于占位符,规定了这个函数需要接收几个数据、 每个数据分别是什么类型、 每个数据的用途是什么。比如double CalcMA(int period, int shift),括号里就有两个形参,都是int类型的。函数前面的double 指的是函数返回值的类型,而不是它参数的类型。

函数调用时,实际传入括号里的具体值 / 变量叫”实参“。它是函数真正要处理的具体数据。比如double ma20 = CalcMA(20, 1); ,括号里的20和1就是具体数值,是实参。

对于有参数的函数,调用它时,必然存在着给它的形参赋值的过程,必须要遵循以下规则:

原则 1数量匹配:函数定义了几个形参,调用时原则上就要传几个实参。 实参多传、少传,都会直接编译报错。不论系统内置函数还是自定义函数,都完全遵循这个规则。但有些特殊函数,允许你只传部分甚至一个实参,但本质上是它给其他形参设定了默认值,你不写,就按默认值处理。

原则 2顺序匹配:实参按从左到右的顺序,依次传给从左到右的形参,顺序不能颠倒。顺序错了,代码有时候仍任能运行,但结果完全不对。比如交易函数(如 `OrderSend`)的参数顺序非常重要,止损、止盈、手数的位置写反,会直接导致开仓价格错误、风险失控。

原则 3类型匹配:实参的数据类型,必须和对应形参的类型兼容。最好是完全匹配,形参要 `double`,就传小数;形参要 `int`,就传整数。一般不推荐自动转换,比如 `int` 可以自动转 `double`(整数转小数不会丢精度);但 `double` 转 `int` 会丢弃小数部分,编译会警告,容易出精度 bug。如果类型不兼容,比如给需要数字的参数传字符串,直接编译报错。

每个实参位置,不只能写固定的数字,只要最终结果是符合类型要求的值,都可以写。比如常量,固定的数值、字符串常量,是最简单的实参;变量,已经定义好的变量,直接传进去;运算表达式,加减乘除、位运算、逻辑运算等任何表达式,只要结果类型匹配就可以;另一个函数的返回值吗,有返回值的函数,它的调用结果本身就是一个值,可以直接当另一个函数的实参。

对于所有基础数据类型(`int`、`double`、`bool`、`char`、`datetime`、`color`等),函数收到的是原变量的「复制副本」,函数里修改参数,改的只是副本,外面的原变量完全不受影响。这叫”值传递“。

而数组、字符串、结构体、类对象,在MQL5 中这些类型默认就是引用传递。函数收到的是原变量本身的引用,函数里修改参数,会直接改掉外面的原变量。如果只是读取数组 / 对象,不需要修改,需要加 `const` 修饰。

十三、顺序求值运算符/逗号操作符”, “
我们平时调用函数写的 `pow(2, 3)`、`Print("价格", Close[0])`,这里的逗号本质是”参数分隔符“,用来隔开多个实参,只是告诉系统,这是两个不同的参数,而这两个参数之间,并没有因为这个逗号有什么运算关系。原手册上说”参量列表可以作为范例“,就是指函数的参数列表中有多个参数时,会用这个逗号来分割。

逗号操作符(,)最常用于将多个表达式从左到右串联起来。在”同一个表达式内部“,把多个子表达式串成一个整体,比如 for 循环里的多变量控制。我们前章聊过表达式,一个表达式本身就可以由其他表达式组成,所以就会有”子表达式“的概念。

我们来看原手册上给的这个例子:

for(i=0,j=99; i<100; i++,j--)    Print(数组[j]);
这是一个for循环。for循环是一种流程控制语句(Statement),用来控制代码重复执行的次数,是固定的「三段式」结构,用分号隔开,比如:

for(初始化部分; 循环条件; 增量更新部分) { // 循环体:每一轮要重复执行的代码 }

本来这个”初始化部分“和”增量更新部分“只能放一个参数,但因为我们要操作多维数组,需要放多个参数,就需要用逗号把多个参数分隔开来,其实与函数参数中逗号的作用也差不多。

逗号分隔开的数据是有顺序的,从左往右依次使用,并不能随意调换,所以是“顺序求值”。

十四、计算字节运算符(sizeof)
sizeof 是 MQL5 的内置运算符,作用是计算某个数据类型或某个变量在内存中占用的字节总数,返回一个整数结果。简单说就是帮你知道「这个数据在内存里占多大的存储空间」。

格式为:sizeof(类型名) 或 sizeof(变量名)

对日常 EA 开发来说,用 sizeof 计算固定数组的元素个数是最核心的用法,其他场景接触较少。用「数组总大小 ÷ 单个元素的大小」就能得到数组的元素总数,是 sizeof 最常用的技巧。后续修改数组长度时,循环条件不用跟着改,自动适配,避免硬编码出错。
最近访问 头像模式
举报

评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

麻爪

麻爪 D

如果你想让一个人下地狱,介绍他做交易。
如果你想让一个人在地狱里永不超生,介绍他做EA交易。

Fast跟单EA