我尝试用 C++ 编写我自己的简单移动平均线

mwf*_*234 0 c++ algorithm while-loop nested-loops moving-average

  1. 我想要一个有效的功能。
  2. 我相信我的逻辑是正确的,因此我的(向量超出范围错误)一定是由于不熟悉和正确使用代码所致。
  3. 我确实知道这个相当简单的算法有很长的代码。如果可以的话请帮忙。

基本上,我将长度作为“移动”窗口,因为它通过 j 循环到向量大小的末尾。这个向量充满了股票价格。

如果数字 1 2 3 4 的 2 天移动平均线的长度等于 2。我应该能够输出 1.5、2.5 和 3.5。但是,我收到超出范围的错误。

逻辑如代码所示。如果专家可以帮助我使用我正在尝试创建的这个简单的移动平均函数,那就太好了!谢谢。

void Analysis::SMA()
{

    double length;
    cout << "Enter number days for your Simple Moving Average:" << endl;
    cin >> length;
    double sum = 0;
    double a;
    while (length >= 2){
        vector<double>::iterator it;
        for (int j = 0; j < close.size(); j++){

                sum = vector1[length + j - 1] + vector1[length + j - 2];
                a = sum / length;
                vector2.push_back(a);

                vector<double>::iterator g;
                for (g = vector2.begin(); g != vector2.end(); ++g){

                    cout << "Your SMA: " << *g;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

sam*_*gak 6

您不需要 3 次循环来计算数据数组的移动平均值,您只需要 1 次。您遍历数组并跟踪最后 n 项的总和,然后针对每个新值对其进行调整,每次添加一个值并删除一个值。

例如,假设您有一个数据集:

4 8 1 6 9
Run Code Online (Sandbox Code Playgroud)

并且您想计算窗口大小为 3 的移动平均值,然后您保持这样的运行总数:

iteration add subtract running-total output average
0         4   -        4             - (not enough values yet)
1         8   -        12            -
2         1   -        13            13 / 3
3         6   4        15            15 / 3
4         9   8        16            16 / 3
Run Code Online (Sandbox Code Playgroud)

请注意,我们每次相加,从第 3 次迭代(窗口大小为 3)开始减去,并在第 2 次迭代(窗口大小减 1)时开始输出平均值。

所以代码将是这样的:

double runningTotal = 0.0;
int windowSize = 3;
for(int i = 0; i < length; i++)
{
     runningTotal += array[i];   // add
     if(i >= windowSize)
         runningTotal -= array[i - windowSize];   // subtract
     if(i >= (windowSize - 1))  // output moving average
         cout << "Your SMA: " << runningTotal / (double)windowSize;
}
Run Code Online (Sandbox Code Playgroud)

您可以调整它以使用您的矢量数据结构。