angevoyageur: I don't see the problem. iMA is well coded for performance. If an iMA report a 0 it's because you don't have data (or enough data). By the way there is only a problem with SMMA, I don't know why, but it cannot be due to this "incremental" implementation as it's working well for other mode.
void CalculateSmoothedMA(int rates_total,int prev_calculated,int begin,constdouble &price[])
{
int i,limit;
//--- first calculation or number of bars was changedif(prev_calculated==0)
{
limit=InpMAPeriod+begin;
//--- set empty value for first limit barsfor(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
//--- calculate first visible valuedouble firstValue=0;
for(i=begin;i<limit;i++)
firstValue+=price[i];
firstValue/=InpMAPeriod;
ExtLineBuffer[limit-1]=firstValue;
}
else limit=prev_calculated-1;
//--- main loopfor(i=limit;i<rates_total && !IsStopped();i++)
ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod;
//---
}
注意firstValue的计算方法与SMA程序中的相同。
void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,constdouble &price[])
{
int i,limit;
//--- first calculation or number of bars was changedif(prev_calculated==0)// first calculation
{
limit=InpMAPeriod+begin;
//--- set empty value for first limit barsfor(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
//--- calculate first visible valuedouble firstValue=0;
for(i=begin;i<limit;i++)
firstValue+=price[i];
firstValue/=InpMAPeriod;
ExtLineBuffer[limit-1]=firstValue;
}
else limit=prev_calculated-1;
//--- main loopfor(i=limit;i<rates_total && !IsStopped();i++)
ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
}
Moving averages are commonly used to identify trends and reversals as well as identifying support and resistance levels. Moving averages such the WMA and EMA, which are more sensitive to recent prices (experience less lag with price) will turn before an SMA. They are therefore more suitable for dynamic trades, which are reactive to short term...
我再次注意到,即使我从2009年的当前日期(2014年4月)开始运行,图表上的MA和回测中的IMA之间的差异仍然是0.10,所以我想这个问题仍然存在。如果其他方法都失败了,我将做我自己的iMa替换功能。即使从2009年开始,icustom在D1图表上仍然只返回0,在H4图表上工作正常。
通过分析自定义移动平均线 指标的工作原理,我明白为什么会出现这样的问题。
每条移动平均线都是以非粗略的方式计算的,从移动平均线的前一帧开始计算下一帧的移动平均线,而不是只计算必要的(在这种情况下是370帧)的方程式。这样一来,如果有一帧移动平均线是错误的,那么后面的所有移动平均线也将是错误的。离错误帧越远,误差就越小。如果从一开始就正确计算所有的帧,它甚至可以正常工作,但我注意到有时iMA在开始时报告零(我有一个程序来丢弃有问题的MA读数,但iMA本身没有),这些零可能在从iMA的前一帧计算iMA的下一帧时也被考虑在内。
这就是为什么当我在2013年开始回测时,差异最大,2012年比2013年开始时要小,start=2011时更小,等等。即使我从2009年开始回测,差异仍然可见,所以这是一个严重的问题。
我先前确认SMMA模式有问题,我想你已经向服务台报告了?其他模式在我看来是可以的。
我正在写我自己的iMA更换程序,所以我可以完全记录和理解这个问题。(而不仅仅是像本线程中所做的视觉比较)。
ima的结果,我的ima替换和自定义移动平均线 的结果将在日志中提供,以供比较。
PS.如果你确认了这个错误,我现在就报告。(当问题被报告后,我将在这个主题中添加新的评论)。该网站(或我的互联网)目前工作非常缓慢,所以我甚至在进入服务台页面时都有问题。我以为其他MA类型也会受到影响,但我做了更多的测试,SSMA似乎是唯一受到影响的,就像你说的。
但我注意到iCustom问题。测试SSMA和iCustom问题的脚本。
通过分析自定义移动平均线指标的工作原理,我明白为什么会出现这样的问题。
每条移动平均线都是以非粗略的方式计算的,从移动平均线的前一帧开始计算下一帧的移动平均线,而不是只计算必要的(在这种情况下是370帧)的方程式。这样一来,如果有一帧移动平均线是错误的,那么后面的所有移动平均线也将是错误的。离错误帧越远,误差就越小。如果从一开始就正确计算所有的帧,它甚至可以正常工作,但我注意到有时iMA在开始时报告零(我有一个程序来丢弃有问题的MA读数,但iMA本身没有),这些零可能在从iMA的前一帧计算iMA的下一帧时也被考虑在内。
这就是为什么当我在2013年开始回测时,差异最大,2012年比2013年开始时要小,start=2011时更小,等等。即使我从2009年开始回测,差异仍然可见,所以这是一个严重的问题。
I don't see the problem. iMA is well coded for performance. If an iMA report a 0 it's because you don't have data (or enough data). By the way there is only a problem with SMMA, I don't know why, but it cannot be due to this "incremental" implementation as it's working well for other mode.
是的,你是对的,这样会慢得多。但事实是,这种计数方式加上开始时的一些空帧(零)会导致这样的问题。(这就是为什么iMA的SSMA总是比实际的SSMA小,而不是大)我知道我没有检查iMA的回报,这就是为什么我在开始时得到零,而不是正确处理缺乏必要的信息,但这是另一个问题。
对于较小的TFs,分析的帧数要多得多,问题可能会随着时间的推移而被稀释。随着每一个新的框架,Ima SSMA越来越接近真实的SSMA,所以越多的柱子通过,问题就越不明显,这就是为什么我认为以前没有人注意到它。我发现370SSMA和PERIOD_12H PERIOD_8H等也有同样的问题。
如果你有时间,请研究一下iCustom函数。我附上了源代码 以方便测试。检查任何较低的TFs,PERIOD_D1 - iCustom工作正常,并返回与iMA相同的值。在PERIOD_D1中,对于iCustom来说总是零,而iMA仍然报告一些数值。
奇怪的是,当你在最大PERIOD_H12上使用SSMA时,iMA和iCustom "自定义移动平均线 "指标都报告了错误的数值。(从2014.01开始测试,看看有什么不同)
错误一定是在这里的某个地方。(自定义移动平均线的形式)
注意firstValue的计算方法与SMA程序中的相同。
as firstvalue = (x1 + x2 + x3 + ... + xn) / n
这是简单移动平均线的 "粗略 "公式,但不是平滑移动平均线的公式。
也许这就是问题的原因?
从该网站。
https://mahifx.com/indicators/smoothed-moving-average-smma
平滑移动平均线的第一个值是按简单移动平均线(SMA)计算的。
sum1=sum (close, n)
smma1 = sum1/ n
第二条及以后的移动平均线是按照这个公式计算的。
SMMA(i)=(SUM1-SMMA1+CLOSE(i))/N
其中。
SUM1--是N个时期的收盘价的总和。
SMMA1--是第一个条形图的平滑移动平均线。
SMMA(i)--是当前条形的平滑移动平均线(第一个条形除外)。
CLOSE(i)--是当前的收盘价。
N - 是平滑期。
所以我想iMa和自定义移动平均线是以正确的方式进行的。但是这样的计算会产生我们所遇到的错误,导致根据测试周期的不同而产生巨大的差异。对于一个以移动平均线为交易基础的EA来说,这是完全不能接受的。我想我将不得不为此从我的EA中取消平滑MA,因为它在回测时产生错误的结果。即使从2000年开始测试并得到正确的结果,客户可能会从2013年开始测试并说 "它抹去了账户",因为他们会得到比我更多的SSMA。
还有一句话。
SMMA给予近期价格与历史价格同等的权重。计算时考虑到所有可用的数据系列,而不是参考一个固定的时期。
这就是为什么每次回测期的变化都是不同的。
请不要在引言中回复。如你所见,当我想引用你的话时,现在是空的。
这个算法对SMMA是好的,你必须从某个地方开始。但是你指出了问题的根源,因为SMMA是建立在先前的价值上的,它对开始条件很敏感。因为你在真实图表和策略测试器上 没有相同的起始蜡烛,这解释了不同的值。
EMA也是如此,在第二次检查后(在D1),我现在也有不同的值,和SMMA一样。
从该网站。
https://mahifx.com/indicators/smoothed-moving-average-smma
平滑移动平均线的第一个值是按简单移动平均线(SMA)计算的。
sum1=sum (close, n)
smma1 = sum1/ n
第二条及以后的移动平均线是按照这个公式计算的。
SMMA(i)=(SUM1-SMMA1+CLOSE(i))/N
其中。
SUM1--是N个时期的收盘价的总和。
SMMA1--是第一个条形图的平滑移动平均线。
SMMA(i)--是当前条形的平滑移动平均线(第一个条形除外)。
CLOSE(i)--是当前的收盘价。
N - 是平滑期。
所以我想iMa和自定义移动平均线的方式是正确的。但是这样的计算会产生我们所遇到的错误,导致根据测试周期的不同而产生巨大的差异。这对于一个以移动平均线为交易基础的EA来说是完全不能接受的。我想我将不得不为此从我的EA中取消平滑MA,因为它在回测时产生错误的结果。即使从2000年开始测试并得到正确的结果,客户可能会从2013年开始测试,并说 "它抹去了账户",因为他们会得到比我更多的SSMA。
谢谢你的链接。这证实了我之前的帖子。这非常有趣,因为我从来没有注意过这种事情。
通过检查EMA的算法,它对这样的问题也很敏感,我不知道为什么我的第一次测试得到了相同的值。