1

我有一个像这样的结构:

struct ohlc{
    double open,high,low,close;
};

我的应用程序的一部分使用了这些集合。有时带有时间戳。我的应用程序的另一部分使用需要双精度数组的第三方(封闭)库,例如 close[] 或 open[] 等。

返回 open[]、close[] 等双数组的最合适的容器和方法是什么。目前,我使用向量并遍历整个集合来创建数组。有没有更有效的方法。

我什至可能对我当前使用的结构完全错误?我所拥有的是出价/要价的价格信息。我尝试维护 M1、M5、M15 和 H1 蜡烛棒的集合,即 OHLC 数据。通常我只需要 100 小时的数据。随着新一分钟的价格出现,我可以删除最旧的一分钟,从而随时保留 100 小时的数据。由于 H1、M15、M5、M1 都可以从带有时间戳的询价/买入价的基础数据中创建,出于性能原因,我是否还需要持有独立的 H1、M15 等。我问这是因为它是重复数据吗?

编辑:我目前的方法对于我通常的目的来说很好,但现在我正在“回测”,我在我的代码中抛出了数百万的买入/卖出价格,并且需要它尽可能高效。回溯测试目前可能需要数小时才能执行

我从我的结构集合中返回如下:

std::vector<double> Series::EODSeries::open( const_iterator iter, unsigned long num ) const
{
  vector<double> v;

  if( iter == end() )
    return v;

  // reverse iterator init skips the first element in collection. We must manually insert the current element.
  v.insert(v.begin(), iter->second.open);
  unsigned i = 1;
  for( const_reverse_iterator rev_iter(iter); i < num && rev_iter != rend(); ++rev_iter, ++i )
    v.insert(v.begin(), rev_iter->second.open);

  return v; 
}
4

1 回答 1

3

你说第三方应用程序需要双精度数组,但这有点误导,因为数组不能作为 C++ 中的参数——它们总是衰减为指针。

所以你可以做的就是简单地将指针传递给你的向量的第一个参数。这保证有效。

// Assuming the following signature:
void the_method(double arg[]);
// is actually the same as:
// void the_method(double* arg);

std::vector<double> open; // your vector
the_method(&open[0]);

但是,如果我误解了你,而你实际上有一个,std::vector<ohlc>那么你基本上就不走运了——你确实需要将这个向量的元素中的openandclose成员复制到它自己的容器中。但即使在这里,我也建议您vector在代码中使用 a,而不是 C 数组。

于 2012-06-02T08:11:21.817 回答