zoukankan      html  css  js  c++  java
  • 量化投资_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/

  • 相关阅读:
    P1903 [国家集训队]数颜色 / 维护队列 莫对算法
    P1016 旅行家的预算 模拟 贪心
    P3948 数据结构 差分数组
    乘法逆元 模板
    二分法 最大化平均值
    HDU5213 Lucky 莫队算法 容斥定理
    P1083 借教室 差分数组
    发布订阅、redis的配置文件、redis的主从、redis的持久化、
    nosql、redis、性能测试、命令相关、redis的数据类型string、list、hash、set、zset、
    nginx的日志、禁止访问、反向代理、权重、nginx location匹配规则、location分离、WSGI、
  • 原文地址:https://www.cnblogs.com/noah0532/p/13673887.html
Copyright © 2011-2022 走看看