量化投资技术分析实战:解码股票与期货交易模型
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 TB基本编程——条件循环语句

控制语句让模型可以在不同的情况下执行不同的操作,这是编程所必须的。其中算法中的条件结构是由条件语句来表达的,它是处理条件分支逻辑结构的算法语句,其一般的构成形式是If-Else-Elseif格式,具体如下。

        If (Condition)
        {
            TradeBlazer公式语句1;
        }Else
        {
            TradeBlazer公式语句2;
        }

Else包含了除了If之外的所有可能性。比如if A>B其他的所有可能性就是A<B和A=B。

If语句表示,达到If括号里要求的条件后,执行大括号里的语句。If-Else语句,是表示一个两分支,如果达到If描述的条件,就执行大括号里的语句。除此之外,这里的“此”就是针对If所描述的情况,全部用Else涵盖,并且执行Else里面的语句。具体如下。

        If (Condition1)
        {
            TradeBlazer公式语句1;
        }Else If(Condition2)
        {
            TradeBlazer公式语句2;
        }Else
        {
            TradeBlazer公式语句3;
        }

If-Elseif-If语句,则是可以持续性地扩展下去的多分支。可以在最后的Else之后不断添加新的分支。If-Else的嵌套表示多层次的分支,比如程序先分为Condition1和除了Condition1之外的两只,然后,在Condition1内部,又分为多种情况,但是它们总体上都是在Condition1这个条件之内的。这样我们就可以控制略微复杂一些的交易程序发出指令的规则。

这里举了一个例子,以对If-Else嵌套做简单解读。

        If (Open > High[1])  //如果当前Bar的开盘价>上一根Bar的收盘价,执行下面的分支
    {
          If (Close>Open)
          {
            Buy(1, close);
          }Else
          {
            Buy(1, open);
          }
        }Else  //当前Bar的开盘价≤上一根Bar的收盘价,执行下面的分支
        {
          If (Close > Open)
        {
          Sell(1, close);
        }Else
        {
          Sell (1, open);
        }
      }

第一层是当前Bar的开盘价>上一根Bar的收盘价,则执行分支,里面包括了“收盘价>开盘价”和“收盘价≥开盘价”也就是针对上一个If,用Else条件描述的情况。第二层是当前Bar的“开盘价≤上一根Bar的收盘价”,也就是针对第一层的If,用Else条件描述的情况。

IF是一个表达非常简单的语句,可以通过简明的语言,把两种不同的情况,返回条件所要求的值。如以下代码所示,第一个逗号后面的值,是满足条件时返回的值。第二个逗号后面的值,是不满足条件时返回的值。

        Numeric IIF(Bool Conditon, Numeric TrueValue, Numeric FalseValue)

IF语句的作用是根据表达式的值,来返回两部分中的一个。

◎ TrueValue条件为Conditon为True(真)时的返回值;

◎ FalseValue条件为Conditon为False(假)时的返回值。

        myValue=IIF(Close>Open, Close, Open);

如果当前Bar的Close>Open(收盘价>开盘价,即为阳线),则myValue=Close(收盘价),否则myValue=Open(开盘价)

for语句是一个条件循环语句,按照循环变量以1为步长递增,重复执行语句,直到达到条件,常用于递增某个变量这样的案例。如果需要从大到小执行,则可以把To改为Down to。

for循环变量 = 初始值To结束值,代码如下:

        {
          TradeBlazer公式语句;
        }

for循环的执行从循环变量的初始值到结束值,按照步长为1递增,依次执行TradeBlazer公式语句,结束值必须大于或等于初始值才有意义。

这里的例子表达的是,计算Price值所有周期的和。首先定义两个参数Price和Length,然后定义两个变量SumValue就是求和值,i是递增值。

        Params
            NumericSeries Price(1);
            Numeric Length(10);
        Vars
            Numeric SumValue(0);
            Numeric i;
        Begin
            for i = 0 to Length -1
            {
              SumValue = SumValue + Price[i];
            }
            Return SumValue;
        End

上述案例中,程序从i=0到lenght-1进行历遍,重复执行花括号{}内部的条件。执行的语句是:SumValue在每个周期进行累计叠加。最后达到lenght-1条件的时候,计算结束,返回这个值给SumValue。程序结束。

While循环语句在条件为真的时候,执行大括号里的语句,具体如下。

        While (Condition)
         {
          TradeBlazer公式语句;
        }

需要说明的是:交易开拓者允许一个K线图表里插入不同的数据,比如Data0:原图表Bar数据,可以插入螺纹钢指数合约RB000; Data1:第二个数据源,插入焦炭指数合约J9000……。

FileAppend函数也很实用,可以输出数值到电脑硬盘上,比如留下交易日志,或者输出数据做分析。语句格式是:

        FileAppend("c:\\Formula.txt", "hello world");

还可以用这种形式输出重要数据,导出成TXT或CSV文件,放入其他的数据分析软件中。

        FileAppend("c:\\test.txt",
        Text(Date)+", "+
        Text(Time)+", "+
        Text(Data0.Close));