第三章:控制循环语句
第一节:陈述式分组语句
陈述式的英文叫做Expression或者叫做Instruction。一个陈述式可以理解为一个分号结束的语句。
1.1 begin...end分组语句
# 语法:
Conditions Begin
Instruction1;
Instruction2;
Instruction3;
End;
# 说明:
如果有多条语句,我们可以通过begin...end把它们建立一组,形成多行的陈述式组。每一个begin...后面一定有一个对应的end。整个陈述式组中的每个语句都要以分号结束。在构建完成陈述式之后的end也需要加上分号结尾。
特别注意的是:如果我们有多个陈述式组,陈述式组和陈述式组之间不需要用分号进行分割。
# 示例1:把打印语句用begin...end进行分组。
begin print("1"); print("2"); print("3"); end;
# 示例2:陈述式组和陈述式组之间的迭代。
在下面这个示例中我们可以看到,我们有第一个陈述式组(当然这里只有一条语句)Buy next bar market,第二个陈述式组sellshort Next bar market;因此我们迭代这两个陈述式组之间是不需要用end加分号的。
begin...end(陈述式组1) begin...end(陈述式组2);(结束),这点在编程时容易把人看懵,记住begin...end是陈述式组就比较容易区分的
If UpTrend Then Begin Buy Next Bar Market;
End
Else Begin SellShort Next Bar Market;
End;
第二节:条件判断语句1
正像其他编程软件一样,控制、循环语句是组织编程语句的两个及其重要的逻辑。控制语句在EL有两个,一个是If控制语句和Switch控制语句,可以理解为如果达到什么条件就会执行什么样的语句。
2.1 switch...case控制语句
# 语法:
Switch (E1 or String 1)
Begin
case E1 or String 2 :
Instruction1;
Default:
Instruction2;
End;
参数说明: E1,E2 —— 表达式,输出值为数值;String 1,String 2 —— 表达式,输出值为字符串;
Instruction1,Instruction2 —— 执行程序。
# 说明:
Switch...case和begin...end配合使用形成一个条件判断顺序结构。首先在Switch()中写入表达式或者字符串,由于存储需要判断的内容,一般来说用数字来表示比较合适,按照语法的定义,除了用表达式来填充,其他内容表示为字符串的形式。配合begin..end是起到对陈述式进行分组的作用。其实Switch...case用的并不是太多。另外default条件是上面的条件都不会执行时,会执行这条语句,这个是可选的。
特别注意:Switch...case必须要和begin...end配合使用,当然如果你只有一条判断那就不需要了。一般来说多条判断,是需要用begin...end对陈述式进行分组操作的。
# 示例1:按照编号进行打印(实际效果是不可能打印)
switch("123") begin case "1","2": print("12"); case "3": print("3"); end;
# 示例2:添加一个陈述式,当前图表的持仓手数小于等于3,并且大于等于1时,买入开仓;持仓手数为4,并且close上传10根K线close的均价时,全部平仓。
Switch(CurrentContracts) Begin Case 1,2,3:// 此处也可以用 Case 1 to 3: Buy(“B4”) Next Bar At Market; Case 4: If Close Cross Over Average(C[1],10) Then Sell Next Bar At Market; End;
第三节:条件判断语句2
If...then...else...条件语句是生产中运用最多的条件判断语句。如果需要判断多个条件,要结合begin...end陈述式分组语句一起使用。
3.1 If...then...else...条件语句:
# 语法:语法分为这么几种分别如下:
# 如果我们只有一个判断条件的话那么只需要使用 if E then instructon; # 如果我们有一个除此之外的判断语句的话需要采用下面的形式 If E Then Instruction1 Else Instruction2; # 如果上面的陈述式Instruction不只有2个,而是具有一个陈述式组的话,我们就需要采用begin...end的方式对它们进行分组操作。当然如果只有一个的陈述式的话也是可以。 If E Then Begin Instruction1; Instruction2; End Else Begin Instruction3; Instruction4; End; # 如果不采用除此之外的表达方式,我们只需要判断嵌套陈述式时,条件同上,去掉Else,用陈述式进行条件迭代即可 If E Then Begin Instruction1; Instruction2; End Begin Instruction3; Instruction4; End; # if判断语句也可是可以进行嵌套操作 If E1 Then Begin If E2 then Instruction1; End Else Begin Instruction2; End;
# 说明:
【嵌套】:所谓嵌套就是在语句中插入其他的判断语句形成多层的判断结构。
# 示例1:两种简单的条件判断形式
if Time=0900 then print("right"); if Time=0900 then print("right") else print("wrong");
# 示例2:嵌入多个陈述表达式:
if Time = 0900 then begin print("Lets go!"); print("Start"); end else begin print("wrong"); end;
# 示例3:嵌套条件表达式,下面蓝色表示的位置为在第一组条件表达式中嵌入了另外一套if判断体。注意嵌套尽量少嵌套,另外使用多条件判断是,最好采用行对其和缩进的形式。这样清晰明了,便于查找条件。
if Time = 0900 then begin if Date = 130401 then begin print("You are right"); print("The first if!"); end; end else begin print("wrong"); end;
第四节:循环语句1
在MC中一个非常重要的循环语句是For循环。做为for循环就是罗列需要循环判断的条件,直到所有判断条件都不满足,跳出整个循环。
在For循环中,我们要熟悉To和DownTo两个关键字的用法。从字面意思非常理解,是个是正向计数(0,1,2,3...)这样的循环判断,另一个是逆向递减计数(3,2,1,0...)这样的循环判断。循环判断也需要配合Begin...End来一起使用。
4.1 For循环:
# 语法:
# 形式1:递进方式: For Counter=IValue To FValue Begin Instruction1; Instruction2; End; # 形式2:递减方式: For Counter=IValue DownTo FValue Begin Instruction1; Instruction2; End; Counter——数值变量,用来存储循环计数值。 IValue——数值表达式,指定起始计数值。 FValue——数值表达式,指定最终计数值。 Instruction——陈述式
# 说明:
# 示例:
求前 10 根 Bar 的最高价之和并赋给变量 HighPriceSum: Variable: BarBackNo(0), HighPriceSum(0); For BarBackNo=0 To 9 Begin HighPriceSum=HighPriceSum+High[BarBackNo]; End; 求前 10 根 Bar 的最高价之和并赋给变量 HighPriceSum: Variable: BarBackNo(0), HighPriceSum(0); For BarBackNo=9 DownTo 0 Begin HighPriceSum=HighPriceSum+High[BarBackNo]; End;
第五节:循环语句2
while也是一种循环表达方式。与For的不同之处在于while循环语句中的布尔表达式是条件满足时会一直进行循环操作。
5.1 while循环语句:
# 语法:
While E Begin
Instruction1;
Instruction2;
Instruction3;
End;
E——布尔表达式
Instruction——陈述式
# 说明:
while一个非常重要的点就是,如果布尔表达式的条件一直为真的话,while的循环语句是不会停止的(也就是陷入死循环)。因此我们要使得while循环语句在某种条件下,使其布尔表达式为假,就会停止循环。因此我们通常加入一个计数器来累计循环的次数,当次数达到一定程度时,使布尔表达式为假这样就会停止循环。另外MC为了方式死循环。当while循环执行操作5秒仍为停止时,会出现一个执行时错误,并停止执行脚本。
# 示例:加入计数器来停止while循环。
// 求最近十根 K 棒的最高价之和并赋值给变量 HighPriceSum: Variable: BarBackNo (0), HighPriceSum(0); BarBackNo= 0; While BarBackNo<10 Begin HighPriceSum=HighPriceSum+High[BarBackNo]; BarBackNo=BarBackNo+1; End;
第六节:一次表达语句
通常来说,脚本中的代码是根据bar数据进行计算的,在实盘的状态下,一般会tick by tick(逐笔)的计算。如果我们要求脚本中的某一段或者某一句代码只执行一次,仅此而已。那么就会用到once一次表达语句。
6.1 once一次表达语句:
一次表达语句就是限制后面的陈述式,在整个程序运算中只执行一次。
# 语法:
Once Instruction1; 或 Once <(E)> Begin Instruction2; End; <>内的表达式是可选的。 E——逻辑表达式,True/False 类型。 Instruction——陈述式。
# 说明:
一般once语句,是当做初始化的语句计算语句来使用的。
# 示例:
在程序第一次执行时,把当根 Bar 的开盘价赋给变量 Value1: Once Value1=Open; 等同于:If CurrentBar=1 Then Value1=Open; 当第一次满足 close<open 时,把当时 Bar 的开盘价赋给变量 Value1: Once (Close<Open) Begin Value1=Open; End;
第七节:布尔运算符和逻辑运算符
布尔运算符是非真既假的语句,既False和True,在前面的E布尔表达式中使用就是这个原理,其布尔表达式返回值要么是False,要么是True,对应的数字是0和1。
逻辑运算符分And、Or、Not,分别表示逻辑与、逻辑或和逻辑非。
所谓逻辑与:就是And连接的条件,全部为True时,整个条件为真,否则为假。
所谓逻辑或:就是Or连接的条件,如果有一个条件为True,整个条件为真,否则为假。
所谓逻辑非:就是把条件为True的变为条件为假,条件为假的变为条件为真。
6.1 False 和 True:
# 示例:
下面的逻辑判断式返回值为 False: False And True 下面的逻辑判断式返回值为 False: 2=1 声明一个初始值为 false 的逻辑变量 LogicalVar: Variable:LogicalVar(False); 声明一个默认值为 false 的逻辑 input 型变量 Overnight: Input:Overnight(False);
# 示例2:
下面的逻辑表达式的返回值为 True: True Or False 下面的逻辑表达式的返回值为 True: 2=2 声明一个初始值为 true 的变量 LogicalVar: Variable:LogicalVar(True); 声明一个初始值为 true 的 input 型变量 Overnight: Input:Overnight(True);
6.2 逻辑判断:
# 示例:
2=1 And 2=2 返回值为 False True And True And True 返回值为 True 下面的逻辑运算返回值为 False: 2=1 Or 2>2 下面的逻辑运算返回值为 True: True Or False Or False 将 Condition1 取反后赋值给 Condition2: Condition1 = True; Condition2 = Not Condition1;
第八节:跳跃语句
在MC的语句中有连个跳跃语句分别是Break和Continue,这两个语句是需要配合其他语句来使用的,其中Break是退出循环,跳出整个循环语句,Continue表示为结束当前循环,再跳到循环开头继续执行,一般都配合if条件判断语句来使用。
# 示例1:如果当close等于open价格的时候跳出循环,然后打印结果:
For Value1 = 0 To 10 Begin If (close[Value1] = open[Value1]) Then Break; End; If Value1 <= 10 Then print("Open = Close ", "equal value");
# 示例2:打印如果值等于3,返回到循环开头继续打印:
For Value1 = 0 To 10 begin if value1 <> 3 then print(value1) else continue; end; 输出结果:遇到3时将不打印,返回到循环开头继续循环 0.00 1.00 2.00 4.00 5.00 6.00 7.00 8.00 9.00 10.00 0.00 ....
第九节:扩展内容:交叉判断表达式
如果在当前 K 棒,数值表达式 A 的画线和数值表达式 B 的画 线按指定方向交叉,则返回 True。 Above,Over,Below,Under 参量用来指定交叉的方向。Above 和 Over 可替换,用来表示向上的方向(值从小到大),Below 和 Under 可替换,用来表示向下的方向(值从大到小)。 画线 A 向上交叉穿过画线 B 的定义如下:当前 K 棒的 A 值大 于 B 值且满足下面的其中一个条件: 1、前一根 K 棒中 A 值小于 B 值。 2、前一根或前几根 K 棒的 A 值等于 B 值,再之前的 K 棒 A 值小于 B 值。 画线 A 向下交叉穿过画线 B 的定义如下:当前 K 棒 A 值小于 B 值且满足下面的其中一个条件: 1、前一根 K 棒中 A 值大于 B 值。 2、前一根或前几根 K 棒的 A 值等于 B 值,再之前的 K 棒 A 值大于 B 值。,
因此Above与Over是一对,Below与Under是一对
# 示例:
当收盘价上穿 1350.00 时,发出警报: Plot1(Close); If Plot1 Cross Above 1350.50 Then Alert("Price has crossed above 1350.00");
=================================================
之前的文章感谢大家的转载,希望转载时请注明出处,本人转自其它网站的图表一并感谢,谢谢~!
https://www.cnblogs.com/noah0532/