繁体   English   中英

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

[英]Convert Reverse Moving Average Formula to C#

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

REMA公式 在此输入图像描述
我做得很好,但不是数学。

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

与给出最近价格更大权重的常规指数移动平均线相反,反向指数移动平均线为最早的价格分配更大的权重并降低最近价格的重要性。

高效的REMA() 具有错误检查和特定于上下文的返回值

高效? 是的,避免重复重复的昂贵操作(或依赖编译器优化技巧)

有错误检查? 是的,几乎是Q / A程序的必备条件。

上下文的具体情况? 是的,返回{ -1. | REMA( k, lambda ) } { -1. | REMA( k, lambda ) } { -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
}

在我看来,这是一个总和除以另一个。 这是我尝试直截了当的答案。 我的结果肯定是对列表中较早的条目更加重视的平均值,但我并不认为它们是否正确。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM