MQL4语言帮助文件(三)
MQL4语言帮助文件(三)
4、Operators:
语言操作符必须对执行完成任务的一些运算法操作进行描述。程序本身是这样的序列语句 。语句逐个随后以分号分离。
一个语句能占领一条或几条线。二个或更多语句可能位于同样线。单独执行命令的语句(if, if-else, switch, while and for) 可以相互插入
示例:
if(Month() == 12)
if(Day() == 31) Print("新年快乐!");
Compound operator ,Expression operator ,Break operator ,Continue operator ,Return operator ,Conditional operator if-else,Switch operator,Cycle operator while,Cycle operator for 。
(1)Compound operator:一个复合操作符有一个(一个区段)和由一个或多个任何类型的操作符组成的的附件{}. 每个表达式使用分号作为结束(;)。
示例:
if(x==0)
{
Print("无效位置 x=",x);
return;
}
(2)Expression operator :任何以分号(;)结束的表达式都被视为是一个操作符。这里是一些表达式操作符得范例:
称号运算符:
Identifier=expression;
x=3;
y=x=3; // 错误
称号运算符在表达式操作符中只限一次使用。
函数调用运算符:
Function_name(argument1,..., argumentN);
FileClose(file);
空运算符
它是由分号(;)组成并且使用在一个检测运算符中。
(3)Break operator:一个嵌入 操作符终止最近外部操作符 switch, while或 for 的执行。在终止操作符之后给出检测操作符。这个操作符的目的之一:当中心值指定为变量时,操作符完成循环执行。
示例:
// 搜索第一个零元素
for(i=0;i<array_size;i++)
if((array==0)
break;
(4)Continue operator :一个 继续操作符。 我们将其放在嵌套内的指定位置,用来在指定情况下跳过接下来的运算,直接跳入下一次的循环 while 或for操作符。操作符 嵌入 位置与此操作符相反。
示例:
// 总结数组非零元素
int func(int array[])
{
int array_size=ArraySize(array);
int sum=0;
for(int i=0;i<array_size; i++)
{
if(a==0) continue;
sum+=a;
}
return(sum);
}
(5)Return operator:一个return将需要返回的结果放在return后面的()中。
示例:
int CalcSum(int x, int y)
{
return(x+y);
}
在函数中省缺值类型被返回,此 return操作符必须使用:
void SomeFunction()
{
Print("Hello!");
return; // 这个操作符被删除
}
函数正确的震动表示return操作符执行。
(6)Conditional operator if-else :如果表达式为true,操作符执行并按照操作符2 给出的检测。如果表达式为false,操作符2 执行。
if (expression)
operator1
else
operator2
if操作符 else部分可能被忽略。 if操作符忽略 else部分,显示分歧可能会嵌入。这种情况下, else 位置在先前if操作符的最近部位,这样不会出现else部分。
示例:
// else 部分提及到第二个if操作符:
if(x>1)
if(y==2) z=5;
else z=6;
// else 部分提及到第一个if操作符:
if(x>l)
{
if(y==2) z=5;
}
else z=6;
// 嵌入操作符
if(x=='a')
{
y=1;
}
else if(x=='b')
{
y=2;
z=3;
}
else if(x=='c')
{
y = 4;
}
else Print("ERROR");
(7)Switch operator :在case全部变量和相应表达式值检测的操作符之内比较常数表达式值。每一个case变量会在整数或常数表达式内标注。常数表达式不包含函数变量调用。switch表达式操作符必须是整数类型。
switch(expression)
{
case constant: operators
case constant: operators
...
default: operators
}
如果在case操作符等于表达式值,操作符 default标签连接将会执行。此default 变量无需在最后。如果相应表达式值和 default变量没有获取,不会有任何执行。关键词case和常数被标注,并且if 操作符执行 case变量,程序将执行以下所有操作符直至break操作符生成。
一个常数表达式的计算是在编译期间。在一个switch操作符内部存在两个相同值的常数。
示例:
switch(x)
{
case 'A':
Print("CASE A");
break;
case 'B':
case 'C':
Print("CASE B or C");
break;
default:
Print("NOT A, B or C");
break;
}
(8)Cycle operator while :如果表达式为true, 操作符执行直至表达式变成false。如果表达式为false,将检测最近操作符。
while(expression) operator;
在操作符执行前,一个表达式值已经被指定。不过,如果开始表达式为 false,操作符根本不会执行。
示例:
while(k<n)
{
y=y*x;
k++;
}
(9)Cycle operator for: 用表达式1Expression来定义初始变量,当表达式2Expression2 为真的时候执行操作运算符,在每次循环结束后执行表达式3 Expression3。如果true, 运算符 for 将被执行。循环重复直至Expression2变为false。如果false,循环将会被中断并且检测运算符文本。稍候执行。
for (Expression1; Expression2; Expression3) operator;
此 for 运算符下列运算符成功:
Expression1;
while(Expression2)
{
operator;
Expression3;
};
使用for(;)可以造成一个死循环如同while(1)一样. 表达式1和表达式3都可以内嵌多个用逗号(,)分割的表达式。 <
示例:
for(x=1;x<=7;x++) Print(MathPower(x,2));
for(;;)
{
Print(MathPower(x,2));
x++;
if(x>10) break;
}
for(i=0,j=n-l;i<n;i++,j--) a=a[j];
5、Functions :
函数是部分程序的一个名称,它可以在需要时从任何一个部分调用。 它是由定义分类返回值,名称,形式参量和合成运算符组成并执行的。通过的总数被限定在64个字符之内。
示例:
double // 被返回值的类型
linfunc (double x, double a, double b) // 函数名称和参量列表
{
// 合成运算符
return (a + b); // 返回值
}
"返回"运算符可以返回在这个运算符内表达式的值。如果需要,此表达式值可以转换为函数结果类型。函数没有返回的值必定是“省缺” 类型。
示例:
void errmesg(string s)
{
Print("错误: "+s);
}
通过函数的参量可能存在由特定类型常数指定的默认值。
示例:
int somefunc(double a, double d=0.0001, int n=5, bool b=true, string s="passed string")
{
Print("需求参量 a=",a);
Print("下列参量被传送: d=",d," n=",n," b=",b," s=",s);
return (0);
}
如果此默认值指定一个参量,那么所有的参量也必须存在默认值。
错误范例:
int somefunc(double a, double d=0.0001, int n, bool b, string s="passed string")
{
}
Function call ,Special functions
(1)Function call :I如果显示的文件没有描述, 它将考虑上下文的联系作为函数名称。
函数名称 (x1, x2,..., xn)
自变数(形式参量) 以值的形式通过。 计算每一个表达式 xl, . . . , xn 并将其值发送到函数。 表达式计算命令值是被保证的。在执行系统测试数字和自变数类型期间会给出函数。 这种形式的函数调用被称作调用值。调用函数是一个通过函数返回的表达式的值。 描述函数类型必须相应类型返回的值。全球范围内程序的任何一个部分函数是被公布或描述的,即其他函数之外。在另外函数里,函数不能被公布或描述。
例如:
int start()
{
double some_array[4]={0.3, 1.4, 2.5, 3.6};
double a=linfunc(some_array, 10.5, 8);
//...
}
double linfunc(double x[], double a, double b)
{
return (a*x[0] + b);
}
函数的调用是默认参量,通过参量的列表是被限定的,但不是之前的第一默认参量。
例如:
void somefunc(double init,double sec=0.0001,int level=10); // function prototype
somefunc(); // 错误调用, 第一请求参量必须存在。
somefunc(3.14); // 正确调用
somefunc(3.14, 0.0002); // 正确调用
somefunc(3.14, 0.0002, 10); // 正确调用
当我们调用一个函数时,不可以忽略参量,存在默认值:
somefunc(3.14, , 10); // 错误调用。第二参量被忽略。
(2)Special functions :在MQL4中存在三种预定义名称函数:
init() 在载入时调用,可以用此函数在开始自定义指标或者自动交易之前做初始化操作。
start() 是基本函数。对于智能交易,在下一个替克进入之后被调用。对于客户指标,在指标添加到图表之后,客户端开始(如果指标添加到图表)并且下一个替克进入之后,函数被调用。对于脚本,在脚本被添加到图表之后立即执行并初始化。如果在模板中不存在start()函数,模板 (智能交易,脚本或客户指标) 不能开启。
deinit() 当数据变动时触发,对于自定义指标或者自动交易的编程主要依靠此函数进行
预定义函数需要一些参量。不过,当这些参量被客户端调用时,外部没有参量提供。 start(), init()和 deinit()函数从模板的任何一点按照常规调用,等于其他函数。
不建议从init()函数调用 start()函数或是执行交易业务,作为图表数据,市场开价格。模板的初始化会出现残缺。这时,init() 和 deinit() 函数必须尽可能结束运行。在调用start()函数之前,尝试重新全面开启运行。
(谢谢你的回帖!)
[ 本帖最后由 jsyffs 于 2008-5-29 10:17 编辑 ]