资源预览内容
第1页 / 共61页
第2页 / 共61页
第3页 / 共61页
第4页 / 共61页
第5页 / 共61页
第6页 / 共61页
第7页 / 共61页
第8页 / 共61页
第9页 / 共61页
第10页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1TB编程基础和策略实现示例编程基础和策略实现示例蔡云华蔡云华深圳开拓者科技有限公司深圳开拓者科技有限公司内容安排内容安排TB 程序化交易的设置和使用(演示)TB 程序化交易编程基本知识TB 技术指标和交易策略编写示例2 TB公式如何使用?公式如何使用?TB公式类型用户函数公式应用(包括技术指标、交易指令等)如何使用一个交易模型? 或新建公式应用,粘贴代码,校验保存公式(编译) 打开超级图表,选择交易品种,插入公式应用 修改公式应用设置 投资组合性能测试和参数优化 启动自动策略交易系TB公式的导入导出3456 公式源代码公式源代码ParamsNumeric Length(10);Numeric Lots(1);VarsNumericSeries MA;BeginMA = AverageFC(Close,Length);PlotNumeric(MA,MA);If (Close1 MA1)Buy(Lots, Open);If (Close1 High1 比较今天的最高价是否突破了前两天的最高价 表达式为:High High1 and HighHigh2 或者:High High1 & HighHigh212 TB公式运行机制公式运行机制从左到右,从上到下 13 例例1:Hello WorldSample1:BeginFileAppend(c:tbsample1.txt,Hello World!);End 公式运行结果公式运行结果大家都知道每个Hello World!都是怎么产生的吗? 注释语句注释语句- CommentaryTB的信息输出,除了可以通过FileAppend输出到文件外,也可以将信息输出显示到图表上;Commentary的用法: 在超级图表的当前BAR添加一行注释信息; 参数:String strTip; / 提示的信息 信息输出函数的作用信息输出函数的作用调试和诊断TB公式的代码错误;检验TB公式的运行结果是否符合设计逻辑;学习TB的运行机制,熟悉TB内建函数的用法; 例例2:输出:输出BAR数据数据Sample2:BeginFileAppend(c:tbsample2.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,然后编译。下次想用别的周期,还得改,非常麻烦。如果使用参数,就方便多了。程序写好,使用时改参数就好了。代码如下:ParamsNumeric Length(10); BeginPlotNumeric(MA,AverageFC(Close,Length); End 数据类型数据类型TB公式中有三种基本的数据类型 数值型(Numeric)字符型(String)布尔型(Bool)为了对变量、参数进行回溯,又增加了序列类型 数值型序列变量/参数(NumericSeries)字符型序列变量/参数(StringSeries)布尔型序列变量/参数(BoolSeries)为了通过用户函数返回多个值,又增加了引用类型 NumericRef、StringRef、BoolRef变量(或参数)申明方法:数据类型 变量名或参数名 (初始值); 控制语句控制语句条件语句(If-Else) if 语句 if - else 语句 if - Else if 语句 if - Else 嵌套循环语句(ForWhile) For 循环变量 = 初始值 TO 结束值 For 循环变量 = 初始值 Downto 结束值 While 循环 条件语句条件语句-IF Else语句语句v语法如下:If (Condition) TB公式语句1; ElseTB公式语句2; v如果TB公式语句是单条,您可以省略,二条或者二条以上的语句必须使用。 25 技术指标输出函数技术指标输出函数 PlotNumeric 在当前BAR输出一个数值 参数:String Name - 输出值的名称; Numeric Number - 输出的数值; Numeric Locator=0 - 输出值的定位点; Integer Color=-1 - 输出值的颜色; Integer BarsBack=0 - 从当前BAR回溯的 BAR数举例:PlotNumeric(“MA”,AverageFC(Close,10); 输出均线指标值PlotNumeric (“OpenToClose”,open,close); 输出开盘价与收盘价的连线(线型选择柱状图)26 技术指标输出函数技术指标输出函数(2) PlotString 在当前BAR输出一个字符串 参数:String Name - 输出值的名称 String str - 输出的字符串; Numeric Locator=0 - 输出值的定位点; Integer Color=-1 - 输出值的颜色; Integer BarsBack=0 - 从当前BAR回溯的 BAR数举例:PlotString(CandleStick,阳线,Low,Red); 在Bar的最低价位置输出字符串“阳线”,并显示为红色27 技术指标输出函数技术指标输出函数(3) PlotBool 在当前BAR输出一个布尔值 参数:String Name - 输出值的名称 Bool bPlot - 输出的布尔值; Numeric Locator=0 - 输出值的定位点; Integer Color=-1 - 输出值的颜色; Integer BarsBack=0 - 从当前BAR回溯的 BAR数举例:PlotString(“con,con,High); 在Bar的最高价位置输出布尔变量con的值,如果con为真, 则显示“笑脸”图标,否则显示为“哭脸”图标28 例例3:技术指标的编写:技术指标的编写Sample3: 单均线加通道指标单均线加通道指标ParamsNumeric Length(10);/ 均线周期Numeric FilterPercent(20);/ 通道幅度比例(%)VarsNumericSeries MA;NumericSeries UpperBand;NumericSeries LowerBand;Bool ConBuy(False);Bool ConSell(False);BeginMA = AverageFC(Close,Length);UpperBand = MA * ( 1 + FilterPercent / 10000 );LowerBand = MA * ( 1 - FilterPercent / 10000 );29 PlotNumeric(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/Sell Buy - 平掉所有空头持仓,开多头仓位; sell - 平掉指定多头持仓; Sellshort - 平掉所有多头持仓,开空头仓位; Buytocover - 平掉指定空头持仓。 参数:Numeric Share 买入数量,默认=0时,使用系统设置参数Numeric Price 买入价格,为浮点数,默认=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(.) 34 盘中和盘后公式运行的差别盘中和盘后公式运行的差别盘后公式的执行情况分析 K线是确定的,不存在信号消失问题 公式在每根K线上只执行一遍 符合开仓条件和平仓条件会标出买卖信号(使用Buy、Sell指令),但并不真正发单盘中公式的执行情况分析K线是变化的,如用最新价或基于最新价计算出的指标来作为入场或出场条件会出现信号消失问题 每当分笔交易数据(tick)传来时,公式都会执行一遍 符合开仓条件和平仓条件除标出买卖信号,还会真正发单 信号消失问题信号消失问题(1)产生原因:使用变化的价格(如Close)或是基于最新价Close计算的技术指标,来作为交易的进场、出场或止损条件时,就会产生信号消失问题。如果编写的公式策略中存在信号闪烁问题,在历史测试中会得出失真的测试结果,在实盘交易时,更会因为重复发单造成严重损失。信号消失问题的一般解决办法:延迟发单或用前一根K线的数据来做为判断条件用能保持得住的价格来做为判断条件 信号消失问题信号消失问题(2)延迟发单举例:condition = 交易条件If (condition)Buy(1, NextOpen, true);用前一根K线做判断举例:condition = 交易条件If (condition1)Buy(1, Open);用High,Low,Open等做判断 If (HighHigh1) buy(1,High1); 例例4:单均线系统:单均线系统ParamsNumeric Length(10);Numeric Lots(1);VarsNumericSeries MA;BeginMA = AverageFC(Close,Length);PlotNumeric(MA,MA);If (MarketPosition 1 and Close1 MA1)Buy(Lots, Open);If (MarketPosition -1 and Close1 MA1)Buy(Lots, Open);If (MarketPosition!=-1 and Close1 = MyEntryPrice * (1 + TakeProfit * 0.01)MyExitPrice = MyEntryPrice * (1 + TakeProfit * 0.01);if (open MyExitPrice) MyExitPrice = Open;Sell(0,MyExitPrice);43 Else if ( Low MyEntryPrice-Stoploss * MinPoint)MyExitPrice = MyEntryPrice-Stoploss * MinPoint;if (Open MyExitPrice) MyExitPrice = Open;Sell(0,MyExitPrice); Else if (MarketPosition = -1)if (Low = MyEntryPrice * (1 - TakeProfit * 0.01)MyExitPrice = MyEntryPrice * (1 - TakeProfit * 0.01);if (open MyEntryPrice + Stoploss * MinPoint)MyExitPrice = MyEntryPrice + Stoploss * MinPoint;if (Open MyExitPrice) MyExitPrice = Open;BuyToCover(0,MyExitPrice);End 44 追踪止盈策略的实现追踪止盈策略的实现追踪止盈的设置也有多种方法,常见的有:峰值价回落固定点数峰值价回落一定的百分比峰值价的一定比例;平均波动范围的一定比例;开盘价的一定比例。是否盈利达到一定幅度才启用追踪止盈;动态的回落点数或比例。下面以峰值价回落一定比例为例,来实现它。45 追踪止盈的代码追踪止盈的代码(不包含进场部分)Params Numeric TrailingStop(1); / 跟踪止损百分比Vars Numeric MinPoint;Numeric MyExitPrice;NumericSeries HigherAfterEntry;NumericSeries LowerAfterEntry;Numeric StopLine(0);Beginif (BarsSinceEntry = 1)HigherAfterEntry = AvgEntryPrice;LowerAfterEntry = AvgEntryPrice; Else If(BarsSinceEntry 1)HigherAfterEntry = Max(HigherAfterEntry1,High1);LowerAfterEntry = Min(LowerAfterEntry1,Low1);46 ElseHigherAfterEntry = HigherAfterEntry1;LowerAfterEntry = LowerAfterEntry1;MinPoint = MinMove * PriceScale;If(MarketPosition=1)StopLine = HigherAfterEntry * (1 - TrailingStop * 0.01);If(Low = StopLine)MyExitPrice = StopLine - MinPoint ;If(Open = StopLine)MyExitPrice = StopLine + MinPoint;If(Open MyExitPrice) MyExitPrice = Open;BuyToCover(0,MyExitPrice);End 4748 应注意的问题应注意的问题如果单根K线的最高价和最低价相差很大,有可能出现止盈和止损同时满足的情况,解决办法:切换到更小的时间周期上进行交易;扩大止盈和止损的幅度在开仓BAR,因无法判断开仓价和最高价最低价的先后顺序,因此一般是在开仓BAR的后一根BAR才开始判断是否满足止盈止损或跟踪止盈的的条件。如交易策略需要及时的止损,同样需要切换到更小的时间周期上进行交易。 进场位置和盈利峰值价计算进场位置和盈利峰值价计算 开盘价开盘价最低价最低价追踪止损价追踪止损价盈利峰值价盈利峰值价止止损损没没被被止止损损 再进场策略的设计再进场策略的设计使用止损止盈或追踪止盈出场后,如果趋势没有改变,我们仍然需要再进场的策略以避免错失大的波段趋势;可以考虑的再入场的方法有:价格创出新高或新低,再次入场;出场后一定时间后,大趋势仍未改变则再次入场;出场后大趋势未改变,其他辅助指标出现和大趋势一致的进场信号时再次入场。下面以出场后一定时间后大趋势仍未改变即再次入场的方法来举例。50 跟踪止盈后,我们要设个标志,表示曾经出场过,因此要增加两个布尔型序列变量;BoolSeries bLongStoped(false);BoolSeries bShortStoped(false);跟踪止盈后,设置这两个变量; / 多头跟踪止盈后If(Low = StopLine ) BuyToCover(0,MyExitPrice);bShortStoped = true;51 这两个序列变量值必须往下传递(V4中可以免写)if (BarStatus 0)bLongStoped = bLongStoped1;bShortStoped = bShortStoped1;多头或空头初次进场和再次进场后,都要将这两个变量复位;bLongStoped = false;bShortStoped = false;为了配合再进场,我们需要记录当前的趋势方向。52 追踪止盈后的等待时间,我们可用止盈后的K线根数来衡量。因为我们止盈后bLongStoped或bShortStoped会被置为True,因此我们可通过一个函数NthCon来寻找跟踪止盈的那根BAR到现在的BAR数。具体止盈后多少根BAR后趋势还在持续再进场,我们可以设置为一个参数:BarsReEntry。多头再进场部分的代码如下BarsAfterLongExit = NthCon(!bLongStoped,1);Commentary(BarsAfterLongExit=+text(BarsAfterLongExit);If(bLongStoped and MarketPosition = 0 and condBuy1 = true and BarsAfterLongExit = BarsReEntry)Buy(Lots,Open);bLongStoped = False;HigherAfterEntry = Open;53 例例6:双均线系统:双均线系统加上跟踪止盈和再进场策略加上跟踪止盈和再进场策略Params Numeric Length1(10);Numeric Length2(20); Numeric Lots(1);Numeric TrailingStop(1); / 跟踪止损百分比跟踪止损百分比Numeric BarsReEntry(5);/ 出场后趋势维持多少根出场后趋势维持多少根Bar后再进场后再进场Vars NumericSeries MA1; NumericSeries MA2; BoolSeries condBuy(false);BoolSeries condSell(false);Numeric MinPoint;Numeric MyExitPrice;NumericSeries HigherAfterEntry;NumericSeries LowerAfterEntry;Numeric StopLine(0);BoolSeries bLongStoped(false);BoolSeries bShortStoped(false);Numeric BarsAfterLongExit(0);Numeric BarsAfterShortExit(0);Begin /*if (BarStatus 0) / V4中可以省略的序列变量传递部分中可以省略的序列变量传递部分bLongStoped = bLongStoped1;bShortStoped = bShortStoped1;*/Commentary(bLongStoped=+IIFString(bLongStoped,true,false);Commentary(bShortStoped=+IIFString(bShortStoped,true,false);if (BarsSinceEntry = 1)HigherAfterEntry = AvgEntryPrice;LowerAfterEntry = AvgEntryPrice; Else If(BarsSinceEntry 1)HigherAfterEntry = Max(HigherAfterEntry1,High1);LowerAfterEntry = Min(LowerAfterEntry1,Low1);ElseHigherAfterEntry = HigherAfterEntry1;LowerAfterEntry = LowerAfterEntry1; MA1 = AverageFC(Close,Length1); MA2 = AverageFC(Close,Length2); PlotNumeric(MA1,MA1);PlotNumeric(MA2,MA2);condBuy = CrossOver(MA1,MA2);condSell = CrossUnder(MA1,MA2);if ( condBuy = false and condSell = false )condBuy = condBuy1;condSell = condSell1;If ( MarketPosition 1 and condBuy1 = true and bLongStoped = false)Buy(Lots,Open);HigherAfterEntry = Open;bLongStoped = false;bShortStoped = false;If ( MarKetPosition -1 and condSell1 = true and bShortStoped = false)SellShort(lots,Open); LowerAfterEntry = Open;bLongStoped = false;bShortStoped = false; BarsAfterLongExit = NthCon(!bLongStoped,1);Commentary(BarsAfterLongExit=+text(BarsAfterLongExit);If(bLongStoped and MarketPosition = 0 and condBuy1 = true and BarsAfterLongExit = BarsReEntry)Buy(Lots,Open);bLongStoped = False;HigherAfterEntry = Open;Return;BarsAfterShortExit = NthCon(!bShortStoped,1);Commentary(BarsAfterShortExit=+text(BarsAfterShortExit);If(bShortStoped and MarketPosition = 0 and condSell1 = true and BarsAfterShortExit = BarsReEntry)SellShort(Lots,Open);bShortStoped = False;LowerAfterEntry = Open;Return; MinPoint = MinMove * PriceScale;If(MarketPosition=1)StopLine = HigherAfterEntry * (1 - TrailingStop * 0.01);If(Low = StopLine)MyExitPrice = StopLine - MinPoint;If(Open = StopLine)MyExitPrice = StopLine + MinPoint;If(Open MyExitPrice) MyExitPrice = Open;BuyToCover(0,MyExitPrice);bShortStoped = true;End 更多的优化更多的优化参数优化-交易策略参数优化功能为防止过度优化及处理优化值处于边界值的问题,将参数取连续数值,观察赢利区域。若最优化结果处于连续赢利数值区域,便认为该最优化参数是合适的参数。若最优化结果离散于连续赢利数值区域或为临界值,则考虑在连续区域取最优值。 TB的学习资源和方法的学习资源和方法系统自带的交易指令范例TB公式开发指南TB的系统交易论坛TB的帮助文件(F1帮助)最好的学习方法就是动手实验。谢谢大家!谢谢大家!u公司网站:u新浪微博:u总部客服: 0755-83410021u上海办事处:u我的手机:61
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号