簡體   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