开拓者程序化交易TB公式高级应用.ppt

上传人:xt****7 文档编号:2839356 上传时间:2019-12-01 格式:PPT 页数:58 大小:388.50KB
返回 下载 相关 举报
开拓者程序化交易TB公式高级应用.ppt_第1页
第1页 / 共58页
开拓者程序化交易TB公式高级应用.ppt_第2页
第2页 / 共58页
开拓者程序化交易TB公式高级应用.ppt_第3页
第3页 / 共58页
点击查看更多>>
资源描述
TB公式高级应用,黄柳,深圳市拓瑞邦泽科技有限公司,第一部分,持仓交易系统的分析和实现,持仓交易系统的设计要素,设计思路:趋势跟踪; 设计原则:不能错过主要趋势; 设计细节:减少盘整时的连续亏损和最大资金回撤。 总结: Cut loss short, let profit run 截短亏损,让利润奔跑!,常见的持仓交易系统,高低点突破系统(四周法则) 双均线系统(DualMA) 波动性突破系统(ATR) 布林通道突破系统(BOLL) 抛物线转向系统(SAR) 顾比倒数线系统(CBL),Keltner Channel System,基于Keltner Channel(肯特纳通道)的持仓交易系统。 由价格均线和ATR形成通道,当价格突破通道产生入场讯号。,Keltner Channel原理,肯特纳通道(KC)是一个移动平均通道,由三条线组合而成(上轨、中线及下轨),若价格突破边界,即表示出现开仓机会。 肯特纳通道是基于平均真实波幅原理而形成的指标,对价格波动反应灵敏,基于KC的系统可以实时开仓,不需要等待下一个Bar。,Keltner Channel算法,中线 = Typical Price 的 N 周期平均值; Typical Price =(High+Low+Close)/3; 上轨 = 中线 + 通道; 通道 = NumATRs * 平均真实波幅。,Keltner Channel指标,Params Numeric Length(20); Numeric NumATRs(1); Vars NumericSeries TPrice; Numeric AvgValue; Numeric ShiftValue; Numeric UpperBand; Numeric LowerBand; Begin TPrice = (High+Low+Close)/3; AvgValue = AverageFC(TPrice,Length); ShiftValue = NumATRs*AvgTrueRange(Length); UpperBand = AvgValue + ShiftValue; LowerBand = AvgValue - ShiftValue; PlotNumeric(“UpperBand“,UpperBand); PlotNumeric(“LowerBand“,LowerBand); PlotNumeric(“MidLine“,AvgValue); End,KCS 版本1(1),Params Numeric Length(20); Numeric NumATRs(1); Vars NumericSeries TPrice; Numeric AvgValue; NumericSeries ShiftValue; Numeric UpperBand; Numeric LowerBand; Numeric MyPrice; Begin TPrice = (High1+Low1+Close1)/3; AvgValue = AverageFC(TPrice,Length); ShiftValue = NumATRs*AvgTrueRange(Length); UpperBand = AvgValue + ShiftValue1; LowerBand = AvgValue - ShiftValue1;,KCS版本1(2),If(MarketPosition!=1 End,KCS_V1测试结果汇总,KCS_V2(1),KeltnerChannel的指标发明人是Chester Keltner,最初的版本中线和ATR的参数都是20,即我们现在看到的版本。 KC指标由琳达-拉什克(Linda Raschke)再度优化改进,她采用10周期ATR值计算上下轨. 因此我们将ATR的参数和MidLine的参数分开;,KCS_V2(2),增加参数ATRLength。 ShiftValue = NumATRs*AvgTrueRange(ATRLength); 通过橡胶指数的测试我们发现,净利润减少2615,但最大资金回撤也减少了1760。风险降低的比例明显大于收益减少的比例,所以这样的调整是有意义的。,KCS_V3(1),以橡胶测试结果为例,从报表中我们看到,最大回撤发生的日期是2006/7/18,我们仔细查看交易记录和讯号,可以看到最大的资金回撤是由于一次盈利平仓过慢,以及两次假突破导致。 因此我们有必要增加一个跟踪止损的设置。 我们选择固定点数跟踪止损(吊灯止损)。,KCS_V3(2),KCS_V3(3),增加参数TrailingStop,默认值设为400; 增加变量MinPoint,用来保存最小变动单位。 MinPoint = MinMove*PriceScale; 增加序列变量HigherAfterEntry,LowerAfterEntry用来保存开仓后的最高价或最低价。 为了避免在一个较长Bar上出现错误的止损信号,我们在计算时不考虑当前Bar的最大盈利。,KCS_V3(4),If(BarsSinceEntry = 1) HigherAfterEntry = AvgEntryPrice; LowerAfterEntry = HigherAfterEntry; Else If(BarsSinceEntry 1) HigherAfterEntry = Max(HigherAfterEntry1,High1); LowerAfterEntry = Min(LowerAfterEntry1,Low1); Commentary(“HigherAfterEntry=“+Text(HigherAfterEntry); Commentary(“LowerAfterEntry=“+Text(LowerAfterEntry);,KCS_V3(5),If(MarketPosition=1) If(Low = LowerAfterEntry + TrailingStop*MinPoint) MyPrice = LowerAfterEntry + TrailingStop*MinPoint; If(Open MyPrice) MyPrice = Open; BuyToCover(1,MyPrice); ,KCS_V3(6),我们将编译后的系统重新运行,会看到净利润上升了13295,最大资金回撤下降了14575,改进的效果是非常明显的。 我们再回顾2006年7月的图表,KCSV3的讯号如下图: 如图中红圈位置,在跟踪止损之后,价位还在KC上轨之上,系统再次入场。 我们应该思考一种新的入场规则,在跟踪止损或止损后再次入场。,KCS_V3(7),KCS_V4(1),重新入场规则: 做多时突破前期高点再次入场; 做空时突破前期低点再次入场。 为了实现重新入场,我们需要记录跟踪止损的状态。 还需要记录最近的最高、最低点。,KCS_V4(2),新增序列变量: BoolSeries bLongTrailingStoped; BoolSeries bShortTrailingStoped; 初始化: If(BarStatus 0) bLongTrailingStoped = bLongTrailingStoped1; bShortTrailingStoped = bShortTrailingStoped1; Commentary(“bLongTrailingStoped=“+IIFString(bLongTrailingStoped,“True“,“False“); Commentary(“bShortTrailingStoped=“+IIFString(bShortTrailingStoped,“True“,“False“);,KCS_V4(3),增加一个条件分支,记录HigherAfterEntry和LowerAfterEntry的值。 再次入场的代码: If(bLongTrailingStoped ,KCS_V4(4),修改之后的系统测试结果没有明显的变化,但是这次修改去掉了明显不合理的入场,对于系统的连续性和稳健性有了一定的提升。 前面我们使用了固定400点的跟踪止损,在整个测试周期里面,橡胶价格最高接近3万,最低6600。所以使用固定的点数明显不合理,因此我们决定采取根据当前价格的某个比值进行吊灯跟踪止损。,KCS_V5,将原来的TrailingStop修改为百分比值。 取前一Bar的中线值的百分比值为跟踪止损值。 我们也可以取当前Bar的Open,或者开仓价,或者昨收等很多固定的价格作为参照。 代码修改很简单,只需要替换固定止损值的算法即可。,实战要注意的问题,涨跌停:本系统应用周期为日线,一般的止损幅度也超过5%,因此,程序中没有涨跌停板的控制。如果出现不利的涨跌停,可以考虑手工处理。 迁仓:对于现货升水的合约,做多的头寸尽量晚一点,做空的头寸尽量早一点。现货贴水的合约反之。,第二部分,日内交易系统的分析和实现,日内交易的优势,有较高的获利潜力,可充分利用保证金,对于资金实力的要求较低。 不用考虑隔夜的价格波动,可以安心入睡。 日内交易限制了盈利,同时也限制了亏损的空间,不会出现一把亏光的风险。,坚持对日内交易的重要性,坚持是你能够在亏损或连续亏损之后仍然能够正常的交易。 坚持是你在赢利时能够拿住头寸,亏损时能够及时平仓。 坚持是你能够坦然接受亏损,把亏损当成交易成本。 当然,坚持是建立在你有一个正确稳健的系统的基础上。,RangeBreak系统,RangeBreak基于昨日振幅和今日开盘价的关系。 昨日振幅=昨日最高价-昨日最低价 上轨 = 今日开盘价+N*昨日振幅 下轨 = 今日开盘价-N*昨日振幅 当价格突破上轨,买入开仓。以开盘价减去一定的值作为下轨,价格跌穿下轨,卖出开仓。 收盘平仓,RangeBreak指标,Params Numeric PercentOfRange(0.3); Vars Numeric DayOpen; Numeric preDayRange; Numeric UpperBand; Numeric LowerBand; Begin DayOpen = OpenD(0); preDayRange = HighD(1) - LowD(1); UpperBand = DayOpen + preDayRange*PercentOfRange; LowerBand = DayOpen - preDayRange*PercentOfRange; PlotNumeric(“UpperBand“,UpperBand); PlotNumeric(“LowerBand“,LowerBand); PlotNumeric(“MidLine“,DayOpen); End,RBS_V1(1),Params Numeric PercentOfRange(0.3); Numeric ExitOnCloseMins(14.55); Vars Numeric DayOpen; Numeric preDayRange; Numeric UpperBand; Numeric LowerBand; Numeric MyPrice; Begin DayOpen = OpenD(0); preDayRange = HighD(1) - LowD(1); UpperBand = DayOpen + preDayRange*PercentOfRange; LowerBand = DayOpen - preDayRange*PercentOfRange; If(MarketPosition!=1 ,RBS_V1(2),If(MarketPosition!=-1 End,RBS_V1(3),我们将最初级版本的系统应用于所有品种的指数中(可行性测试,选取了指数的30分钟周期,数据范围为2008.1.1-现在)。除了玉米,小麦等少数价低品种外,绝大部分都是盈利,有些品种还有不错的资金曲线。 证明该系统的有不错的胚子,值得继续深入研究。,RBS_V2(1),如果前一日涨停或跌停,则会出现范围很小。 两种解决方案: 1、设定一个范围的最小值,假定为当前价格的0.2%。 2、考虑上当前的开盘价,加上跳空的范围。 我们选择第一种方法。,RBS_V2(2),Params Numeric MinRange(0.2); Vars NumericSeries DayOpen; Numeric preDayHigh; Numeric preDayLow; NumericSeries preDayRange; Begin preDayHigh = HighD(1); preDayLow = LowD(1); If(Date!=Date1) DayOpen = Open; preDayRange = preDayHigh - preDayLow; If(preDayRange Open*MinRange*0.01) preDayRange = Open*MinRange*0.01; Else DayOpen = DayOpen1; preDayRange = preDayRange1; ,RBS_V3(1),有可能通道会比较宽,难道非要等到反转才平仓? 考虑增加止损设置,也有2种方案: 1、亏损固定点数。 2、亏损当前价格的百分比。 考虑到商品价格变化的差异,我们采取第二种方式。,RBS_V3(2),先增加一个变量StopLine,用来保存止损位置。 下面是做多时的止损代码: If(MarketPosition=1) StopLine = UpperBand-DayOpen*StopLossSet*0.01; If(Low = StopLine) MyPrice = StopLine; If(Open MyPrice) MyPrice = Open; Sell(Lots,MyPrice); ,RBS_V3(3),下面是做空的止损代码: Else If(MarketPosition=-1) StopLine = LowerBand+DayOpen*StopLossSet*0.01; If(High = StopLine) MyPrice = StopLine; If(Open MyPrice) MyPrice = Open; BuyToCover(Lots,MyPrice); ,RBS_V4(1),突破的时效性,发生在上午和下午意义是不同的。 不同的商品时效属性不尽相同 为此我们增加最后交易时间参数,可供优化测试来确定最佳值。,RBS_V4(2),增加参数: Numeric LastTradeMins(14.00); 开仓条件处增加一个时间条件。 If(MarketPosition!=1 & High=UpperBand & Time LastTradeMins/100) / 多头开仓 If(MarketPosition!=-1 & Low=LowerBand & Time LastTradeMins/100) / 空头开仓 ,RBS_V5(1),为了防止较大的盈利被吞噬,增加跟踪止损。 设定跟踪止损的起始点。 设定跟踪止损的回撤值。 或者可以选择百分比跟踪止损。 这里我们采取回撤值。,RBS_V5(2),要实现跟踪止损,我们需要记录开仓后出现的最大盈利的位置,即开多仓后出现的最高价,开空仓后出现的最低价。 为了记录最大盈利,我们用两个序列变量,一个记录开仓后的最高价,一个记录开仓后的最低价。,RBS_V5(3),新增变量: NumericSeries HigherAfterEntry; NumericSeries LowerAfterEntry; 在脚本开始部分增加以下代码,来记录高低价: If(BarsSinceEntry = 1) HigherAfterEntry = AvgEntryPrice; LowerAfterEntry = HigherAfterEntry; Else If(BarsSinceEntry 1) HigherAfterEntry = max(HigherAfterEntry1,High1); LowerAfterEntry = min(LowerAfterEntry1,Low1); ,RBS_V5(4),跟踪止损的编码可配合前面的止损编码一起控制。 If(HigherAfterEntry=AvgEntryPrice+DayOpen*TrailingStart*0.01) StopLine = HigherAfterEntry - DayOpen*TrailingStop*0.01; Else / 止损 StopLine = UpperBand-DayOpen*StopLossSet*0.01; If(Low = StopLine) MyPrice = StopLine; If(Open MyPrice) MyPrice = Open; Sell(1,MyPrice); 做空的代码类似。,RBS_V6(1),当我们止损或跟踪止损之后,价格可能会反向运动,如果不加控制,只要满足初始开仓条件,就会开仓。 为了不错失大的机会,我们需要再次入场,但不能在上下轨的位置入场。 有以下两种方式可以考虑: 1、突破前期的高点低点入场。 2、时间入场,做多时停留在上轨N个Bar入场。,RBS_V6(2),这里我们采取第一种方式入场,和前面所讲的持仓系统类似。我们需要标记止损动作,并要记录高低位。 新建两个布尔型序列变量: BoolSeries bLongStoped; BoolSeries bShortStoped; 在脚本开始位置增加处理,保证其值向后传递。 增加HigherAfterEntry和LowerAfterEntry在平仓后的值传递。,RBS_V6(3),在原始开仓位置增加条件,开多仓时bLongStoped不能为True,开空仓时bShortStoped不能为True。 在各个交易动作的地方处理这两个序列变量。 增加再次入场的代码: If(bLongStoped ,RBS_V6(4),/ 做空再次入场代码: If(bShortStoped ,RBS_V7(1),增加涨跌停板控制,接近涨跌停板不会开仓。 价格到达涨跌停板马上平仓。,RBS_V7(2),我们新建一个布尔变量bInBoardRange,默认值设置为False。 InBoardRange = (Open Q_UpperLimit - DayOpen*StopLossSet*0.02); 在开仓条件中加入(InBoardRange=false),RBS_V7(3),为了在价格达到涨跌停价马上平仓,我们需要在增加如下代码: 做多时: If(Open = Q_UpperLimit) Sell(1,Open); 做空时: If(Open = Q_LowerLimit) BuyToCover(Lots,Open);,RBS_V8(1),增加失败次数限制,防止单日亏损无限制扩大。 增加一个变量记录失败的次数。 NumericSeries FailureCnts; 增加一个参数设置最大次数。 Numeric FailureLimit(3);,RBS_V8(2),在脚本开始部分增加序列变量值的向后传递处理。 在平仓时增加是否亏损的判断,如果亏损则将计数+1. If(PositionProfit 0 ) FailureCnts = FailureCnts + 1; 在开仓时增加次数限定。 FailureCnts FailureLimit,第三部分,套利分析和交易的实现,套利指标,价差指标: 显示2个或3个商品的价差; 商品之间的数量比可以任意设置; 比值指标 显示任意2个或3个商品的价格比值; 价差K线 将两个商品的价差显示为K线; K线只有开盘价和收盘价,无上下影线。,价差交易,实现两个商品的价差交易; 功能类似于套利宝,通过指定4条线的位置完成套利交易。,谢谢!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!