TB公式入门Bar数据:公式在进行计算时,都是建立在基本数据源(Bar数据)之上,我们这里所谓的Bar数据,是指商品在不同周期下形成的序列数据,在单独的每个Bar上面包含开盘价、收盘价、最高价、最低价、成交量及时间。期货等品种还有持仓量等数据。所有的Bar按照不同周期组合,并按照时间从先到后进行排列,由此形成为序列数据,整个序列称之为Bar数据。公式如何执行:TradeBlazer公式在计算时按照Bar数据的Bar数目,从第一个Bar到最后一个Bar,依次进行计算,如果公式中出现了调用Bar数据函数的,则取出当前Bar的相应值,进行运算。公式执行从上至下,Bar从左到右执行。交易开拓者公式基础公式执行顺序公式执行顺序TradeBlazer公式的HelloWorld!(c:\\Formula.log,helloworld);End公式的种类指标K线形态特征走势交易指令函数公式环境的组织层次(1)BAR数据指标K线形态特征走势交易指令公式环境的组织层次(2)BAR数据指标K线形态特征走势交易指令函数建立一个最简单的指标:画零线BeginPlotNumeric(“Line1”,0);EndBegin和End宣告公式正文的开始和结束,公式语句应该放到Begin和End之间。PlotNumeric表示输出一个数值型组成的数组。技术指标属性的设置再画一条线…BeginPlotNumeric(“Line1”,5);End参数一根线ParamsNumericLength(0);BeginPlotNumeric(“Line1”,length);EndN根线ParamsNumericLength1(0);NumericLength2(5);BeginPlotNumeric(“Line1”,length1);PlotNumeric(“Line2”,length2);End取较大值ParamsNumericLength1(0);NumericLength2(5);Beginif(Length1=Length2){PlotNumeric(“Line1”,length1);}else{PlotNumeric(“Line1”,length1);}EndPlotNumeric由输出的名字来区分是否为同一条线。关于IF语句If语句是一个条件语句,当特定的条件满足后执行一部分操作。语法如下:If(Condition){TradeBlazer公式语句;}TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。关于条件表达式逻辑操作符:AND(&&),OR(||),NOT(!)表达式1AND表达式2表达式1OR表达式2NOT表达式1注意:浮点数字的等于详细介绍参见帮助文件-公式系统-操作符注意:条件表达式括号后面不要加分号。IF-ElseIf-Else语句是对指定条件进行判断,如果条件满足执行If后的语句。否则执行Else后面的语句。语法如下:If(Condition){TradeBlazer公式语句1;}Else{TradeBlazer公式语句2;}If-Else-IfIf-Else-If是在If-Else的基础上进行扩展,支持条件的多重分支。语法如下:If(Condition1){TradeBlazer公式语句1;}ElseIf(Condition2){TradeBlazer公式语句2;}Else{TradeBlazer公式语句3;}If-Else-If的语句可以根据需要一直扩展,在最后的Else之后再加If(Condition)和新的执行代码即可。当然您也可以省略最后的Else分支,If-Else的嵌套If-Else的嵌套是在If-Else的执行语句中包含新的条件语句,即一个条件被包含在另一个条件中。If(Condition1){If(Condition2){TradeBlazer公式语句1;}Else{TradeBlazer公式语句2;}}Else{If(Condition3){TradeBlazer公式语句3;}Else{TradeBlazer公式语句4;}}回到指标赋值语句用变量使流程清晰ParamsNumericLength1(0);NumericLength2(5);VarsNumericbiger;Beginif(Length1=Length2){biger=Length1;}else{biger=Length2;}PlotNumeric(“Line1”,biger);End公式的三段论函数(1)用函数使流程更加简洁ParamsNumericLength1(0);NumericLength2(5);VarsNumericbiger;Beginbiger=GetBiger(Length1,Length2);PlotNumeric(“Line1”,biger);End函数(1)GetBiger的内容Return语句ParamsNumericLength1(0);NumericLength2(5);Beginif(Length1=Length2){returnLength1;}else{returnLength2;}End指标模板Params…………………..VarsNumericline1;Numericline2;…………………..Beginline1=GetLine1(…….);line2=GetLine2(…….);……………………PlotNumeric(“Line1”,line1);PlotNumeric(“Line2”,line2);…………………..End参考MA指标的模板写法函数(2)假设要写这样一个指标:两个数字型参数,比较其大小,并输出两条线ParamsNumericLength1(0);NumericLength2(5);VarsNumericbiger;Numericsmaller;Beginbiger=GetBiger(Length1,Length2);smaller=GetSmaller(Length1,Length2);PlotNumeric(“bigger”,biger);PlotNumeric(“smaller”,smaller);End然而……函数(2)引用型参数函数compare的内容ParamsNumericparam1(0);Numericparam2(5);NumericRefsamller;Beginif(param1=param2){smaller=param2;returnparam1;}else{smaller=param1;returnLength2;}End函数(2)调用compareParamsNumericparam1(0);Numericparam2(5);VarsNumericbiger;Numericsmaller;Beginbiger=compare(param1,param2,smaller);PlotNumeric(“bigger”,biger);PlotNumeric(“smaller”,smaller);End一个新需求用函数计算最近三根BAR的最低点Beginif(low=low[1]&&low=low[2]){returnlow;}if(low[1]=low&&low[1]=low[2]){returnlow[1];}if(low[2]=low&&low[2]=low[1]){returnlow[2];}End一个新需求(另一种写法:冒泡)Varsnumericsmallest(999999);//初始值很重要!Beginif(low[2]samllest){smallest=low[2];}if(low[1]samllest){smallest=low[1];}if(lowsamllest){smallest=low;}returnsmallest;End最近N个BAR的最低值(循环语句)ParamsnumericLength(5);Varsnumericsmallest(999999);//初始值很重要!numerici;Beginfori=1toLength-1{if(low[i]=smallest){smallest=low[i];}}returnsmallest;End最近N个BAR的最低值ParamsnumericLength(5);Varsnumericsmallest(999999);//初始值很重要!numerici;Beginif(CurrentBarLength-1){returnInvalidNumeric;}fori=1toLength-1{if(low[i]=smallest){smallest=low[i];}}returnsmallest;End数据回溯如何使用回溯表达?XXX[nOffset]nOffset是要回溯引用的Bar相对于当前Bar的偏移值,该值必须大于等于0,当nOffset=0时,即为获取当前Bar的参数值。并且nOffset不能大于当时的CurrentBar,这样会导致数据访问越界。造成不可预知的计算结果。变量回溯,参数回溯,函数回溯(系统函数)序列参数ParamsnumericSeriesPrice(1);numericLength(5);Varsnumericsmallest(999999);//初始值很重要!numerici;Beginif(CurrentBarLength-1){returnInvalidNumeric;}fori=1toLength-1{if(Price[i]=smallest){smallest=Price[i];}}returnsmallest;End没完没了的新需求得到最低值与最低值的位置没完没了的新需求ParamsnumericSeriesPrice(1);numericRefPosition;VarsnumericSeriessmallest(999999);numericSeriesi;Beginif(CurrentBar==0){smallest=Price;I=0;Position=i;returnsmallest;}else{smallest=smallest[1];I=i[1];}if(price=smallest){samllest=price;I=currentBar;}returnsmallest;End关于常量和变量的定义常量是用来代替一个数或字符串的名称。在公式整个执行过程中不发生改变。变量是一个存储值的地址,当变量被声明之后,就可以在脚本中使用变量,可以对其赋值,也可以在其他地方引用变量的值进行计算,要对变量进行操作,直接使用变量名称即可。变量的主要用处在于它可以存放计算或比较的结果,以方便在之后的脚本中直接引用运算的值,而无需重现计算过程。关于变量的类型TradeBlazer公式支持有三种基本数据类型:数值型(Numeric)、字符串(String)、布尔型(Bool)。为了通过用户函数返回多个值,我们对三种数据类型进行了扩展,增加了引用数据类型。另外,为了对变量,参数进行回溯,我们增加了序列数据类型。因此,我们的数据类型共有九种9种数据类型Bool布尔型。BoolRef布尔型引用。BoolSeries和周期长度一致的Bool型序列值。Numeric数值型。NumericRef数值型引用。NumericSeries和周期长度一致的Numeric型序列值。String字符串。StringRef字符串引用。StringS