浏览次数:21098 发表于:2012-04-06 09:02 来源: 开拓者量化网
TradeBlazer公式包含的公式类型如下:
用户函数是可以通过名称进行调用的一组语句的集合,用户函数返回一个值,这个值可以是Numeric,Bool,String三种类型中的任何一种。您可以在需要的任何地方调用用户函数来完成相应的功能。
例如,在TradeBlazer公式中经常使用的一个用户函数Summation,Summation通过输入Price序列数据,以及 Length统计周期数,计算Price最近Length周期的和,每次用户需要进行求和计算的时候,都可以调用Summation代替冗长的求和代码, 输入参数并获取返回值。
Summation是TradeBlazer公式中一个比较简单的用户函数,TradeBlazer公式提供了上百个内建用户函数,当然,您也可以编写您自己的用户函数。
用户函数通过参数传递输入数据,通过引用参数或返回值传递输出数据,以上例子中的Summation函数,在被调用的时候格式如下:
Value1 = Summation(Close,10);
在调用Summation的时候,需要根据定义时候的参数列表和顺序,输入相应的输入参数,有默认值的参数可以省略输入参数。
用户函数在交易开拓者中使用有如下规则:
支持九种类型的参数定义,支持指定参数默认值;
支持使用引用参数,可通过引用参数返回多个数据;
支持六种类型的变量定义,支持指定变量的默认值;
可以访问Data0-Data49个数据源的Bar数据;
可以访问行情数据、属性数据;
必须通过Return返回数据,返回数据类型为三种基本类型之一;
脚本中的返回数据类型必须和属性界面设置中一致;
用户函数之间可以相互调用,用户函数自身也可以递归调用;
用户函数可以根据设置调用部分的系统函数。
用户函数按照返回值类型不同可以分为数值型(Numeric),布尔型(Bool),字符串(String)三种基本类型,三种类型用户函数在调用时需要将返回值赋予类型相同的变量。
按照用户函数属性不同,用户函数可以分为内建用户函数和其他用户函数两种,内建用户函数是交易开拓者提供的,用于支持公式系统运行的预置公式,您可以查看和调用内建用户函数,但是不能删除和修改内建公式。
按照用户函数的实现机制不同,用户函数可分为普通函数和序列函数。普通函数和其他语言的函数类似,输入参数,执行一段程序代码,返回需要的值。序列函数是输入参数或变量中有序列数据类型的用户函数。
序列函数是一种特殊的用户函数,当它的参数或变量中使用了序列数据,我们就称之为序列函数,序列数据作为普通计算机语言和TB语言的重要区别,是进 行金融序列数据计算的核心。为了保证序列数据的正确计算,序列函数需要每个Bar都被调用,如果有些Bar没有调用序列函数,序列函数中的序列数据则是上 一个Bar的值。除非是您的算法需要,否则建议不要在条件语句,条件语句的判断表达式,循环语句中使用序列函数。
TradeBlazer公式中提供上百个内建用户函数,一部分用户函数提供类似于求和,求平均,求线性回归等算法方面的功能,另外一些函数提供技术分析的一些算法,比如:RSI,CCI,DMI等,这些用户函数用户辅助完成技术分析。
在创建自己的技术分析和交易系统时,如果需要自己写一些算法,您可以首先在用户函数中查找是否有相应的内建用户函数,尽可能的多使用内建用户函数,减少出错的可能。您也可以编写自己的算法,以供在技术分析和交易系统中使用。
大部分用户函数都需要接受输入的信息进行计算,这些输入的信息,我们称之为参数。关于用户函数参数的使用详细说明参见参数。
一个用户函数由三部分组成,参数定义,变量定义,脚本正文。
语法如下:
Params 参数定义语句; Vars 变量定义语句; Begin 脚本正文; End
参数定义和变量定义部分在前面已经详细叙述过,脚本的正文部分将输入参数进行计算,得出函数的返回值,并通过Return返回。
例如,我们以Average为例,Average计算Price在Length周期内的平均值。Average调用Summation求和,并计算平均值,然后返回结果,脚本如下:
Params NumericSeries Price(1); Numeric Length(10); Vars Numeric AvgValue; Begin AvgValue = Summation(Price, Length) / Length; Return AvgValue; End
对于使用多个输出的情况,即使用引用参数的情况,我们以求N周期最大值为例进行描述,假定我们需要编写一个用户函数,该函数需要求出序列变量Price在最近Length周期内的最大值,并且要求出最大值出现的Bar和当前Bar的偏移值。脚本如下:
Params NumericSeries Price(1); Numeric Length(10); NumericRef HighestBar(0); Vars Numeric MyVal; Numeric MyBar; Numeric i; Begin MyVal = Price; MyBar = 0; For i = 1 to Length - 1 { If ( Price[i] > MyVal) { MyVal = Price[i]; MyBar = i; } } HighestBar = MyBar; Return MyVal; End
用户函数成功创建之后(编译/保存成功),您可以在其他的用户函数、技术分析、交易指令等公式中调用用户函数,调用用户函数时需要注意保持参数类型 的匹配,即用户函数参数的声明数据类型需和调用时传入参数的数据匹配,这是所指的匹配是指基本数据类型:数值型,布尔型,字符串三种类型匹配,并且保持序 列参数和传入变量类型的对应。我们可以对用户函数定义为Numeric或者NumericRef的参数使用Numeric类型的变量作为传入参数;但不能 将在定义为NumericSeries类型的参数时传入Numeric。具体的对应关系如下表:
函数参数声明类型 | 可传入的变量类型 |
---|---|
Numeric | Numeric,NumericRef,NumericSeries |
NumericRef | Numeric,NumericRef,NumericSeries |
NumericSeries | NumericSeries |
Bool | Bool,BoolRef,BoolSeries |
BoolRef | Bool,BoolRef,BoolSeries |
BoolSeries | BoolSeries |
String | String,StringRef,StringSeries |
StringRef | String,StringRef,StringSeries |
StringSeries | StringSeries |
对于函数的返回值,您也可以将用户函数的Numeric返回值赋值给NumericSeries或NumericRef变量。即在用户函数的返回值使用时,忽略其扩展数据类型。比如我们在调用Average求平均值时,可以这样调用:
Vars Numeric Value1; Begin Value1 = Average(Close,10); ... End
我们也可以按照以下方式进行调用:
Vars NumericSeries Value1; Begin Value1 = Average(CloseTmp,10); ... End
A用户函数调用自身,我们称之为直接递归;A用户函数可以调用B用户函数,同时B用户函数也可以调用A用户函数,对于这种的情况,我们称之为间接递归;
不管是直接递归还是间接递归,用户函数在执行的时候,都可能遇到递归调用没有出口,导致死循环的情况。因此,我们在编写公式的时候,要注意避免使用递归算法,如果一定需要使用递归算法,要注意保证递归算法都有出口。
用户函数在被调用的时候,如果传入的参数和参数的默认值一样,可以省略输出参数,使用默认值来调用用户参数。只能够对排列在后面的那些参数使用默认参数,默认参数的定义参见参数。
TradeBlazer公式通过公式应用来实现技术分析输出和交易策略的执行,根据使用目的的不同,我们将公式应用分为两类(技术分析和交易策略)进行单独描述。
技术指标是最常用的一类公式,它通过计算一系列的数学公式,在每个Bar都返回值,这些值在图表模块中输出为线条、柱状图、点等表现形式,通过分析图形特点、走势和曲线帮助客户分析行情走势,得出合理的交易判断。
当技术指标应用在图表中时,您可以设置技术指标各输出值的表现形式,以及颜色、粗细等,如下图的点,线,柱状图所示:
示例,技术指标RSI,脚本如下:
Params Numeric Length(14); Numeric OverSold(20); Numeric OverBought (80); Vars Numeric RSIValue(0); Numeric RSIColor(-1); Begin RSIValue = RSI(Close,Length); If (RSIValue > OverBought) { RSIColor = RED; }Else If (RSIValue < OverSold) { RSIColor = CYAN; } PlotNumeric("RSI1", RSIValue, RSIColor); PlotNumeric("超卖", OverSold); PlotNumeric("超买", OverBought); If CrossOver(RSIValue,OverSold) { Alert("Indicator exiting oversold zone"); } If CrossUnder(RSIValue, OverBought) { Alert("Indicator exiting overbought zone"); } End
公式应用RSI调用RSI内建用户函数计算出结果,然后判断其返回值和超买,超卖的关系,设置显示颜色,并产生报警信息。
公式应用在输出数据时,我们是通过输出值的名称来进行识别,名称相同则认为是一个数据,如下的代码,后面语句的输出数据将会覆盖前面语句的输出数据。
PlotNumeric("Test",10); PlotNumeric("Test",20);
最后"Test"输出的数据为20,而不是10。
常用的技术指标类函数有PlotNumeric、PlotString、PlotBool、UnPlot、Alert。
当我们在公式应用中编写了完整的开平仓规则以及、头寸控制、风险控制等代码,我们称之为交易策略,交易策略是我们一个独立交易思想的完整体现。
TradeBlazer公式提供四个交易函数和现实中的四种交易动作进行对应,列表如下:
函数名 | 描述 |
---|---|
Buy | 平掉所有空头持仓,开多头仓位。 |
Sell | 平掉指定的多头持仓。 |
SellShort | 平掉所有多头持仓,开空头仓位。 |
BuyToCover | 平掉指定的空头持仓。 |
示例,以下是一个双均线交易策略的代码:
Params Numeric FastLength(5); Numeric SlowLength(20); Numeric BuyLots(1); Vars NumericSeries AvgValue1; NumericSeries AvgValue2; Begin AvgValue1 = AverageFC(Close,FastLength); AvgValue2 = AverageFC(Close,SlowLength); If(MarketPosition!=1 And (AvgValue1[1] > AvgValue2[2])) { Buy(BuyLots,Open); } If(MarketPosition!=-1 And (AvgValue1[1] < AvgValue2[2])) { SellShort(BuyLots,Open); } End
为了在上面交易策略在超级图表中执行同时看到两条均线的数值,我们也可以在交易策略中输出指标线条,只需要增加以下两行代码:
PlotNumeric("MA1",AvgValue1); PlotNumeric("MA2",AvgValue2);
除了希望看到两条均线值之外,我们还希望能够在超级图表中看到交易策略的盈亏曲线,这时我们需要再增加一条指标线:
PlotNumeric("OpenEquity",Portfolio_TotalProfit);
关于交易策略的更多使用参见交易策略进阶
地址:深圳市南山区粤海街道滨海社区海天一路 19、17、18号软件产业基地 4 栋 4 层 408
邮编:518054
电话:0755-83410021 传真:0755-83417337 Email:webmaster@tb18.net
Copyright @ 2007 - 2024
深圳开拓者科技有限公司 All Rights Reserved. 版权所有 未经许可 请勿转载
粤ICP备07044698号