我尝试用 C++ 编写自己的简单移动平均线
I tried coding my own simple moving average in C++
- 我想要一个有效的功能。
- 我相信我的逻辑是正确的,因此我的(向量超出范围错误)一定是由于不熟悉和正确使用代码造成的。
- 我知道这个相当简单的算法有很长的代码。
如果可以,请帮忙。
基本上,我将长度取为 "moving" window,因为它循环通过 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;
}
}
}
}
在最外层的 while 循环中,您永远不会更改 length
,因此您的函数将永远 运行。
然后,注意如果 length
是二,closes.size()
是四,那么 length + j - 1
就是 5,所以我的心理调试技巧告诉我你的 vector1
也是short 并且你索引结束。
您不需要 3 次循环来计算数据数组的移动平均值,您只需要 1 次。您遍历数组并跟踪最后 n 项的总和,然后调整它对于每个新值,每次添加一个值并删除一个值。
例如假设你有一个数据集:
4 8 1 6 9
并且您想计算 window 大小为 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
请注意,我们每次添加时,我们从第 3 次迭代开始减法(window 大小为 3)并在第 2 次迭代(window 大小减 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;
}
您可以调整它以使用您的矢量数据结构。
这个问题已经得到解答,但我想我会 post 为将来寻求信息的人完成代码。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<double> vector1 { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
double length;
cout << "Enter number days for your Simple Moving Average:" << endl;
cin >> length;
double sum = 0;
int cnt = 0;
for (int i = 0; i < vector1.size(); i++) {
sum += vector1[i];
cnt++;
if (cnt >= length) {
cout << "Your SMA: " << (sum / (double) length) << endl;
sum -= vector1[cnt - length];
}
}
return 0;
}
这与答案略有不同。引入了 'cnt' 变量以避免额外的 if 语句。
- 我想要一个有效的功能。
- 我相信我的逻辑是正确的,因此我的(向量超出范围错误)一定是由于不熟悉和正确使用代码造成的。
- 我知道这个相当简单的算法有很长的代码。 如果可以,请帮忙。
基本上,我将长度取为 "moving" window,因为它循环通过 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;
}
}
}
}
在最外层的 while 循环中,您永远不会更改 length
,因此您的函数将永远 运行。
然后,注意如果 length
是二,closes.size()
是四,那么 length + j - 1
就是 5,所以我的心理调试技巧告诉我你的 vector1
也是short 并且你索引结束。
您不需要 3 次循环来计算数据数组的移动平均值,您只需要 1 次。您遍历数组并跟踪最后 n 项的总和,然后调整它对于每个新值,每次添加一个值并删除一个值。
例如假设你有一个数据集:
4 8 1 6 9
并且您想计算 window 大小为 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
请注意,我们每次添加时,我们从第 3 次迭代开始减法(window 大小为 3)并在第 2 次迭代(window 大小减 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;
}
您可以调整它以使用您的矢量数据结构。
这个问题已经得到解答,但我想我会 post 为将来寻求信息的人完成代码。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<double> vector1 { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
double length;
cout << "Enter number days for your Simple Moving Average:" << endl;
cin >> length;
double sum = 0;
int cnt = 0;
for (int i = 0; i < vector1.size(); i++) {
sum += vector1[i];
cnt++;
if (cnt >= length) {
cout << "Your SMA: " << (sum / (double) length) << endl;
sum -= vector1[cnt - length];
}
}
return 0;
}
这与答案略有不同。引入了 'cnt' 变量以避免额外的 if 语句。