我正在开发一个小型交易机器人作为练习。他日复一日地接收股票价格(表示为迭代)。
这是我的Trade
类的样子:
class Trade
{
private:
int capital_;
int days_; // Total number of days of available stock prices
int daysInTrading_; // Increments as days go by.
std::list<int> stockPrices_; // Contains stock prices day after day.
int currentStock_; // Current stock we are dealing with.
int lastStock_; // Last stock dealt with
int trend_; // Either {-1; 0; 1} depending on the trend.
int numOfStocks_; // Number of stocks in our possession
int EMA_; // Exponential Moving Average
int lastEMA_; // Last EMA
public:
// functions
};
正如您从我的最后两个属性中所看到的,我希望实现指数移动平均值,作为趋势跟踪算法的一部分。
但我想我不太明白如何实施它;这是我的calcEMA函数,它只计算EMA:
int Trade::calcEMA()
{
return ((this->currentStock_ - this->lastEMA_
* (2/(this->daysInTrading_ + 1)))
+ this->lastEMA_);
}
但是当我的股票价值(在文件中传递)是这样的:
1000, 1100, 1200, 1300, 1400, 1500, 1400, 1300, 1200, 1100, 1000
以确保我的均线是有意义的,嗯...它没有!
我在手术中哪里出错了?
另外,如果这是我第一次调用calcEMA,我应该给出什么值?
均线一般有两种公认的形式。
传统的:
m = 2/(1+n) // where n >= 1
EMA = m * currentPrice + (1-m) * previousEMA
rf the Wilder:
m = 1/n // where n >= 1
EMA Wilder = m * currentPrice + (1-m) * previousEMA
正如你所注意到的,操作是错误的。
免责声明我从维基百科上得到了这个算法,因此可能并不准确。此处(第3页)可能更好,但我无法判断,我从未使用过这些算法,因此不知道我在说什么:)
c(EMA)=y(EMA)a*(c(价格)-y(EMA))
但你几乎做了同样的事情:
<代码>c(均线)=(c(价格)-y(均线)*b)y(均线)
我不知道您为什么每天进行2次trading\u1,但这并不总是一个介于0和1之间的值(实际上,大多数情况下它甚至可能是0,因为它们都是整数)。
括号放错了位置(在b之后,而不是在y(EMA)之后)。
因此,操作现在将如下所示:
<代码>lastEMA\u0.5*(currentStock\u0-lastEMA\u0)
根据维基百科的说法,对于第一个
S1未定义。S1可以通过多种不同的方式初始化,最常见的是通过设置S11[列表中的第一个元素],尽管存在其他技术,例如将S1设置为前4或5个观察的平均值。
S1初始化对所得移动平均线的影响的重要性取决于α;较小的α值使S1的选择相对比较大的α值更重要,因为较高的α更快地折扣旧的观察结果。
我认为“calcEMA”函数中缺少括号。如何将表达式分解为具有临时变量的较小表达式,以保存这样的中间结果?
int Trade::calcEMA()
{
auto mult = 2/(timePeriod_ + 1);
auto rslt = (currentStock_ - lastEMA_) * mult + lastEMA_;
return rslt;
}
此外,正如用户PaulMcKenzie在对您的问题的评论中指出的那样,您正在使用整数进行浮点计算。您可以考虑使用float或double来避免可能的截断。
以下是我的建议:
这是我给你的代码:
#include <vector>
#include <list>
#include <iostream>
// calculate a moving average
double calcMA (double previousAverage,
unsigned int previousNumDays,
double newStock) {
auto rslt = previousNumDays * previousAverage + newStock;
return rslt / (previousNumDays + 1.0);
}
// calculate an exponential moving average
double calcEMA (double previousAverage,
int timePeriod,
double newStock) {
auto mult = 2.0 / (timePeriod + 1.0);
auto rslt = (newStock - previousAverage) * mult + previousAverage;
return rslt;
}
class Trade {
unsigned int timePeriod_ = 5;
double lastMA_ = 0.0;
std::list<double> stockPrices_;
public:
void addStock (double newStock) {
stockPrices_.push_back(newStock);
auto num_days = stockPrices_.size();
if (num_days <= timePeriod_)
lastMA_ = calcMA(lastMA_, num_days - 1, newStock);
else
lastMA_ = calcEMA(lastMA_, num_days - 1, newStock);
}
double getAverage() const { return lastMA_; }
};
// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
int main() {
std::vector<double> stocks =
{1000, 1100, 1200, 1300, 1400, 1500,
1400, 1300, 1200, 1100, 1000};
Trade trade;
for (auto stock : stocks)
trade.addStock(stock);
std::cout << "Average: " << trade.getAverage() << std::endl;
return 0;
}
问题内容: 我基本上有一个像这样的值数组: 上面的数组过于简化,我在实际代码中每毫秒收集1个值,我需要使用编写的算法处理输出,以找到某个时间点之前最接近的峰值。我的逻辑失败了,因为在上面的示例中,它是真正的峰值,但是我的算法会向后看,并看到最后一个数字是峰值,因为之前的数值减少了。 目标是获取这些值,并对它们应用一种算法,该算法将使它们“平滑”一些,以便获得更多的线性值。(即:我希望自己的成绩是弯
本文向大家介绍C语言实现窗口抖动,包括了C语言实现窗口抖动的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言窗口抖动的具体实现代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
问题内容: 我有一个日期范围,并且每个日期都有一个度量值。我想计算每个日期的指数移动平均值。有人知道怎么做这个吗? 我是python的新手。似乎没有将平均值内置到标准python库中,这让我感到有些奇怪。也许我找的地方不对。 因此,给定以下代码,如何计算日历日期的IQ点的移动加权平均值? (可能是一种更好的数据结构方式,任何建议将不胜感激) 问题答案: 编辑:看来SciKits(补充SciPy的附
本文向大家介绍C语言实现数字游戏,包括了C语言实现数字游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言数字游戏的具体代码,供大家参考,具体内容如下 问题描述 : 现在,有许多给小孩子玩的数字游戏,这些游戏玩起来简单,但要创造一个就不是那么容易的了。 在这,我们将介绍一种有趣的游戏。 你将会得到N个正整数,你可以将一个整数接在另一个整数之后以制造一个更大的整数。 例如,这有4
我也看过Pyspark中的加权移动平均线,但我需要一个Spark/Scala的方法,以及10天或30天的均线。 有什么想法吗?
本文向大家介绍C语言数组栈实现模板,包括了C语言数组栈实现模板的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言数组栈实现模板的具体代码,供大家参考,具体内容如下 SeqStack.h SeqStack.cpp 函数实现 数组栈测试程序 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。