当前位置: 首页 > 知识库问答 >
问题:

在C语言中实现指数移动平均

欧阳翔
2023-03-14

我正在开发一个小型交易机器人作为练习。他日复一日地接收股票价格(表示为迭代)。

这是我的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,我应该给出什么值?

共有3个答案

颛孙和悌
2023-03-14

均线一般有两种公认的形式。

传统的:

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
宦翔
2023-03-14

正如你所注意到的,操作是错误的。

免责声明我从维基百科上得到了这个算法,因此可能并不准确。此处(第3页)可能更好,但我无法判断,我从未使用过这些算法,因此不知道我在说什么:)

c(EMA)=y(EMA)a*(c(价格)-y(EMA))

  • <代码>c(EMA)是当前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的选择相对比较大的α值更重要,因为较高的α更快地折扣旧的观察结果。

梁华皓
2023-03-14

我认为“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 函数实现 数组栈测试程序 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。