1、今天要报告的系统是”Building winning Trading Systems with TradeStation”里面的第四个系统。这是属于自适应(Adaptive)系统之一,所谓的自适应系统的观念,是指这种系统的参数,会依据市场目前的状况而自行调整。 举例来说,Donchian Channel(也就是我最爱的Price Channel Breakout)系统,如果参数设的太短(比如说20天的价格突破),那么在趋势明确的市场裡就会表现的不错,因為可以在行情刚啟动的时候就产生讯号进场。而且出场的机制也会跟踪的比较紧密,不容易让到手的获利回吐出去。但是太短的参数在摆荡的市场裡,就
2、会因為进出场讯号出现的太频繁而导致常常被巴来巴去。所以在摆荡的市场裡,应该要把参数设得比较长一点(比如说60天的价格突破),让讯号不要產生的那么频繁而导致反覆被巴的情形。而Adaptive System(适应性系统)的设计原则,就是让系统本身的参数会依据目前市场的状况而自行调整参数本身的值,而不是像一般人常用的固定参数值的方式。 而如何让参数的值会依据市场状况的变动而自行调整呢?之前报告过的ChoppyMarketIndex可以是一种方式,ADX也可以是一种方式。这两种指标都可以指出目前市场是属於趋势市场或者是摆盪市场。而在这本书裡,用的则是市场的波动度来作为衡量的标準。作者认為在摆
3、荡市场裡,市场的波动会随著变大,所以应该要随着增加Donchian Channel系统参数的值(在这裡用look back days),这样比较不容易產生进反覆的出场讯号。而在趋势市场裡,市场的走势趋向明确,而波动度会随著变小,因此应该要减少参数的值,让行情一发动的时候就可以进场,也让出场的点位追踪的比较紧密。(蓝色投机客注:我发现波动度跟市场的趋势性不一定呈现负相关,但是為了忠於原著,所以继续用作者的观点来做说明。毕竟重点是要让大家知道适应性系统Adaptive System的观念) 在决定了採用什么指标来代表目前市场的趋势性之后,我们可以根据 Donchian Channel在过
4、去历史资料的回测,来看理想的参数值应该订在什麼样的上下限之间。而根据作者的一些回测显示,参数值最低不应该低於20天,最高不应该高过60天。所以我们订出参数值的上下限应该介於20天到60天之间。 接下来我们就来看如何界定市场的波动度。一开始的时候,这个系统会以20天的价格突破来做为基准,之后每天收盘的时候,去计算最近30天收盘价的标准差,然后用这30天收盘价的标准差来定义市场的波动度。我们也可以用ATR来代替标准差。然后每天来比较市场波动度的增减,如果市场波动度变大10%,那麼也就把look back days参数值增加10%。而如果市场波动度减少10%,那麼也就跟著把look bac
5、k days参数值减少10%。 在作者第一代的Dynamic Breakout Strategy裡面,只有单纯的使用Adaptive Donchian Channel 来作为进出场的系统,并且狠简单的放了一个USD$1,500的停损机制而已。而在这个第二代的Dynamic Breakout Strategy 里面,则是加入了Adaptive Bollinger Band的滤网机制。这个Adaptive Bollinger Band计算的长度,就是用上面所计算出来的look back days的长度,也就是当收盘价要在Bollinger Band的Upband 的上方,才可以进行多方的
6、交易。而也只有当收盘价在Bollinger Band的 Downband的下方,才可以进行空方的交易。而停损的机制也由固定USD$1,500的停损,改为Adaptive移动平均线的停损。而这个Adaptive移动平均线的计算长度,也是用上面所计算出来的look back days的长度。 所以下面就是这个系统的程式码: {Dynamic Break Out II by George Pruitt This system is an extension of the original Dynamic Break Out system written by George for
7、 Futures Magazine in 1996. In addition to the channel break out methodology, DBS II incorporates Bollinger Bands to determine trade entry.} Inputs: ceilingAmt(60),floorAmt(20),bolBandTrig(2.00); Vars: lookBackDays(20),todayVolatility(0),yesterDayVolatility(0),deltaVolatility(0); Vars: buyPoi
8、nt(0),sellPoint(0),longLiqPoint(0),shortLiqPoint(0),upBand(0),dnBand(0); todayVolatility = StandardDev(Close,30,1); yesterDayVolatility = StandardDev(Close[1],30,1); {See how I offset the function call to get yesterday's value} deltaVolatility = (todayVolatility - yesterDayVolatility)/todayVolati
9、lity; lookBackDays = lookBackDays * (1 + deltaVolatility); lookBackDays = Round(lookBackDays,0); lookBackDays = MinList(lookBackDays,ceilingAmt); {Keep adaptive engine within bounds} lookBackDays = MaxList(lookBackDays,floorAmt); upBand = BollingerBand(Close,lookBackDays,+bolBandTrig); dnBand
10、 BollingerBand(Close,lookBackDays,-bolBandTrig); buyPoint = Highest(High,lookBackDays); sellPoint = Lowest(Low,lookBackDays); longLiqPoint = Average(Close,lookBackDays); shortLiqPoint = Average(Close,lookBackDays); if(Close > upBand) then Buy("DBS-2 Buy") tomorrow at buyPoint stop; if(Close < dnBand) then SellShort("DBS-2 Sell") tomorrow at sellPoint stop; if(MarketPosition = 1) then Sell("LongLiq") tomorrow at longLiqPoint stop; if(MarketPosition = -1) then BuyToCover("ShortLiq") tomorrow at shortLiqPoint stop;






