1、TB编程基础知识,刘海燕,Bar数据:公式在进行计算时,都是建立在基本数据源(Bar数据)之上。,TB基础知识,数据源,Data0-Data49个数据源的Bar数据 Data0:原图表bar数据 Data1:第二个数据源 Data2:第二个数据源 调用方法:Data0.A_SendOrder()Data1.Close等等,公式执行顺序,公式执行从上至下,Bar从左到右执行。,TB公式能做什么?,技术指标图表模块中输出为线条、柱状图、点等表现形式(PlotNumeric、PlotBool、PlotString) K线形态主要着重于反映一段K线的特定型态,并通过不同的技术指标的方式输出到图表(Pl
2、otBar) 特征走势主要着重于反映整个价格曲线的趋势、变化特征,并通过特定的表达方式输出到图表(通过PlotBar返回数据)交易指令交易指令是包含买、卖、平仓,头寸,仓位控制的并执行交易指令的一类公式(buysellsellshortbuytocover,A_SendOrder),公式环境的组织层次(1),公式环境的组织层次(2),BAR数据,指标,K线形态,特征走势,交易指令,用户函数,尝试:输出指定信息到文件HelloWorld!Begin FileAppend(“c:Formula.txt“,“hello world“); End,系统函数分类,数学函数Abs 字符串函数Text 颜色
3、函数 时间函数Time、CurrentTime 数据函数barcount、high 属性函数BarType、MinMove最小变动量 行情函数 Q函数 帐户函数A函数 枚举函数Enum_Buy 交易函数EntryPrice、EntryPrice 其他函数,PlotNumeric在当前Bar输出一个数值。Numeric PlotNumeric(String Name,Numeric Number,Integer Color=-1,Integer BarsBack=0) PlotString在当前Bar输出一个字符串。String PlotString(String Name,String str
4、,Integer Color=-1,Integer BarsBack=0) PlotBar在当前Bar输出两个值,用于在图表中当前Bar上画出连接两个值的线条。PlotBar(String Name,Numeric Value1,Numeric Value2,Integer Color=-1,Integer BarsBack=0) PlotBool在当前Bar输出一个布尔值。Bool PlotBool(String Name,Bool bPlot,Integer Color=-1,Integer BarsBack=0),尝试一个简单的技术指标,BeginPlotNumeric(“Line1”,
5、0); EndPlotNumeric函数:输出一个数值型组成的数组。,PlotBool,BeginPlotNumeric(“A1“,Close,Yellow,1);PlotBool(“A2“,CloseOpen); End,火车轨的实现,公式结构,9种数据类型,Bool布尔型。 BoolRef布尔型引用。 BoolSeries和周期长度一致的Bool型序列值。 Numeric数值型。 NumericRef数值型引用。 NumericSeries和周期长度一致的Numeric型序列值。 String字符串。 StringRef字符串引用。 StringSeries和周期长度一致的String型序
6、列值。,参数、变量的声明,声明参数、变量 Params(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。系统自动赋值规则:数值型变量的默认值为0;布尔型变量的默认值为
7、False;字符串的默认值为空字符串。,编写函数,一个函数由三部分组成,参数定义,变量定义,脚本正文。 语法如下: Params参数定义语句; Vars 变量定义语句; Begin 脚本正文; End,序列变量,通过“变量名nOffset“来回溯以前的变量值 Ref(close,1)等于Close1,Close1,Close5,一个序列公式-计算天数,VarsNumericSeries daynum; BeginIF(CurrentBar = 0)daynum = 1;else If(date!=date1)daynum=daynum1+1;Elsedaynum=daynum1;PlotNum
8、eric(“daynum“,daynum); End,引用参数,用户函数可以通过引用参数返回函数的计算结果。返回多个计算结果。,用户函数MyFuncParams NumericSeries Price(0); NumericRef mHigher(0); NumericRef mLower(0); Vars Numeric Tmp(0); Begin Tmp = Average(Price,10);mHigher = IIf(Tmp High,Tmp,High); mLower = IIf(Tmp Low,Tmp,Low); Return Tmp; End,交易函数MyTradeVars Nu
9、meric AvgValue; Numeric HigherValue; Numeric LowerValue; Begin AvgValue = MyFunc(Close,HigherValue,LowerValue); . End,交易指令,普通交易指令Buy开多、Sell平多、SellShort开空、BuyToCover平空 A函数A_SendOrder发委托指令 二者区别 普通交易指令在图表上出信号,与图表关联,不与账户关联. A_sendorder与账户关联,交易不在图表上产生信号,只对实时行情操作.,普通交易指令,Buy:平掉所有空头持仓,开多头仓位。 Sell:平掉指定的多头持仓
10、。 SellShort:平掉所有多头持仓,开空头仓位。 BuyToCover:平掉指定的空头持仓。Bool Buy(Numeric Share=0,Numeric Price=0,Bool Delay=False) Share 买入数量,为整型值,默认为使用系统设置参数; Price 买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close); Delay 买入动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。,普通交易指令信号,信号消失,基于前面的描述,如果用Close变化的数据来计算开平仓条件,就可能出现信号消失。 为了解决信号消失,可以使用前面
11、所讲的Delay,或者使用另外一种方式,特别是我们经常用的突破系统。 使用High,Low,Open这样能够保持住的价格来进行条件判断。是价格往上的突破形成的交易操作用High来判断。是价格下上的突破形成的交易操作用Low来判断。其他不确定方向的情况最好用Open来判断。,A函数和Q函数,Q函数,指以Q_开头的系统函数,主要是获取实时行情信息。 A函数,指以A_开头的系统函数,获取自动交易关联帐户的帐户信息,只有在启动自动交易的情况下才能取值。Q函数和A函数都是反映最新的实时状态,不能取历史上的值,所以只能在当前有效,在公式中表现为只能在最后Bar上取值。,全局变量,每个超级图表有50个全局变
12、量049 Bool SetGlobalVar(Integer nIndex,Numeric fVal) Numeric GetGlobalVar(Integer nIndex)经常用于配合A_SendOrder使用,控制发单。,全局变量:例子,If(A_SellPosition=0 ,下面介绍几个常用函数以及语法,CrossOver、CrossUnder 函数原型: Bool CrossOver(NumericSeries Price1,NumericSeries Price2)CrossOver(Close, AvgPrice);,上穿、下穿函数,Cross的应用,延迟有两种, 1.判断前一
13、个条件,在当前bar开仓 cond1=ma11; cond2=ma21; if(crossover(cond1,cond2) buy(1,open); 2.判断当前条件,在下一个bar开仓 if(crossover(ma1,ma2) buy(1,nextopen,true);,Cross防止信号消失,使用High,Low,Open这样能够保持住的价格来进行条件判断。是价格往上的突破形成的交易操作用High来判断。是价格下上的突破形成的交易操作用Low来判断。其他不确定方向的情况最好用Open来判断。 CrossOver(high, AvgPrice);,关于调试语句,Commentry 在超级
14、图表当前Bar添加一行注释信息。 例子:Commentary(“开仓价格:“+Text(myEntryPrice)。 FileAppend 在指定文件中追加一行字符串。 FileAppend(“C:Formula.txt“,“Close = “+Text(Close); Alert(String AlertInfo)产生一个报警动作。,控制语句,条件语句(If-Else) 循环语句(ForWhile),关系运算符,If(12)语句1;If(1 != 2)语句1; 相当于: If(1 2)语句1;,If(左表达式 关系运算符 右表达式),算术运算符,If(10%5=0)我是语句1;If(21%5
15、=1)我是语句2;,关于条件表达式,逻辑操作符 :AND(&),OR(|),NOT(!) 表达式1 AND 表达式2 (表达式1 & 表达式2 ) 表达式1 OR 表达式2 (表达式1 | 表达式2 ) NOT表达式1 (! 表达式1 )注意:条件表达式括号后面不要加分号。,IF语句,语法如下: If (Condition) TradeBlazer公式语句; 如果TradeBlazer公式语句是单条,您可以省略,二条或者二条以上的语句必须使用。,IF-Else,语法如下: If (Condition) TradeBlazer公式语句1; Else TradeBlazer公式语句2; ,If-E
16、lse-If,语法如下: If (Condition1) TradeBlazer公式语句1; Else If(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; El
17、se TradeBlazer公式语句2; Else If (Condition3) TradeBlazer公式语句3; Else TradeBlazer公式语句4; ,If-Else例子,If (Open High1) If (CloseOpen) Buy(1,close); Else Buy(1,open); Else If (Close Open) Sell(1,close); Else Sell (1,open); ,IIF,Numeric IIF(Bool Conditon,Numeric TrueValue,Numeric FalseValue)Conditon 条件表达式; Tru
18、eValue 条件为True时的返回值; FalseValue 条件为False时的返回值。myValue=IIF(CloseOpen,Close,Open);,For语句,For语句是一个循环语句,重复执行某项操作,直到循环结束。 语法如下: For 循环变量 = 初始值 To 结束值 TradeBlazer公式语句; For循环的执行是从循环变量从初始值到结束值,按照步长为1递增,依次执行TradeBlazer公式语句,结束值必须大于或等于初始值才有意义。,For语句2,如果希望For语句从大到小进行循环,可以使用以下的语法: For 循环变量 = 初始值 DownTo 结束值 Trade
19、Blazer公式语句; For-DownTo让循环变量从结束值每次递减1直到等于结束值,依次调用TradeBlazer公式语句执行,初始值必须大于或等于结束值才有意义。,For语句例子,以下的用户计算Price最近Length周期的和。 ParamsNumericSeries Price(1);Numeric Length(10); VarsNumeric SumValue(0);Numeric i; Beginfor i = 0 to Length - 1SumValue = SumValue + Pricei;Return SumValue; End,While循环,While语句在条件为
20、真的时候重复执行某一项操作。即,只要条件表达式的值为真(True)时,就重复执行某个动作。直到行情信息改变以致条件为假 (False)时,循环才结束。语法如下: While (Condition)TradeBlazer公式语句; ,死循环,使用While循环的时候,有可能会遇到循环一直执行,永远不能退出的情况,这种情况我们称之为死循环。While (True) TradeBlazer公式语句; ,ContinueWhile (Condition1) TradeBlazer公式语句1; If (Condition2) Continue; TradeBlazer公式语句2; 当Condition2
21、为 True,将跳过TradeBlazer公式语句2,重新判断Condition1的值,进入下一次循环。否则将继续执行TradeBlazer公式语句 2。,BreakWhile (True) TradeBlazer公式语句; If (Condition) Break; 循环在每次执行后,都将判断Condition的值,当Condition为True时,则执行Break语句,跳出整个循环。,TB运行机制介绍,1、TB程序加载时刻,程序在历史数据上从左至右每根Bar运行一次 。 2、历史数据运行完毕,如果接收到新tick数据,则每个tick会驱动程序在最后一根Bar上运行一次。 3、K线切换时,会用上一个tick在上一个Bar先运行一次 。 4、在V3系列版本中,一个图表上所有的策略共享一套MarketPosition等变量。 5、一般策略应尽量使用交易指令的图表函数,特殊需要时才使用A_系列函数。,编程介绍,公式基础 1Bar数据 2. 叠加数据 3TB公式执行的逻辑顺序 4. 数据类型 5. 基础编程语句 (1)赋值语句 (2)条件语句:If-Else (3)循环语句:For和While 6. 使用注释,编程介绍,TB公式三大部分新建交易指令 新建技术指标 新建用户函数 详细阅读帮助文档中公式系统,案例分析,案例分析,常用函数,