将反向移动平均线公式转换为C#

时间:2016-01-22 00:30:44

标签: c# moving-average trading algorithmic-trading quantitative-finance

我一直绞尽脑汁试图将这个公式转换为C#但没有成功。

REMA Formulaenter image description here
我做得很好,但不是数学。

  

其中0 < λ≤1是衰减因子。
当λ<1时。 1,指数加权移动平均线为价格分配更大的权重。

     

与提供更大的正常指数移动平均线相反   权重到最近的价格,反向指数移动   平均值为最旧的价格分配更大的权重   降低了最近价格的重要性。

2 个答案:

答案 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;
}