MQL4基础:变量
- 局部变量
- 形式参数
- 静态变量
- 全局变量
- 定义外部变量
- 变量初始化
- 外部函数定义
变量必须在使用之前定义(声明)。变量必须拥有唯一的标识名。变量的声明包括要定义的变量名及其类型。变量的声明不是语句。
基本类型如下:
- bool -布尔值 true 和 false;
- string – 字符串;
- double – 带有浮点双精度数字;
- int – 整数;
变量声明示例:
string MessageBox;int Orders;double SymbolPrice;bool bLog;
其他类型:
- color – 代表 RGB 颜色的整数;
- datetime – 日期和时间,起始时间从1979年1月上午0:00开始以来的总秒数。
其它的数据类型仅仅在输入参数说明时才有意义,可以更方便地在属性窗口查看。
示例:
datetime tBegin_Data = D'2004.01.01 00:00';color cModify_Color = C'0x44,0xB9,0xE6';
数组
数组是有下标的同类型的一组数据。
int a[50]; // 50个元素的一维整数数组double m[7][50]; // 7个一维数组成二维数组 每一维数组由50个整数组成。
只有整数才能作为数组的下标。不允许使用四维以上的数组。数组元素的下标从0开始。一维数组的最后一个元素下标是(数组大小-1)。这就意味着,在由50个元素组成的数组中,引用数组的最后一个元素是a [49]。同样的规则也适用于多维数组:任一维数组下标都是从0开始,到(数组大小-1)结束。从上例可以看出,这个二维数组的最后一个元素是m [6] [49]这样的下标。
如果访问超出数组下标范围, 执行时系统将产生下标越界错误 ERR_ARRAY_INDEX_OUT_OF_RANGE,这些信息可以通过GetLastError()函数得到。
局部变量
在一个函数内部定义的变量是局部变量。局部变量的作用范围被限定在所定义的函数内。局部变量可以用任意一个表达式值进行初始化。每次调用函数都会初始化一次局部变量。局部变量存储在函数申请的临时空间中。
示例:
int somefunc() { int ret_code=0; .... return(ret_code); }
形式参数
传递给函数的参数都是局部变量。作用范围限制在函数内。形式参数名称应与外部定义的变量名和函数内部定义的局部变量名不同。调用函数时形参变量必须赋值,当然,在函数内,这些形参变量也可以被赋值。
示例:
void func(int x[], double y, bool z) { if(y>0.0 && !z) Print(x[0]); ... }
形参变量可用常数进行初始化。在这种情况下,初始化值被当作默认值。另外,紧随其后的形参变量也必须初始化。
示例:
void func(int x, double y = 0.0, bool z = true) { ... }
当调用函数时,初始化过的参数可能被省略不写,默认值会代替它们。
示例:
func(123, 0.5); //参数z被省略,函数内使用z的默认值
从外部模块导入的MQL4库函数无法初始化参数的默认值。
参数采用值传递方式。也就是说,在任何情况下,在被调用函数内部,如果修改了参数值,这种修改结果将不会带回主调用函数内。数组可以作为函数的参数,但是,如果以数组作为参数,修改数组元素值是不允许的。
它还可能通过引用进行参数传递(称之为引用传递或地址传递)。在这种情况下,通过引用传递,这些参数的修改将被传递给调用函数中对应的变量。数组元素无法通过引用传递给参数。通过引用传递参数只能在一个模块内进行,库并不提供引用传递。为了表明参数是通过引用传递,在定义时必须在数据类型后放置&符号。
示例:
void func(int& x, double& y, double& z[]) { double calculated_tp; ... for(int i=0; i<OrdersTotal(); i++) { if(i==ArraySize(z)) break; if(OrderSelect(i)==false) break; z[i]=OrderOpenPrice(); } x=i; y=calculated_tp; }
数组也可以使用引用传递,同理,所有修改将反映在源数组中。不同于简单的参数,数组也可以通过引用传递给库函数。
采用引用传递方式的参数无法初始化默认值。
传递给函数的最大参数个数不得超过64个。
静态变量
“static(静态)”存储类型用于定义一个静态变量。在数据类型前指定”static”说明符说明定义的是一个静态变量。
示例:
int somefunc() { static int flag=10; .... return(flag); }
静态变量被存放在内存静态存储区里,在函数运行结束后静态变量的值不会丢失。同一模块内所有变量,除函数的形参变量外,都能定义成静态变量。静态变量只能由相应类型的常量初始化,这点与一般的局部变量有所不同,局部变量可由任意类型的表达式进行初始化。如果静态变量没有明确地初始化,它将被初始化为零。静态变量只可在”init()”函数之前初始化一次。当从定义了静态变量的函数内部退出时,静态变量值不会丢失。
全局变量
全局变量只能定义在函数之外,与函数同级,也就是说,在任何模块中全局变量都不是局部的。
示例:
int GlobalFlag=10; // 全局变量int start() { ... }
全局变量的作用域是整个程序。全局变量可从任意函数内访问。如果它的值没有被明确定义,初始化值就为零。一个全局变量只能由相应类型的常量进行初始化。全局变量只可以在程序装入到客户机内存时初始化一次。
注:全局定义的变量不能与那些能被GlobalVariable…()函数访问的客户端全局变量混淆。
定义外部变量
外部存储类型extern可以定义一个外部变量。在数据类型之前冠以”extern”说明符指明其为外部变量。
示例:
extern double InputParameter1 = 1.0;extern color InputParameter2 = red;int init() { ... }
外部变量决定程序的数据输入,他们会直接显示在程序属性窗口。数组本身不能作为外部变量。
变量初始化
定义变量时可以初始化值。如果变量的初始值未被明确指定,它就被初始化为零(o)。全局变量和静态变量仅能被相应类型的常量初始化,而局部变量可以被任意类型的表达式初始化,并不局限于常量。
全局变量和静态变量只能初始化一次。局部变量在被相应的函数调用时每次都会初始化。
示例:
int n = 1;double p = MarketInfo(Symbol(),MODE_POINT);string s = "hello";double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 };int a[4][4] = { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4 };
数组元素值列表必须被包含在大括号{}内,省略初始化的值被认为零。如果初始化定义时没有指定数组大小,编译器将根据初始化值列表的大小来定义。多维数组按照一维数组的顺序进行初始化,即初始化序列中不需要另加大括号。所有数组,包括那些在局部范围内定义的数组,只能用常数进行初始化。
外部函数定义
定义在程序其它部分内的外部函数类型必须明确地说明。缺乏这样定义也许导致在程序的编译、连接、运行时出错。说明一个外部对象时,必须使用关键字#import。
示例:
#import "user32.dll" int MessageBoxA(int hWnd ,string szText,string szCaption,int nType); int SendMessageA(int hWnd,int Msg,int wParam,int lParam);#import "lib.ex4" double round(double value);#import
import语句清楚地说明这些函数是从外部DLL库或编译过的EM4库中引用的。
变量的指针能传给导入的DLL函数。字符串型数据能作为指针传给相应的内存块(我们应该记住,字符串数据的内部表示分为两个部分:内存块长度和内存块的指针)。如果有必要传递整型或双精度型数据,那么这些类型的一维数组也能作为参数引用传递。
示例:
#import "some_lib.dll" void PassIntegerByref(int& OneInt[]);#importint start() { int array[1];//... PassIntegerByref(array); Print(array[0]);//... }
本文地址:https://www.waihuibang.com/fxschool/autotrading/mql4/49064.html