1TB编程基础和策略实现示例深圳开拓者科技有限公司内容安排TB程序化交易的设置和使用(演示)TB程序化交易编程基本知识TB技术指标和交易策略编写示例2TB公式如何使用?TB公式类型用户函数公式应用(包括技术指标、交易指令等)如何使用一个交易模型?或新建公式应用,粘贴代码,校验保存公式(编译)打开超级图表,选择交易品种,插入公式应用修改公式应用设置投资组合性能测试和参数优化启动自动策略交易系TB公式的导入导出3456公式源代码ParamsNumericLength(10);NumericLots(1);VarsNumericSeriesMA;BeginMA=AverageFC(Close,Length);PlotNumeric(MA,MA);If(Close[1]MA[1]){Buy(Lots,Open);}If(Close[1]MA[1]){SellShort(Lots,Open);}EndTB公式的结构TB的公式一般由三段组成。ParamsNumericLength(10);公式参数段……VarsNumericSeriesMA;公式变量段……BeginMA=AverageFC(Close,Length);公式脚本段……End8Bar数据(K线数据)当前时间周期下所有K线的相关数据,按照时间从先到后的顺序排列而成的序列数据。每根K线中包含的数据如下:9Bar数据含义Date当前K线的日期Time当前K线的开始时间Open当前K线的开盘价High当前K线的最高价Low当前K线的最低价Close当前K线的收盘价(最新价)Vol当前K线成交量OpenInt当前K线持仓量CurrentBar当前K线的索引值(K线的编号,从0开始)BarStatus当前K线的状态值(0—第一根K线、2—最后即最新一根K线、1—其他K线)序列数据10序列变量序列变量序列变量序列变量序列变量序列变量序列变量序列变量序列变量序列变量序列变量序列变量NN-1…………………210非序列变量(简单变量)11非序列变量Bar数据的使用Bar数据是TB公式运行的基础。Bar数据是序列数据,可以回溯读取。举例:比较今天的最高价是否突破了昨天的最高价表达式为:HighHigh[1]比较今天的最高价是否突破了前两天的最高价表达式为:HighHigh[1]andHighHigh[2]或者:HighHigh[1]&&HighHigh[2]12TB公式运行机制从左到右,从上到下13例1:HelloWorldSample1:BeginFileAppend(c:\\tb\\sample1.txt,HelloWorld!);End公式运行结果大家都知道每个HelloWorld!都是怎么产生的吗?注释语句--CommentaryTB的信息输出,除了可以通过FileAppend输出到文件外,也可以将信息输出显示到图表上;Commentary的用法:在超级图表的当前BAR添加一行注释信息;参数:StringstrTip;//提示的信息信息输出函数的作用调试和诊断TB公式的代码错误;检验TB公式的运行结果是否符合设计逻辑;学习TB的运行机制,熟悉TB内建函数的用法;例2:输出BAR数据Sample2:BeginFileAppend(c:\\tb\\sample2.txt,Date=+text(Date)+Time=+text(time)+Open=+Text(Open)+High=+Text(High)+Low=+Text(Low)+Close=+Text(Close)+CurrentBar=+Text(CurrentBar)+Barstatus=+Text(BarStatus));End例2运行结果参数与变量简单地说,参数和变量都是代号,代表一个某一类型的数据,变量还可以代表一个表达式的运算结果;参数的作用是给用户一个不需修改代码即可改变公式运行结果的一个外部接口;参数的值在公式的内部不能够被修改;变量的作用是保存数据或是计算结果,便于以后调用;参数和变量都需要声明。参数的作用假如我们要写一个均线指标,现在是用10天做周期。代码如下:BeginPlotNumeric(MA,AverageFC(Close,10));End那如果要改用20天做周期,我们必须改程序,把10改成20,然后编译。下次想用别的周期,还得改,非常麻烦。如果使用参数,就方便多了。程序写好,使用时改参数就好了。代码如下:ParamsNumericLength(10);BeginPlotNumeric(MA,AverageFC(Close,Length));End数据类型TB公式中有三种基本的数据类型数值型(Numeric)字符型(String)布尔型(Bool)为了对变量、参数进行回溯,又增加了序列类型数值型序列变量/参数(NumericSeries)字符型序列变量/参数(StringSeries)布尔型序列变量/参数(BoolSeries)为了通过用户函数返回多个值,又增加了引用类型NumericRef、StringRef、BoolRef变量(或参数)申明方法:数据类型变量名或参数名(初始值);控制语句条件语句(If-Else)if语句if-else语句if-Elseif语句if-Else嵌套循环语句(For\While)For循环变量=初始值TO结束值For循环变量=初始值Downto结束值While循环条件语句----IFElse语句语法如下:If(Condition){TB公式语句1;}Else{TB公式语句2;}如果TB公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。25技术指标输出函数PlotNumeric–在当前BAR输出一个数值参数:StringName-----输出值的名称;NumericNumber-----输出的数值;NumericLocator=0-----输出值的定位点;IntegerColor=-1-----输出值的颜色;IntegerBarsBack=0-----从当前BAR回溯的BAR数举例:PlotNumeric(“MA”,AverageFC(Close,10));输出均线指标值PlotNumeric(“OpenToClose”,open,close);输出开盘价与收盘价的连线(线型选择柱状图)26技术指标输出函数(2)PlotString–在当前BAR输出一个字符串参数:StringName-----输出值的名称Stringstr-----输出的字符串;NumericLocator=0-----输出值的定位点;IntegerColor=-1-----输出值的颜色;IntegerBarsBack=0-----从当前BAR回溯的BAR数举例:PlotString(CandleStick,阳线,Low,Red);在Bar的最低价位置输出字符串“阳线”,并显示为红色27技术指标输出函数(3)PlotBool–在当前BAR输出一个布尔值参数:StringName-----输出值的名称BoolbPlot-----输出的布尔值;NumericLocator=0-----输出值的定位点;IntegerColor=-1-----输出值的颜色;IntegerBarsBack=0-----从当前BAR回溯的BAR数举例:PlotString(“con,con,High);在Bar的最高价位置输出布尔变量con的值,如果con为真,则显示“笑脸”图标,否则显示为“哭脸”图标28例3:技术指标的编写Sample3:单均线加通道指标ParamsNumericLength(10);//均线周期NumericFilterPercent(20);//通道幅度比例(%%)VarsNumericSeriesMA;NumericSeriesUpperBand;NumericSeriesLowerBand;BoolConBuy(False);BoolConSell(False);BeginMA=AverageFC(Close,Length);UpperBand=MA*(1+FilterPercent/10000);LowerBand=MA*(1-FilterPercent/10000);29PlotNumeric(MA,MA,0,Yellow);PlotNumeric(UpperBand,UpperBand,0,Red);PlotNumeric(LowerBand,LowerBand,0,Green);ConBuy=CrossOver(Close,UpperBand);ConSell=CrossUnder(Close,LowerBand);if(ConBuy){PlotBool(ConBuy,ConBuy,High+(High-Low)*0.3);PlotString(BS,多头突破,High+(High-Low)*0.6,red);}if(ConSell){PlotBool(ConSell,!ConSell,Low-(High-Low)*0.3);PlotString(SS,空头突破,Low-(High-Low)*0.6,Green);}End30指标编写常见问题指标编写完成后,还要注意在属性设置中进行相应的设置;指标是在主图显示还是在子图显示;指标的线型;从V3转到V4的客户注意参数的位置另外学习的例子可以参考:MACD指标的写法(柱状图)SAR指标(点图)31运行结果32交易指令–Buy/SellBuy--平掉所有空头持仓,开多头仓位;sell--平掉指定多头持仓;Sellshort--平掉所有多头持仓,开空头仓位;Buytocover--平掉指定空头持仓。参数:NumericShare买入数量,默认=0时,使用系统设置参数NumericPrice买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close)。33交易指令A_SendOrder针对当前公式应用的帐户、商品发送委托单。该函数直接发单,不经过任何确认,并会在每次公式计算时发送,一般需要配合着仓位头寸进行条件处理,在不清楚运行机制的情况下慎用。不能使用于历史测试,仅适用于实时行情交易。参数:BuyOrSell:买卖类型,买Enum_Buy/卖Enum_Sell;EntryOrExit:开平仓类型,开仓Enum_Entry/平仓Enum_Exit/平今Enum_ExitToday;fLot委托单的交易数量;fPrice委托单的交易价格。叠加多个商品合约进行交易TB可以在一个图表中插入多个商品合约,支持同时对多个商品合约数据源编写公式应用。具体的方法是在交易指令、BAR数据及系统函数前加上数据源。TB中数据源的命名规则如下:Data0:图表中最开始选择的商品合约Data1:第一个插入的商品合约Data2:第二个插入的商品合约……一个图表最多支持50个数据源;调用方法:Data1.A_SendOrder(…)Data2.Buy(….)Data3.CloseData4.MarketPosition34盘中和盘后公式运行的差别盘后公式的执行情况分析K线是确定的,不存在信号消失问题公式在每根K线上只执行一遍符合开仓条件和平仓条件会标出买卖信号(使用Buy、Sell指令),但并不真正发单盘中公式的执行情况分析K线是变化的,如用最新价或基于最新价计算出的指标来作为入场或出场条件会出现信号消失问题每当分笔交易数据(tick)传来时,公式都会执行一遍符合开仓条件和平仓条件除标出买卖信号,还会真正发单信号消失问题(1)产生原因:使用变化的价格(如Close)或是基于最新价Close计算的技术指标,来作为交易的进场、出场或止损条件时,就会产生信号消失问题。如果编写的公式策略中存在信号闪烁问题,在历史测试中会得出失真的测试结果,在实盘交易时,更会因为