我一直绞尽脑汁试图将这个公式转换为C#但没有成功。
REMA Formula。
我做得很好,但不是数学。
其中0 < λ≤1是衰减因子。
当λ<1时。 1,指数加权移动平均线为价格分配更大的权重。与提供更大的正常指数移动平均线相反 权重到最近的价格,反向指数移动 平均值为最旧的价格分配更大的权重 降低了最近价格的重要性。
答案 0 :(得分:2)
REMA()
,错误检查&amp;特定于上下文的返回值 高效?是的,避免重复重复的昂贵操作(或依赖编译器优化技巧)
进行错误检查?是的,几乎是Q / A程序的必备条件。
特定于上下文?是的,返回 { -1. | REMA( k, lambda ) }
,它允许调用者处理输入错误的极端情况。
double[] fTimeSeriesPRICE; // a forward-stepping storage ( vs. a MT4 reversed-stepping model )
public double REMA( int k, double lambda )
{
if ( lambda <= 0.0 // lambda shall not fall on/under 0.0
|| lambda > 1.0 // shall not grow beyond 1.0
|| k <= 0 // depth shall not be negative or 0
)
return -1.0; // context-protecting RET value
int aCurrentPricePTR = fTimeSeriesPRICE.Length - 1;
int aMaxIterableDEPTH = Math.Min( aCurrentPricePTR, k );
double numerator = 0.0;
double denominator = 0.0; // REMA formula-expansion contains +1 at the end, never less, never negative
double lambdator = 1.0; // lambda ^ ( ( k - j ) == 0 ) == 1.0
for ( int aReverseSteppingPTR = 0;
aReverseSteppingPTR <= aMaxIterableDEPTH;
aReverseSteppingPTR++
)
{ numerator += lambdator * fTimeSeriesPRICE[aCurrentPricePTR - aReverseSteppingPTR];
denominator += lambdator;
lambdator *= lambda;
}
return numerator / denominator; // numerically fair, denominator never < +1.0
}
答案 1 :(得分:1)
在我看来,这是一个由另一个除以的总和。这是我尝试直截了当的答案。我的结果肯定是对列表中较早的条目更加重视的平均值,但我不知道它们是否正确。
double[] m_prices;
public double Rema(int k, double lambda)
{
// Simple parameter validation
if(lambda == 0.0 || k == 0)
return 0.0;
// Ensure the iteration will not be larger than the number of entries
int t = m_prices.Length - 1;
k = Math.Min(t, k);
double numerator = 0;
double denominator = 0;
for (int j = 0; j <= k; j++)
{
// Preform the 2 sigma operations from the formula
numerator += Math.Pow(lambda, k-j) * m_prices[t - j];
denominator += Math.Pow(lambda, k-j);
}
// Simple error check
if (denominator == 0.0)
return 0.0;
return numerator / denominator;
}