6评论

0收藏

TradeBlazer公式包含的公式类型

avatar EA狙击手 | 4145 人阅读 | 6 人评论 | 2013-07-16

TradeBlazer公式包含的公式类型如下:
用户函数用户字段技术指标K线型态特征走势交易指令
用户函数
用户函数是可以通过名称进行调用的一组语句的集合,用户函数返回一个值,这个值可以是NumericBoolString三种类型中的任何一种。您可以在需要的任何地方调用用户函数来完成相应的功能。
例如,在TradeBlazer公式中经常使用的一个用户函数SummationSummation通过输入Price序列数据,以及Length统计周期数,计算Price最近Length周期的和,每次用户需要进行求和计算的时候,都可以调用Summation代替冗长的求和代码,输入参数并获取返回值。
SummationTradeBlazer公式中一个比较简单的用户函数,TradeBlazer公式提供了上百个内建用户函数,当然,您也可以编写您自己的用户函数。
用户函数通过参数传递输入数据,通过引用参数或返回值传递输出数据,以上例子中的Summation函数,在被调用的时候格式如下:
Value1 = Summation(Close,10);
在调用Summation的时候,需要根据定义时候的参数列表和顺序,输入相应的输入参数,有默认值的参数可以省略输入参数。
用户函数在交易开拓者中使用有如下规则:
§ 支持九种类型的参数定义,支持指定参数默认值;
§ 支持使用引用参数,可通过引用参数返回多个数据;
§ 支持六种类型的变量定义,支持指定变量的默认值;
§ 可以访问Data0-Data49个数据源的Bar数据;
§ 可以访问行情数据、属性数据;
§ 必须通过Return返回数据,返回数据类型为三种基本类型之一;
§ 脚本中的返回数据类型必须和属性界面设置中一致;
§ 用户函数之间可以相互调用,用户函数自身也可以递归调用;
§ 用户函数可以根据设置调用部分的系统函数。
用户函数的类型用户函数按照返回值类型不同可以分为数值型(Numeric),布尔型(Bool),字符串(String)三种基本类型,三种类型用户函数在调用时需要将返回值赋予类型相同的变量。
按照用户函数属性不同,用户函数可以分为内建用户函数和其他用户函数两种,内建用户函数是交易开拓者提供的,用于支持公式系统运行的预置公式,您可以查看和调用内建用户函数,但是不能删除和修改内建公式。
使用内建用户函数TradeBlazer公式中提供上百个内建用户函数,一部分用户函数提供类似于求和,求平均,求线性回归等算法方面的功能,另外一些函数提供技术分析的一些算法,比如:RSICCIDMI,这些用户函数用户辅助完成技术分析。
在创建自己的技术分析和交易系统时,如果需要自己写一些算法,您可以首先在用户函数中查找是否有相应的内建用户函数,尽可能的多使用内建用户函数,减少出错的可能。您也可以编写自己的算法,以供在技术分析和交易系统中使用。
用户函数的参数大部分用户函数都需要接受输入的信息进行计算,这些输入的信息,我们称之为参数。关于用户函数参数的使用详细说明参见参数
如何编写用户函数一个用户函数由三部分组成,参数定义,变量定义,脚本正文。
语法如下:
Params    参数定义语句;Vars    变量定义语句;Begin    脚本正文;End
参数定义和变量定义部分在前面已经详细叙述过,脚本的正文部分将输入参数进行计算,得出函数的返回值,并通过Return返回。
例如,我们以Average为例,Average计算PriceLength周期内的平均值。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 > MyVal)         {                  MyVal = Price;                  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返回值赋值给NumericSeriesNumericRef变量。即在用户函数的返回值使用时,忽略其扩展数据类型。比如我们在调用Average求平均值时,可以这样调用:
Vars    Numeric Value1;Begin    Value1 = Average(Close,10);    ...End
我们也可以按照以下方式进行调用:
Vars    NumericSeries Value1;Begin    Value1 = Average(CloseTmp,10);    ...End
A用户函数调用自身,我们称之为直接递归;A用户函数可以调用B用户函数,同时B用户函数也可以调用A用户函数,对于这种的情况,我们称之为间接递归;
不管是直接递归还是间接递归,用户函数在执行的时候,都可能遇到递归调用没有出口,导致死循环的情况。因此,我们在编写公式的时候,要注意避免使用递归算法,如果一定需要使用递归算法,要注意保证递归算法都有出口。
用默认参数调用用户函数用户函数在被调用的时候,如果传入的参数和参数的默认值一样,可以省略输出参数,使用默认值来调用用户参数。只能够对排列在后面的那些参数使用默认参数,默认参数的定义参见参数
对于用户函数的直接递归调用,默认参数调用有一些特殊的意义,如下所示,用户函数Fun1
Params    NumericSeries Price(1);Vars    Numeric CumValue(0);Begin    If(CurrentBar == 0)    {        CumValue = Price;    }else    {        CumValue = Fun1[1] + Price;    }    Return CumValue;End
技术指标Ind1调用Fun1的代码如下:
Value1 = Fun1(Close);
以上的用户函数通过默认参数调用Fun1的意思不是调用Fun1(1),而是将Ind1调用Fun1Close传递下去,即求Fun1(Close)的上一个Bar的值。以上Ind1调用Fun1的计算结果和调用如下的Fun2计算结果一致。
用户函数Fun2
Params    NumericSeries Price(1);Vars    Numeric CumValue(0);Begin    If(CurrentBar == 0)    {        CumValue = Price;    }else    {        CumValue = Fun1(Close)[1] + Price;    }    Return CumValue;End
用户字段
用户字段作为一种特殊用途的公式,它主要用于在报价类窗体中使用,最大的特点在于:用户字段不像其他公式,它只需要最后一个Bar的输出数据,而不是所有Bar的输出数据。因此,对于用户字段的处理和其他公式都不相同,我们对用户字段的使用规则归纳如下:
§ 支持三种基本类型的参数定义,支持指定参数默认值;
§ 不支持使用引用参数;
§ 支持六种类型的变量定义,支持指定变量的默认值;
§ 可以访问Data0-Data49个数据源的Bar数据;
§ 可以访问行情数据属性数据;
§ 必须通过FieldNumeric、FieldBool、FieldString返回数据,返回数据类型为三种基本类型的组合;
§ 可以支持Alert来进行报警;
§ 用户字段可以调用所有的用户函数进行计算;
§ 用户字段可以根据设置调用部分的系统函数;
§ 用户字段在执行时,必须要指定相应的数据源和周期,需要调用历史数据的,只有历史数据存在的情况下才能返回正确的值。
例如,用户字段Field1计算最近5Bar的收盘价的最大价,用户函数Highest计算最大值。脚本如下:
Params    Numeric Length(5);Vars    Numeric HighValue(0);Begin    HighValue = Highest(Close,Length);    FieldNumeric("Highest Bar", HighValue);End
在用户字段中只能输出一组数据,该组数据通过FieldNumeric/FieldBool/FieldString的第一个参数:输出值的名称来进行识别,在一个用户字段中,不能出现两个不同的输出值名称,以下为错误的代码:
FieldNumeric("Test1",Close);FieldNumeric("Test2",Open);FieldBool("Test1",True);
以下为正确的代码:
FieldNumeric("Test1",10);FieldBool("Test1",True);FieldString("Test1","Test String");
技术指标
技术指标是最常用的一类公式,它通过计算一系列的数学公式,在每个Bar都返回值,这些值在图表模块中输出为线条、柱状图、点等表现形式,通过分析图形特点、走势和曲线帮助客户分析行情走势,得出合理的交易判断。
当技术指标应用在图表中时,您可以设置技术指标各输出值的表现形式,以及颜色、粗细等,如下图的点,线,柱状图所示:
技术指标的使用规则归纳如下:
§ 支持三种基本类型的参数定义,支持指定参数默认值;
§ 不支持使用引用参数;
§ 支持六种类型的变量定义,支持指定变量的默认值;
§ 可以访问Data0-Data49个数据源的Bar数据;
§ 可以访问行情数据、属性数据;
§ 必须通过PlotNumeric、PlotBool、PlotString返回数据,返回数据类型为三种基本类型的组合;
§ 可以输出多组数据,通过PlotNumeric、PlotBool、PlotString的第一个参数,即输出名称来区分输出数据;
§ 可以支持Alert来进行报警;
§ 技术指标可以调用所有的用户函数进行计算;
§ 技术指标可以根据设置调用部分的系统函数;
§ 技术指标在执行时,必须要指定相应的数据源和周期,需要调用历史数据的,只有历史数据存在的情况下才能返回正确的值。
示例,技术指标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
K线型态
K线型态是另外一种形式的技术分析公式,它对满足设定条件的Bar进行标记,使之醒目,便于客户进行分析。
K线型态应用在图表中时,您可以设置其输出值的颜色、风格和粗细,如图所示:
K线型态的使用规则归纳如下:
§ 支持三种基本类型的参数定义,支持指定参数默认值;
§ 不支持使用引用参数;
§ 支持六种类型的变量定义,支持指定变量的默认值;
§ 可以访问Data0-Data49个数据源的Bar数据;
§ 可以访问行情数据、属性数据;
§ 必须通过PlotBar返回数据;
§ 只能输出一组数据,用名称进行区分;
§ 可以支持Alert来进行报警;
§ K线型态可以调用所有的用户函数进行计算;
§ K线型态可以根据设置调用部分的系统函数;
§ K线型态在执行时,必须要指定相应的数据源和周期,需要调用历史数据的,只有历史数据存在的情况下才能返回正确的值。
示例,K线型态十字星,脚本如下:
Vars    Bool Condition(False);Begin    Condition = (Abs(Close-Open)*10<(High-Low)) And                 (High <> Close) And (Low <> Close);    If (Condition)    {        PlotBar("SZX",High,Low)    }End
K线型态十字星判断条件,条件满足的情况下用PlotBar输出信息。
特征走势
特征走势是另外一种形式的技术分析公式,它对满足设定条件的Bar进行标记,使之醒目,便于客户进行分析。特征走势和K线型态有很多相似之处,最大的不同在于,K线型态和特征走势的数据输出方式。
当特征走势应用在图表中时,您可以设置其输出值的表现形式,以及颜色、风格和粗细,如图所示:
特征走势的使用规则归纳如下:
§ 支持三种基本类型的参数定义,支持指定参数默认值;
§ 不支持使用引用参数;
§ 支持六种类型的变量定义,支持指定变量的默认值;
§ 可以访问Data0-Data49个数据源的Bar数据;
§ 可以访问行情数据、属性数据;
§ 必须通过PlotNumeric、PlotBool、PlotString返回数据,返回数据类型为三种基本类型的组合;
§ 只能输出一组数据,用名称进行区分;
§ 可以支持Alert来进行报警;
§ 特征走势可以调用所有的用户函数进行计算;
§ 特征走势可以根据设置调用部分的系统函数;
§ 特征走势在执行时,必须要指定相应的数据源和周期,需要调用历史数据的,只有历史数据存在的情况下才能返回正确的值。
示例,特征走势创历史新高,脚本如下:
Params    Numeric Length(5);Vars    Bool Condition(False);Begin    Condition = (High ==Highest(High,Length)) ;    If (Condition)    {        PlotNumeric("CLSXG",High)    }End
特征走势创历史新高判断条件,条件满足的情况下用PlotNumericPlotBoolPlotString输出信息。
交易指令
TradeBlazer公式提供一种简单的方法表达您的交易思想,那就是使用交易指令,一个简单的交易指令如下:
If (Condition)    Buy (1,Close);
以上的语句表达的意思是:当某些条件满足了,将用当前Bar的收盘价买入1手指定商品。就像您平时通过经纪商进行交易操作一样,TradeBlazer公式提供四个系统函数和现实中的四种交易动作进行对应,如下:
函数名
描述
Buy
平掉所有空头持仓,开多头仓位。
Sell
平掉指定的多头持仓。
SellShort
平掉所有多头持仓,开空头仓位。
BuyToCover
平掉指定的空头持仓。
交易指令的使用规则归纳如下:
§ 支持三种基本类型的参数定义,支持指定参数默认值;
§ 不支持使用引用参数;
§ 支持六种类型的变量定义,支持指定变量的默认值;
§ 可以访问Data0-Data49个数据源的Bar数据;
§ 可以访问行情数据、属性数据;
§ 通过Buy、Sell、SellShort和BuyToCover产生交易动作,也可以使用各种内建平仓指令产生交易动作;
§ 每个交易指令至少包含一个交易动作;
§ 交易指令可以调用所有的用户函数进行计算;
§ 交易指令可以根据设置调用部分的系统函数;
§ 交易指令在执行时,必须要指定相应的数据源和周期,需要调用历史数据的,只有历史数据存在的情况下才能返回正确的值。
示例,交易指令MACD_LE,脚本如下:
Params    Numeric FastLength( 12 );    Numeric SlowLength( 26 );    Numeric MACDLength( 9 );    Numeric BuyLots(1);Vars       NumericSeries MACDValue;     NumericSeries AvgMACD;    Numeric MACDDiff;    Bool Condition1;    Bool Condition2;Begin    MACDValue = XAverage( Close, FastLength ) -                     XAverage( Close, SlowLength ) ;        AvgMACD = XAverage(MACDValue,MACDLength);    MACDDiff = MACDValue - AvgMACD;    Condition1 = CrossOver(MACDValue, AvgMACD) ;    Condition2 = MACDValue > 0;    if (Condition1 And Condition2)    {        Buy(BuyLots,Close);    }End
MACD_LE在零轴之上,MACDValue向上穿过AvgMACD值时为产生多头买入指令。
关于Delay默认情况下,4个交易函数产生的委托单即时发送;当参数Delay=True时,委托单将延迟到下一个Bar发送,这样设计的原因在于:只有延迟的委托单才会保证发送的交易指令的正确性。
假定在某商品A的周期为5分钟的数据上应用交易指令,A商品每1秒钟会产生一个Tick数据,因此一段时间内(<5分钟)A商品最后一个Bar的数据的收盘价,最高价,最低价以及成交量等数据,会随着Tick的变化和累计而产生相应的变化。在某种情况下,上一个Tick更新时,Buy的预设条件可能为False,下一个Tick更新时,Buy的预设条件为True。如果不延迟,将会马上发送该委托单到交易所。但是,当更多的Tick累计,产生一个新的Bar时,Buy的预设条件可能会变成False。在这种情况,前面产生的委托单将会丢失,不会在测试和优化报表中出现。该委托单实际上是由于噪音数据产生的错误讯号导致,为了避免这种情况的出现,一定要等最后Bar数据更新结束之后,新Bar产生第一个Tick时,才会发送上一个Bar产生的委托单。
当交易函数的延迟设置为False。将会实时发送产生的委托单,按Tick进行更新。在使用该参数时,需要确认自己所编写的公式不会用到这些无效的中间数据,从而影响交易结果。
注意: Delay参数对交易会产生重要的影响,请在确认理解含义之后才进行真实的交易。
内建平仓指令
除了上节的SellBuyToCover可以进行平仓之外,TradeBlazer公式提供了额外的八种平仓函数,通过合理的应用内建平仓函数,可以帮助您有效的锁定风险并及时获利。
您可以组合使用内建平仓函数,也可以在自己的交易指令中调用内建平仓函数进行平仓,八个内建平仓函数如下:
函数名
描述
SetExitOnClose
该平仓函数用来在当日收盘后产生一个平仓动作,将当前所有的持仓按当日收盘价全部平掉。
SetBreakEven
该平仓函数在获利条件满足的情况下启动,当盈利回落达到保本时产生平仓动作,平掉指定的仓位。
SetStopLoss
该平仓函数在亏损达到设定条件时产生平仓动作,平掉指定的仓位。
SetProfitTarget
该平仓函数在盈利达到设定条件时产生平仓动作,平掉指定的仓位。
SetPeriodTrailing
该平仓函数在盈利回落到设定条件时产生平仓动作,平掉指定的仓位。
SetPercentTrailing
该平仓函数在盈利回落到设定条件时产生平仓动作,平掉指定的仓位。
SetDollarTrailing
该平仓函数在盈利回落到设定条件时产生平仓动作,平掉指定的仓位。
SetInactivate
该平仓函数在设定时间内行情一直在某个幅度内波动时产生平仓动作,平掉指定的仓位。
关于ExitPosition上述多个平仓函数都用到了参数ExitPosition,作为平仓函数仓位控制的重要参数,有必要对该参数进行单独说明。
ExitPosition是布尔型参数,当ExitPosition=True时,表示将当前所有的持仓作为一个整体,根据其平均建仓成本,计算各平仓函数的盈亏,当条件满足时,会将所有仓位一起平掉;当ExitPosition=False时,表示单独对每个建仓位置进行平仓,单独计算各平仓函数盈亏时,当单个建仓位置条件满足后,平掉该建仓位置即可。
交易策略
通常单个交易指令只完成建仓或平仓的单个动作,而一个完整的交易策略应该至少包含建仓、平仓交易指令,并且根据需要加上止损,获利等锁定风险和收益的交易指令。多个交易指令的组合才能更加有效的帮助我们完整的进行交易,因此,我们将多个交易指令的有效组合称之为交易策略。
假定我们创建一个交易策略,该交易策略由以下交易指令组成,并按照如下顺序应用到超级图表中。
当我们将该交易策略应用到超级图表上时,TradeBlazer公式将会从图表的第一个Bar开始执行交易策略,在第一个Bar上首先执行多头建仓指令A,可能会产生交易委托(开仓),该委托可能被设置为在当前Bar执行,也可以被设置为延迟到下一个Bar执行。当多头建仓指令A执行完成之后,将按顺序调用多头平仓指令B,同时该指令会判断当前的持仓状态,仓位等信息,当条件满足的时候会产生交易委托(平仓)。依次执行止损平仓指令C和获利平仓指令D,当四个交易指令在第一个Bar上都执行完之后,将会移到第二个Bar执行,这时候,系统会首先读取上一个Bar是否有延迟的交易委托,如果有延迟的交易委托,对这些委托先进行处理,然后像第一个Bar一样,依次调用各个交易指令。以此类推,从图表的第一个Bar到最后一个Bar,全部执行完成之后,整个交易策略执行完毕。在整个执行过程产生的所有交易委托被保存下来供超级图表模块显示或进行性能测试分析。
当交易策略应用在超级图表中时,您可以设置交易策略开平仓的显示风格以及颜色、线条等, 使之显示在超级图表中,如下图所示:
交易策略测试引擎为了真实准确的模拟交易策略在过去时段的表现,并能在实时数据更新时使交易策略沿着预定的方向发展,TradeBlazer公式提供了一个强大的交易策略测试引擎,该处理引擎收集交易策略在历史过程中产生的所有委托单,将其应用在对应的图表中,并能根据交易设置创建交易策略性能测试报表供客户参考。
交易策略测试引擎包括了两大功能:历史数据测试和实时自动交易。历史数据测试分析交易策略在历史过程中的交易动作并计算出交易盈亏,收益等性能指数。实时自动交易收集实时数据,并根据实时数据生成相应的交易动作,条件满足时,将委托单直接发送到交易券商。
""
还没有人打赏,支持一下

评论|共 6 个

latitude43

发表于 2013-9-11 06:21:50 | 显示全部楼层

不 明 觉 历

竹乐居士

发表于 2013-9-25 13:22:12 | 显示全部楼层

红红火火好红红火火红红火火好

mxlacrvd

发表于 2014-12-11 03:02:35 | 显示全部楼层

路过。。看下先。

lscyf

发表于 2014-12-14 01:16:06 | 显示全部楼层

[s:136]

ylmdfyfy

发表于 2014-12-14 01:51:20 | 显示全部楼层

赚钱,赚积分。顶....

meili

发表于 2014-12-25 13:09:42 | 显示全部楼层

[s:142]

您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则