公式系统 - TradeBlazer公式基础 - 参数

参数

参数是一个预先声明的地址,用来存放输入参数的值,在声明之后,您就可以在接下来的公式中使用该参数的名称来引用其值。

参数的值在公式的内部是不能够被修改,在整个程序中一直保持不变,不能对参数进行赋值操作(引用参数是个特例)。参数的好处在于您可以在调用公式应用的时候才指定相应的参数,而不需要重新编译。

例如,我们常用的移动平均线指标,就是通过不同的Length来控制移动平均线的周期,在调用指标时可以随意修改各个Length的值,使之能够计算出相对应的移动平均线。您可以指定4个参数为5,10,20,30计算出这4条移动平均线,也可以修改4个参数为10,22,100,250计算出另外的4条移动平均线。

参数的修改很简单,在超级图表调用指标的过程中,您可以打开指标的属性设置框,切换到参数页面,手动修改各项参数的值,然后应用即可,交易开拓者将根据新的参数设置计算出新的结果,在超级图表中反映出来。

另外,参数的一个额外的优点是,我们可以通过修改公式应用不同的参数,测试交易策略的性能优劣,达到优化参数的目的。

参数类型

在介绍参数类型之前,我们需要对于TradeBlazer公式的公式类型作一些说明,用户函数是公式中比较特殊的类型,它自身不能被超级图表,行情报价这样的模块调用,只能被公式应用或者用户函数调用,因此它的参数类型也和公式应用不一样。

用户函数的参数类型可以包含TradeBlazer公式的九种类型,而公式应用只能使用三种简单的基本类型。

三种简单类型参数通过传值的方式将参数值传入公式,公式内部通过使用参数名称,将参数值用来进行计算或赋值。

引用参数是在调用的时候传入一个变量的地址,在用户函数内部会修改参数的值,在函数执行完毕,上层调用的公式会通过变量获得修改后的值,引用参数对于需要通过用户函数返回多个值的情况非常有用。

序列参数可以通过回溯获取以前Bar的值,具体介绍可参见参数回溯

参数声明

在使用参数之前,必须对参数进行声明,TradeBlazer公式使用关键字"Params"来进行参数宣告,并指定参数类型。可以选择赋默认值,也可以不赋默认值。如果某个参数没有赋予默认值,则这个参数之前的其他参数的默认值都将被忽略。

参数定义的语法如下:

Params
    参数类型 参数名1(初值);
    参数类型 参数名2(初值);
    参数类型 参数名3(初值);

下面是一些参数定义的例子:

Params
    Bool            bTest(False);       //定义布尔型参数bTest,默认值为False;
    Numberic        Length(10);         //定义数值型参数Length,默认值为10;
    NumericSeries   Price(0);           //定义数值型序列参数Price,默认值为0;
    NumericRef      output(0);          //定义数值型引用参数output,默认值为0;
    String          strTmp("Hello");    //定义字符串参数strTmp,默认值为Hello;

参数名称的命名规范详细说明参见命名规则

整个公式中只能出现一个Params宣告,并且要放到公式的开始部分,在变量定义之前。

参数的默认值

在声明参数时,通常会赋给参数一个默认值。例如上例中的False,10,0等就是参数的默认值。用户函数的默认值是在当用户函数被其他公式调用,省略参数时作为参数的输入值,其他五种公式的默认值是用于图表,报价等模块调用公式时默认的输入值。

参数的默认值的类型在定义的时候指定,默认值在公式调用的时候传入作为参数进行计算。只能够对排列在后面的那些参数提供默认参数,例如:

Params
    Numeric	MyVal1;
    Numeric	MyVal2(0);
    Numeric	MyVal3(0);

您不能够使用以下方式对参数的默认值进行设定:

Params
    Numeric	MyVal1(0);
    Numeric	MyVal2(0);
    Numeric	MyVal3;

参数使用

在声明参数之后,我们可以在脚本正文中通过参数名称使用该参数,在使用的过程中要注意保持数据类型的匹配,示例如下:

Params
    NumericSeries Price(1);
Vars
    NumericSeries CumValue(0);
Begin
    CumValue = CumValue[1] + Price;	
    Return CumValue;
End

在以上的公式中,首先定义了一个数值型序列参数Price,并将其默认值设置为1。接着定义了一个变量CumValue。脚本正文中,将CumValue的上一个Bar值加上Price,并将值赋给CumValue,最后返回CumValue。

通过上述的公式可以看到,我们只需要调用参数名,就可以使用参数的值进行计算了,如果要对序列参数进行回溯,请参见参数回溯

引用参数

TradeBlazer公式的用户函数可以通过返回值,返回函数的计算结果,返回值只能是三种简单类型。当我们需要通过函数进行计算,返回多个值的时候,单个的返回值就不能满足需求了。在这种情况下,我们提出了引用参数的概念,引用参数是在调用的时候传入一个变量的地址,在用户函数内部会修改参数的值,在函数执行完毕,上层调用的公式会通过变量获得修改后的值。因为引用参数的使用是没有个数限制,因此,我们可以通过引用参数返回任意多个值。

例如,用户函数MyFunc如下:

Params
    NumericSeries   Price(0);
    NumericRef      oHigher(0);
    NumericRef      oLower(0);
Vars
    Numeric         Tmp(0);
Begin
    Tmp = Average(Price,10);
    oHigher = IIf(Tmp > High,Tmp,High);
    oLower = IIf(Tmp < Low,Tmp,Low);
    Return Tmp;
End

以上代码通过两个数值型引用参数返回10个周期的Price平均值和最高价的较大值oHigher,以及10个周期的Price平均值和最低价的较小值oLower,并且通过函数返回值输出10个周期的Price平均值。在调用该用户函数的公式中,可以通过调用该函数获得3个计算返回值,示例如下:

Vars
    Numeric AvgValue;
    Numeric	HigherValue;
    Numeric LowerValue;
Begin
    AvgValue = MyFunc(Close,HigherValue,LowerValue);
    ...
End
posted @ 2013-03-13 01:13  投机者  阅读(915)  评论(0编辑  收藏  举报