1

私は次のような構造体を持っています:

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

私のアプリケーションの一部は、これらのコレクションを利用しています。たまにタイムスタンプ。私のアプリの別の部分では、close[] や open[] などの double の配列を必要とするサード パーティの (クローズド) ライブラリを使用しています。

open[]、close[] などの double 配列を返すのに最も適したコンテナーとメソッドは何でしょうか。現在、ベクトルを使用し、コレクション全体を反復処理して配列を作成しています。より効率的な方法はありますか。

構造体の現在の使用方法が完全に間違っている可能性さえありますか? 私が持っているのは、ビッド/アスク価格の価格フィードです。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

サードパーティのアプリケーションには double の配列が必要だとおっしゃっていますが、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>あなたは本質的に不運です - 実際、このベクトルの要素からopencloseのメンバーを独自のコンテナーにコピーする必要があります。ただし、ここでもvector、C 配列ではなく、コードで a を使用することをお勧めします。

于 2012-06-02T08:11:21.817 に答える