您现在的位置:程序化交易>> 程序化交易>> 系统交易>>正文内容

恒温器Thermostat交易系统-会换档的交易系统 EASYLANGUAGE语言[系统交易]

引言:

此文介绍「恒温器交易系统」(Thermostat Trading Strategy)的设计原理,此系统「在趋势市场中採用顺势系统,在摆盪市场中採用摆盪系统」,系统设计的关键在于决定市场类别(顺势或摆盪)的转折点,此系统使用Choppy Market Index为指标(指标值介于0~100之间,指数越大代表市场越有趋势)。以此指标判断,策略系统即可判别市场类别,并引用不同的技术指标。发文者也提供了系统编码与实证绩效结果。

 

正文:

 

因为市场不会永远存在趋势,所以才会有人想说希望有一种交易系统可以适用在趋势市场和摆盪市场。而Thermostat Trading Strategy(恒温器交易系统)的设计原理,就是在趋势市场中採用顺势系统,在摆盪市场中採用摆盪系统。有点像是换档的感觉,而决定换档时机的指标,就是之前报告过的 ChoppyMarketIndex,这个指标是会介于0-100之间,指数越大,代表现在的市场越有趋势。整个系统的架构,可以简化的写成下面这样:

 

 

If ChoppyMarketIndex < 20 then begin

摆盪系统内容;

end;

 

If ChoppyMarketIndex >= 20 then begin

顺势系统内容;

End;

 

 

架构就是这麽简单而已,剩下的只是把摆盪系统和顺势系统的内容放进去这个架构裡面而已。顺势系统的内容主要是延续使用 Bollinger Bandit系统的内容,而摆盪系统则是加上的简单的型态识别(pattern recognition)的开盘区间突破系统而已。下面分别就这两种系统作报告:

 

 (转自 http://www.cxh99.com/2016/04/08/35134.shtml

摆盪系统:

在摆盪市场中,通常会存在一种现象,就是如果今天价格上涨的话,那麽明天的价格就比较倾向于会下跌。而今天价格如果下跌的话,那麽明天的价格就比较倾向于上涨,而这也正是摆盪市场的特性。所以我们定义如果今天的收盘价如果高于昨天的 (最高价+最低价+收盘价) / 3的话,那麽明天就会一个 sell easier day,代表明天价格应该会比较倾向下跌。相反的,我们也定义如果今天的收盘价低于昨天的 (最高价+最低价+收盘价) / 3的话,那麽明天就会是一个buy easier day,代表明天价格应该会比较倾向上涨。

 

 

在buy easier day的时候,只有代表著价格比较具有上涨的可能性而已,并不是指价格一定会上涨。所以我们必须设定做多和做空这两边的entry,只是这两边entry的门槛不一样而已,做多的门槛比较低,比较容易。反而做空的门槛比较高,比较难。所以在buy easier day的时候,我们会设定进场的规则是这样的:

 

Initiate a long position at the open price + 50% of the ten-day average true range.

Initiate a short position at the open price - 75% of the ten-day average true range.

 

 

而如果是sell easier day的话,那我们则会把进场的规则设为这样:

 

Initiate a short position at the open price - 50% of the ten-day average true range.

Initiate a long position at the open price + 75% of the ten-day average true range.

 

 

而在摆盪市场中,有时候市场会有假的,失败的波动,这种假的波动常常会让我们被巴来巴去,所以这裡我们加入了一个简单的滤网来避免这种情形。如果我们的buy stop 低于三天的最低价的平均,则就把buy stop提高到三天的最低价的平均。而如果我们的sell stop高于三天最高价的平均,则把sell stop下降到三天最高价的平均。( www,cxh99.com )

 

 

 

顺势系统:

如果当ChoppyMarketIndex的指标高于20的时候,代表现在市场进入趋势了,所以我们也跟著改用顺势系统。这裡我们所採用的顺势系统就是之前报告过的Bollinger Bandit系统。当价格突破上通道的时候建立多头部位,当价格跌破下通道的时候则建立空头部位。而当有部位在手上的时候,而价格回到50天移动平均线的时候,我们就平仓出场。

 

 

而当这个系统在摆盪和趋势这两种模式当中转换的时候,有时候会有部位在手上。当从趋势市场转换成摆盪市场的时候,如果有在趋势市场当中建立的部位,则我们就让摆盪系统的进场讯号发生的时候才来结束这个部位。但是当市场从摆盪市场变成趋势市场的时候,如果我们有在摆盪市场裡面建立的部位的话,那麽我们就用三倍ATR的保护性停损来保护我们的部位。因为如果要用50天移动平均线才让我们出场的话,那可能会让我们保留这个错误的部位太久而造成太多的损失。

 

 

下面就是这个系统的程式码:

 

 

 

{Thermostat by George Pruitt

Two systems in one. If the ChoppyMarketIndex is less than 20 then we are in a

swing mode. If it is greater than or equal to 20 then we are in a trend mode.

Swing system is an open range breakout incorporating a buy easier/sell easier

concept. The trend following system is based on bollinger bands and is

similar to the Bollinger Bandit program.}

 

Inputs: bollingerLengths(50),trendLiqLength(50),numStdDevs(2),swingPrcnt1(0.50),swingPrcnt2(0.75),atrLength(10),swingTrendSwitch(20);

 

Vars:cmiVal(0),buyEasierDay(0),sellEasierDay(0),trendLokBuy(0),trendLokSell(0),keyOfDay(0),swingBuyPt(0),swingSellPt(0),trendBuyPt(0),trendSellPt(0),swingProtStop(0);

 

cmiVal = ChoppyMarketIndex(30);

buyEasierDay = 0;

sellEasierDay = 0;

 

trendLokBuy = Average(Low,3);

trendLokSell= Average(High,3);

 

keyOfDay = (High + Low + Close)/3;

 

if(Close > keyOfDay) then sellEasierDay = 1;

if(Close <= keyOfDay) then buyEasierDay = 1;

 

if(buyEasierDay = 1) then

begin

swingBuyPt = Open of tomorrow + swingPrcnt1*AvgTrueRange(atrLength);

swingSellPt = Open of tomorrow - swingPrcnt2*AvgTrueRange(atrLength);

end;

 

if(sellEasierDay = 1) then

begin

swingBuyPt = Open of tomorrow + swingPrcnt2*AvgTrueRange(atrLength);

swingSellPt = Open of tomorrow - swingPrcnt1*AvgTrueRange(atrLength);

end;

 

swingBuyPt = MaxList(swingBuyPt,trendLokBuy);

swingSellPt = MinList(swingSellPt,trendLokSell);

 

trendBuyPt = BollingerBand(Close,bollingerLengths,numStdDevs);

trendSellPt = BollingerBand(Close,bollingerLengths,- numStdDevs);

 

if(cmiVal < swingTrendSwitch)then

begin

if (MarketPosition <> 1) then Buy("SwingBuy") next bar at swingBuyPt stop;

if(MarketPosition <> -1) then SellShort("SwingSell") next bar at swingSellPt stop;

end

else

begin

swingProtStop = 3*AvgTrueRange(atrLength);

Buy("TrendBuy") next bar at trendBuyPt stop;

SellShort("TrendSell") next bar at trendSellPt stop;

Sell from Entry("TrendBuy") next bar at Average(Close,trendLiqLength) stop;

BuyToCover from Entry("TrendSell") next bar at Average(Close,trendLiqLength) stop;

Sell from Entry("SwingBuy") next bar at EntryPrice – swingProtStop stop;

BuyToCover from Entry("SwingSell") next bar at EntryPrice + swingProtStop stop;

end;

 

 

而下面则是这个系统在1982-2002这20年的绩效表现,看来比之前报告的King Kelthner和Bollinger Bandit系统绩效来的好。

 

thermostat.JPG
thermostat.JPG (87.89 KiB) 被浏览 1235 次

 


有兴趣的朋友可以拿来测试一下看看,不过我自己测试了最近几年的外汇,指数,金属,能源,农产品等等。发现绩效还好而已,所以想要直接拿来套用的人可能会失望了。不过这样的系统开发的逻辑,倒是可以值得我们学习的。谢谢。

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 511411198   点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容