浏览次数:10274 发表于:2012-04-06 09:02 来源: 开拓者量化网
变量是一个存储值的地址,当变量被声明之后,就可以在脚本中使用变量,可以对其赋值,也可以在其他地方引用变量的值进行计算,要对变量进行操作,直接使用变量名称即可。
变量的主要用处在于它可以存放计算或比较的结果,以方便在之后的脚本中直接引用运算的值,而无需重现计算过程。
例如,我们定义一个变量Y,我们把一个收盘价(Close)乘上8%的所得的值存储在Y中,即Y = Close *8%。那么一旦计算出Close * 8%的值,便赋给变量Y。而无需在公式中输入计算过程,只需调用变量名称即可引用变量的值。
变量有助于程序的优化,这是TradeBlazer公式必须重复调用一些数据,这些数据可能是某些函数(如:Bar数据),或通过表达式执行计算和比较的值。因此,在表达式频繁使用的地方使用变量可提高程序的运行速度和节约内存空间。
使用变量也可以避免输入错误,使程序的可读性提高,示例如下:
If(Close > High[1] + Average(Close,10)*0.5) { Buy(100, High[1] + Average(Close,10)*0.5); }
如果使用变量,则整个代码变得简洁:
Value1 = High[1] + Average(Close,10)*0.5; If (Close > Value1) { Buy(100,Value1); }
如果一些表达式的组合经常在不同的公式中被调用,这个时候变量就不能实现功能,变量只能在单个公式的内部使用,这个时候我们需要建立用户函数来完成这些功能,详细说明参见用户函数。
TradeBlazer公式支持九种数据类型,但对于变量定义,引用类型是无效的,剩余六种数据类型中分为简单和序列两大类,简单类型变量是单个的值,不能对其进行回溯,序列类型变量是和Bar长度一致的数据排列,我们可以通过回溯来获取当前Bar以前的任意值。
在使用变量之前,必须对变量进行声明,TradeBlazer公式使用关键字"Vars"来进行变量宣告,并指定变量类型。可以选择赋默认值,也可以不赋默认值。
变量定义的语法如下:
Vars 变量类型 变量名1(初值); 变量类型 变量名2(初值); 变量类型 变量名3(初值);
下面是一些变量定义的例子:
Vars NumericSeries MyVal1(0); //定义数值型序列变量MyVal1,默认值为0; Numeric MyVal2(0); //定义数值型变量MyVal2,默认值为0; Bool MyVal3(False); //定义布尔型变量MyVal3,默认值为False; String MyVal4("Test");//定义字符串变量MyVal4,默认值为Test。
变量定义的个数没有限制,变量名称的命名规范详细说明参见命名规则。
整个公式中只能出现一个Vars宣告,并且要放到公式的开始部分,在参数定义之后,正文之前。
在声明变量时,通常会赋给变量一个默认值。例如上例中的0,False,"Test"等就是变量的默认值。如果某个变量没有赋予默认值,系统将会自动给该变量赋予默认值。数值型变量的默认值为0,布尔型变量的默认值为False,字符串的默认值为空串。
变量的默认值是在当公式在执行时,给该变量赋予的初值,使该变量在引用时存在着有效的值。在该公式每个Bar的执行过程中,改变量的默认值都会被重新赋值。
变量声明完成之后,您可以在脚本正文中给变量指定一个值。
语法如下:
Name = Expression;
"Name"是变量的名称,表达式的类型可以是数值型、布尔型、字符串中的任何一种。不过表达式的类型一定要和变量的数据类型相匹配。如果变量被指定为是数值型的,那么表达式一定要是数值型的表达式。
例如:下面的语句将Close的10周期平均值赋值给变量Value1:
Value1 = Average(Close , 10);
在下面这个语句中,声明了一个名为"KeyReversal"的逻辑型变量,然后又把计算的值赋给它。
Vars Bool KeyReversal(False); Begin KeyReversal = Low < Low[1] AND Close > High[1]; ... End
变量定义、赋值之后,在表达式中直接使用变量名就可以引用变量的值。例如在下面的语句中计算了买入价格后,把值赋给数值型变量EntryPrc,在买入指令中便可直接应用变量名,通过变量名便可引用变量的值:
Vars Numeric EntryPrc(0); Begin EntryPrc = Highest(High,10); If (MarkerPosition <> 1) { Buy(1,EntryPrc); } End
接下来的例子,我们计算最近10个Bar最高价中的最大值(不包括当前Bar),对比当前High,然后通过If语句,产生报警信息。
Vars Bool Con1(False); Begin Con1 = High > Highest(High,10)[1]; If(Con1) { Alert("New 10-bar high"); } End
其实我们并不一定都要应用条件为True的情况,有时候我们需要判断条件为False的时候执行某些代码,如下的例子:
Vars Bool Con1(False); Begin Con1 = High < Highest(High,10)[1] AND Low > Lowest(Low,10)[1]; If(Con1==False) { Alert("New high or low"); } End
序列变量是变量中的一种,可以对序列变量进行回溯获取以前Bar的变量数据。序列变量的声明和简单变量一样,只是定义的数据类型不同,您必须选择以下的3种类型来定义序列变量:NumericSeries/BoolSeries/StringSeries。例如:
Vars NumericSeries MyNumSVal(0); BoolSeries MyBoolVal(False); StringSeries MyStrVal("");
序列变量和简单变量一样,可以对其赋予默认值。
序列变量定义之后,您可以象简单变量一样的对其使用,不会有任何的不同。除了支持全部简单变量的功能之外,序列变量还可以通过"[nOffset]"来回溯以前的变量值,详细说明参见变量回溯。
对于序列变量,TradeBlazer公式在内部针对其回溯的特性作了很多的特殊处理,也需要为序列变量保存相应的历史数据,因此,和简单变量相 比,执行的速度和占用内存空间方面都作了一些牺牲。因此,尽管您可以定义一个序列变量,把它当作简单变量来使用,但是,我们强烈建议您只将需要进行回溯的 变量定义为序列变量。
地址:深圳市南山区粤海街道滨海社区海天一路 19、17、18号软件产业基地 4 栋 4 层 408
邮编:518054
电话:0755-83410021 传真:0755-83417337 Email:webmaster@tb18.net
Copyright @ 2007 - 2024
深圳开拓者科技有限公司 All Rights Reserved. 版权所有 未经许可 请勿转载
粤ICP备07044698号