在最新的技术分析研究报告中,John Ehlers 介绍了几种平滑价格曲线而不产生滞后、使其更加平滑以及应用高通和带通滤波器的功能。指标库中已经提供了无滞后平滑、高通和带通滤波器,但 Ehlers 的最新发明 Ultimate Smoother 却没有。它通过使用高通滤波器从价格曲线中减去高频分量来实现其巨大的平滑能力。
下面的函数是将该源代码的EasyLanguage代码直接转换为 C 语言:
varUltimateSmoother(var*Data,intLength)
{
var f =(1.414*PI)/Length;
var a1 = exp(-f);
var c2 =2*a1*cos(f);
var c3 =-a1*a1;
var c1 =(1+c2-c3)/4;
vars US = series(*Data,4);
return US[0]=(1-c1)*Data[0]+(2*c1-c2)*Data[1]-(c1+c3)*Data[2]
+ c2*US[1]+ c3*US[2];
}
为了比较滞后和平滑能力,我们将终极平滑器、指标库中的超级平滑器和标准 EMA 应用于 2024年的 ES 图表:
void run()
{
BarPeriod=1440;
StartDate=20230201;
EndDate=20231201;
assetAdd("ES","YAHOO:ES=F");
asset("ES");
intLength=30;
plot("UltSmooth",UltimateSmoother(seriesC(),Length),LINE,MAGENTA);
plot("Smooth",Smooth(seriesC(),Length),LINE,RED);
plot("EMA",EMA(seriesC(),3./Length),LINE,BLUE);}
}
生成的图表复制了下图中的 ES 图表。EMA 以蓝色显示,超级平滑滤波器以红色显示,终极平滑滤波器以洋红色显示:
我们可以看到,最终的平滑器确实产生了最佳的价格曲线表示,尽管是平滑的。
在最新的分析中,Ehlers 还基于他的 Ultimate Smoother 介绍了两个波段指标。波段指标可用于在价格触及波段上限或下限时触发多头或空头头寸。第一个波段指标 UltimateChannel也是从 Ehlers 的 TradeStation 代码直接转换为 C 语言:
varUltimateChannel(intLength,intSTRLength,intNumSTRs)
{
var TH = max(priceC(1),priceH());
var TL = min(priceC(1),priceL());
var STR =UltimateSmoother(series(TH-TL),STRLength);
varCenter=UltimateSmoother(seriesC(),Length);
rRealUpperBand =Center+NumSTRs*STR;
rRealLowerBand =Center-NumSTRs*STR;
returnCenter;
}
rRealUpperBand和RealLowerBand是预定义的全局变量,是由指标库中的波段指标使用。为了测试新指标,我们将其应用于 ES 图表:
void run()
{
BarPeriod=1440;
StartDate=20230301;
EndDate=20240201;
assetAdd("ES","YAHOO:ES=F");
asset("ES");
UltimateChannel(20,20,1);
plot("UltChannel1",rRealUpperBand,BAND1,BLUE);
plot("UltChannel2",rRealLowerBand,BAND2,BLUE|TRANSP);
}
生成的图表复制了 Ehlers 文章中的 ES 图表:
第二个波段指标Ultimate Bands需要的代码比 Ehlers 的实现要少,因为 lite-C 可以将函数应用于整个数据系列:
varUltimateBands(intLength,intNumSDs)
{
varCenter=UltimateSmoother(seriesC(),Length);
vars Diffs= series(priceC()-Center);
var SD = sqrt(SumSq(Diffs,Length)/Length);
rRealUpperBand =Center+NumSDs*SD;
rRealLowerBand =Center-NumSDs*SD;returnCenter;
}
再次应用于 ES 图表:
void run()
{
BarPeriod=1440;
StartDate=20230301;
EndDate=20240201;
assetAdd("ES","YAHOO:ES=F");
asset("ES");
UltimateBands(20,1);
plot("UltBands1",rRealUpperBand,BAND1,BLUE);
plot("UltBands2",rRealLowerBand,BAND2,BLUE|TRANSP);
}
❤仅供学习交流参考
热门跟贴