量化投资_EasyLanguage/PowerLanguage教学课程__【第一篇基础】__【第三章条件判断与循环语句】

第三章:控制循环语句

第一节:陈述式分组语句

  陈述式的英文叫做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的语句中有连个跳跃语句分别是BreakContinue,这两个语句是需要配合其他语句来使用的,其中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/

原文地址:https://www.cnblogs.com/noah0532/p/13673887.html