量化策略开发,高质量社群,交易思路分享等相关内容
终极通道和终极带
通过新的平滑技术减少两个经典指标的滞后
终极通道
上次,我们介绍了一种用于平滑数据的新进展,这种新滤波器被称为终极平滑器(Ultimate Smoother),它具有较少的滞后。本文将展示如何将其应用于您的指标中。
Keltner通道和布林带构建中的一个关键元素是使用移动平均线来确定其范围的名义中心。在指标中使用移动平均线会引入滞后,而滞后会导致入场和出场信号的延迟。
在本杂志2024年4月的文章中,我介绍了我开发的终极平滑技术(本例作为函数调用)。在那篇文章中,我描述了它在减少滞后方面的优势,并详细介绍了它的构造。
在本文中,我探讨了使用终极平滑器来代替移动平均线,以减轻指标滞后。
Keltner通道使用指数移动平均线(EMA)来确定通道的中心,并使用平均真实范围(ATR)来确定通道的宽度。ATR由于平均处理引入了滞后,同时EMA也引入了滞后。参考代码清单“终极通道指标(EasyLanguage)”,我们用终极平滑器取代了这两个平均值:(TB代码如下)
真实高点(TH)是如果前一根K线的收盘价高于当前K线的最高价,则取前一根K线的收盘价,否则取当前K线的最高价。同样,真实低点(TL)是如果前一根柱的收盘价低于当前K线的最低价,则取前一根K线的收盘价,否则取当前K线的最低价。真实范围是指真实高点和真实低点之间的差值。代码通过计算平滑的真实范围(STR)来减轻滞后,而不是计算ATR。为了灵活性,用于计算STR的数据长度是一个输入变量。上通道值计算为收盘价的终极平滑值加上STR乘以输入的倍数。同样,下通道值计算为收盘价的终极平滑值减去STR乘以输入的倍数。
图1展示了终极通道指标的一个例子,其中长度和STR长度都设置为20,NumSTRs设置为1。显然,通道几乎没有滞后。通过增加输入长度参数,可以对通道限值进行平滑处理,这将适度增加指标滞后。
图1:终极通道。最终通道指示器具有最小滞后(滞后小于Keltner通道,此处未显示)。
终极带
布林带使用简单移动平均线(SMA)来确定带的中心,并使用标准差来建立指标带。两者都增加了指标的滞后。参考代码清单“终极带指标(EasyLanguage)”,我们用终极平滑器取代了这两个平均值:
平滑值是指标带的中心,通过终极平滑器函数计算。每个数据样本的偏差是平滑值和该数据点的收盘价之间的差值。标准差(SD)计算为各个偏差平方的平均值的平方根。指标带计算为平滑值加上或减去输入变量NumSDs乘以SD的值。
图2展示了终极带指标的一个例子,其中长度设置为20,NumSDs设置为1。显然,指标带几乎没有滞后。通过增加输入长度参数,可以对带限值进行平滑处理,这将适度增加指标滞后。
图2:终极带。终极带也有最小滞后(滞后比布林波段小,这里没有显示)。
使用和应用
终极通道和终极带指标可以像Keltner通道和布林带一样使用来解释价格走势。通过使用输入变量,这些指标在各种仪器上显示出足够的变化范围,成为您技术交易库中的有用补充。主要区别在于与标准指标相比,指标滞后大大减少。
一个简单的交易策略是沿着终极平滑器的方向持有头寸,当价格在相反方向超出通道或带时退出头寸。这基本上是一种趋势跟踪策略,带有自动跟随止损。
代码
1、终极通道:
Params
Numeric STRLength(20);
Numeric Length(20);
Numeric NumSTRS(1);
Vars
Numeric TH(0);
Numeric TL(0);
Numeric ROC(0);
Numeric STR(0);
Numeric Upperchnl(0);
Numeric LowerChnl(0);
Events
OnBar(ArrayRefindexs)
{
If (Close[1]> High)
{
TH = Close[1];} Else {TH = High;}
If (Close[1] < Low)
{
TL= Close[1];} Else {TL= LoW;}
STR=ulsmooth(TH -TL, STRLength);
UpperChnl=ulsmooth(close,Length) +NumSTRS*STR;
LowerChnl= ulsmooth(close,Length)-NumSTRS*STR;
PlotAuto("upch",UpperChnl);
PlotAuto("lowch",LowerChnl);
}
2、终极带:
Params
Numeric Length(20);
Numeric NumSDS(1);
Vars
SeriesSmooth(0);
Numeric Sum(0);
Numeric count(0);
Numeric SD(0);
Numeric UpperBand(0);
Numeric LowerBand(0);
Events
OnBar(ArrayRefindexs)
{
Smooth =ulsmooth(Length);
Sum = 0;
For count =0 to Length-1
{Sum=Sum+(Close[count]-Smooth[count])*(Close[count] -smooth[count]);}
If (Sum !=0)
{SD=Sqrt(Sum/Length);
UpperBand=Smooth+ NumSDs*SD;
LowerBand=Smooth-NumSDs*SD;}
PlotAuto("upbd",UpperBand);
PlotAuto("lowbd",LowerBand);
}