1 控制语句 和 函数

控制语句
语句描述了完成一项任务的算法操作规则。程序本身就是由这样的语句序列组成。各条语句之间以分号(;)分隔开。
一条语句能占一行或多行。二个或更多语句也能书写于同一行上。控制执行顺序的语句(if, if-else, switch, while和for)可以相互嵌套。

示例:
if(Month()==12)
if(Day()==31)]
Print("新年快乐!");

语句块
一个复合语句(一个语句块)可以由一条语句组成,也可以由大括弧{}括起来的一条或多条任意类型的语句组成。大括弧{}后而不必跟着分号(;)。

示例:
if(x==0){
Print("无效位置 x=",x);
return;

表达式操作符
任何以分号(;)结束的表达式都被视为是一个操作符。这里罗列了一些表达式操作符的范例:

赋值运算符:
标识符= 表达式;

赋值运算符在表达式操作符中只限一次使用。
示例:
x=3;
y=x=3; // 这是错误的

调用子函数操作符:
被调函数子(形参1,形参2,…,形参N);

示例:
FileClose(文件名)

空操作符
只有一个分号组成(;).我们用它来表示没有任何表达式的空操作符.

break 语句
该语句可以终止最邻近的switch, while或for语句的执行。 Break语句放在嵌套内的指定位置,由上方最近的终止条件语句控制。
目的是 当满足达到一定条件时 完成循环的执行而跳出。

示例:
//--从0开始搜索数组
for(i=0; i<ARRAY_SIZE; i++)
if((array[i]==0)
break;

continue 语句
该语句放在嵌套内的指定位置,continue语句控制最邻近的循环语句while或for返回循环开始,当指定条件下跳过接下来的运算,直接跳入下一次的循环。

(continue 语句与break 语句作用相反。)
示例:

//--统计数组中非零元素个数
int func(int array[]){
int array_size= ArraySize(array);
int sum= 0;
for(int i=0; i<array_size; i++){
if(a[i]==0)
continue;
sum += a[i];
}
return(sum);
}

return 语句
return;
结束当前函数的执行,返回到调用程序。
return(表达式或计算结果值):
执行完当前函数的并带回函数的结果值。其中的表达式必须放在圆括号内,不能使用赋值号。

示例:
int 求和子(int x, int y){
return(x+y);
}

在函数值的类型定义为void类型时,return 语句后面不能使用表达式:
void SomeFunction() {
Print("Hello!");
return; // 该句无存在的必要
}

if-else 语句
如果条件表达式为true,语句序列operator1执行,语句序列operator2将不执行; 如果表达式为false,语句序列operator2执行,而语句序列operator1不执行。
else后还可以跟进多个if执行多项选择。

格式:
if(条件)
结果1;
else
结果2;

语句中的else部分可能被省略。如果本语句省略了else部分,if语句在嵌套时可能会出现歧义。在这种情况下,该else会匹配前而最近的不带else部分的if语句。

示例:
//--以下的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语句嵌套
if(x=='a'){
y= 1;
}
else
if(x=='b'){
y= 2;
z= 3;
}
else
if(x=='c'){
y = 4;
}
else
Print("出错!");

switch 语句
该语句比较 expression表达式值 和 case中的constant常量值,如果相等,就执行相应的语句块。每个case中constant值必须是一个整数、字符串常量或常量表达式。常量表达式中不能包含变量和函数调用。Switch后而的表达式(expression)必须是整型。
格式:
switch(expression){
case constant: operators
case constant: operators
...
default: operators
}
如果没有一个case表达式值等于expression表达式值,将执行default后面的语句块。此处default语句并不是必需的。
如果没有一个case常量和expression值一致,而default语句也不没有,那么不会执行任何动作。
关键字case及其常量就像标签,即使switch语句带有数个case语句,程序都会按序执行后而所有的语句块,直至遇到break语句为止。
在编译期间,编译程序将计算常量表达式的值,不允许在一个switch语句内同时存在两个相同的常量值。
示例:
switch(x){
case 'A':
Print("CASE A \n");
break;
case 'B':
case 'C':
Print("CASE B or C\n");
break;
default:
Print("NOT A, B or C\n");
}

while 循环语句
如果条件表达式expression值为true,while语句一直执行直至条件表达式变成false。如果条件表达式为false,将跳到下一条语句。
格式:
while(expression)
operator;

while语句执行前,表达式expression必须事先定义过。因此,如果表达式值一开始就为false,while语句根本不会执行。
示例:
while(k<N)
{
y= y*x;
k++;
}

for 循环语句
表达式1 (Expression1)定义循环的初始变量,表达式2(Expression2)是循环终止条件。当表达式2 (Expression2)为真(true)的时候,循环体重复执行直至Expression2变为假(false)。如果Expression2变为false,循环将会被中断,并继续执行循环语句的下一条语句。每次循环结束后都会计算表达式3(Expression3),用于改变循环条件。
格式:
for (Expression1; Expression2; Expression3)
operator;

for 语句与下面while语句等价:
Expression1;
while(Expression2){
operator;
Expression3;
}

for 语句中我们可以省略三个表达式中任一部分或全部,但是其中分号(;)却不能省略。如果省略了表达式2(expression2),则被视作真值。
示例:
for(x=1; x<=7; x++)
Print( MathPower(x,2) );

for(; ;)语句是一个死循环,它相当于while(true)语句。
示例:
for(;;){
Print(MathPower(x, 2));
x++;
if(x>10)
break;
}

表达式1和表达式3都可以内嵌多个逗号(,)分隔的表达式。
示例:
for(i=0, j=n-l; i<N; I++, J--)
a[i]= a[j];

函数
函数定义
函数是一段已命名的程序,它可以从程序任一部分多次调用。它是由函数返回值的类型说明、函数名称、形式参数和语句块组成。
传递参数的个数被限定在64个之内。
函数名称 (x1, x2,..., xn) // xn<64
示例:
double // 返回值类型
linfunc (double x, double a, double b) { // 函数名和形参
..... // 内嵌的语句块
return (a*x + b); // 返回值
}

return语句可以返回函数内表达式的值。
如果没有返回值那么返回值的,函数类型可以写为void,表示是一个过程。
示例:
void 打印错误子(string 内容){
Print("错误: "+ 内容 );
}

函数的参数可能存在默认值,这些默认值是用相应类型常量定义的。
示例:
int 测试函函数值子(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);
}

函数调用
函数的形参按值的方式传递。即 先算出每个表达式xl,…,xn的值,再将其值传递给函数。表达式计算顺序及其值的传递要确保无误。在函数执行时,系统将检查那些提供给函数的值和参数的类型。这种形式的函数调用被称为“值传递”。
调用函数是为了获得函数返回的表达式值。函数的定义类型必须符合函数返回值的类型。
在全局层次,我们可以在程序的任何位置定义和说明函数,即 要在其他函数之外定义,在函数之内,不能定义或说明另一个函数。
例如:
函数名(形参A,形参B,...) function_name (x1,x2,...,xn)
示例:
double 数组[4]= {0.3, 1.4, 2.5, 3.6};
//----------被调用的子函数------------+
double 如果真子(double 形参a, double 形参b, double 形参c){
if(形参a>形参b){
return(形参a);
}
else
return(形参c);
}
//--------------主函数----------------+
int start()
{
double AA= 计算函数子(数组, 10.5, 8);
double 某B= 如果真子(9.7, 10.5, 10);
//...
}
//----------被调用的子函数------------+
double 计算函数子(double 形参数组名x, double 形参a, double 形参b)
{
return (形参a*形参数组名x[0] + 形参b);
}

使用默认参数调用函数时,参数列表使用规则是有要求的。参数列表中无默认值的参数必须指定值,且不可以省略。有默认值的参数要么全省略掉,要么指定值,不可只省略其中部分参数。
当调用一个函数时,如果有多个默认值的形参 如果后部的形参要重新赋值则不可以忽略不写前面的形参值。
例如:
//--函数原型
//--函数原型
void somefunc(double nit, double sec=0.0001, int level=10){
.....
}
//--调用情况
somefunc(); // 错误调用: 因第一请求参量未赋值!
somefunc(3.14); // 正确调用
somefunc(3.14, 0.0002); // 正确调用
somefunc(3.14, 0.0002, 10); // 正确调用
somefunc(3.14, , 10); // 错误调用。因第二参量被忽略。

特殊函数 init()、deinit()和start()
在MQL4中存在三种预定义名称函数:

init() 是一个在模块初始化时调用的函数,可以用此函数在开始自定义指标或者自动交易之前做初始化操作。如果这个函数不可用,初始化时就不会调用任何函数。
因初始化只在程序开始前只运行一次, 所有些只运算一次的变量在此间确定.

datetime 最后开仓时= 0;
int 再开时隔数;
//---------------初始化----------------+
int init()
{
//--1 在初始化中确定再开时隔数的间隔值
再开时隔数= 再开时隔数(Time[0]-Time[1]);
//--五位平台改四位
小数位= Digits;
if(小数位==3 || 小数位==5){
点= 10.0
Point;
改四系数= 10;
}
else{
点= Point;
改四系数= 1;
}
return(0);
}

start() 是主函数。对于智能交易,它在收到下一跳数据后调用该函数;
对于自定义指标,在指标添加到图表之后,或在客户端开始运行之时,也可在收到下一跳数据之后,该函数被调用;
对于脚本,在脚本被添加到图表之后立即执行并初始化。

主函数在当数据变动时触发,对于自定义指标或者自动交易的编程主要围绕此函数进行。如果模块中不存在start()函数,模块(智能交易、脚本或自定义指标)就不能执行。

deinit() 卸载时调用,是一个模块的析构函数(注:借用C++概念),执行一与init()函数相反的操作。deinit()函数往往用来做“清理善后”的工作,例如,创建对象时开辟了一片内存空问,退出模块前需要释放。如果用户没有编写该函数,它也不会执行任何操作。

预定义函数可以带参数。不过,当客户端调用这些函数时,并不能从外部向它传递参数,只能采用默认值。
start(), init()和deinit()函数可从模块任何一点按照常规函数规则调用,等同于其他函数。
不推荐从init()函数调用start ()函数或是执行交易操作。对于图表数据、市价等,在模块初始化期间,数据可能残缺不全,这时,init()和deinit()函数须尽快地完成任务。 在调用start()函数之前,千万不要开始尝试交易操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容

  • 世界上总有些人在他们重要的日子里显得格外的孤独。第一次上台演讲,身边却没有父母的鼓励;第一次学着做饭,却得不到母...
    王小村阅读 382评论 5 6
  • 日子一天的长过一天,我知道,高考,又要来了。 人总是这样子,往往在触及自身利益的时候,更懂得保护自己。 感同身受才...
    yiy伊阅读 258评论 1 1
  • 观棋一语阅读 132评论 0 0