1

簡単な背景:

QCustomPlotバージョン 1.3 ベータ版を使用して、株式のローソク足チャートをプロットしようとしています。ライブラリのコードをスキップしたところ、時系列では type-def が使用されていることがわかりました (qcustomplot.h:line 3140)。

typedef QMap<double, QCPFinancialData> QCPFinancialDataMap;

QCPFinancialDataの場所(qcustomplot.h:line 3124)

class QCP_LIB_DECL QCPFinancialData
{
public:
  QCPFinancialData();
  QCPFinancialData(double key, double open, double high, double low, double close);
  double key, open, high, low, close;
};

したがって、OHLC データは明らかにそこにあり、クラスは QMap で使用されるキーを使用して時系列エントリのインデックスを作成します。

したがって、明らかなキーは日付と時刻になります (私は End-Of-Day チャートをプロットしているので、各エントリは単に日付であり、時間が使用されていません)。私の解析コードでは、私は使用しました

boost::gregorian::date

非常に多くの利点があります(文字列からの変換、経過した日時の計算など)。

質問は、単純に boost::gregorian::date を UNIX タイムスタンプに変換し、そのタイムスタンプを double として記録する必要があるかどうかです。github でtime_t型に変換する小さなテンプレート関数を見つけましたが、この場合 double は問題にならないと思いますか、それとも潜在的なバグですか? 私の知る限り、Unix のタイムスタンプは 1970 年 1 月 1 日からの秒数を示します。

QCustomPlot の例では、タイムスタンプではなく、時系列シーケンスの開始 (開始日など) からのアキュムレータ/カウンターを使用しています。

4

1 に答える 1

2

エポック以降のタイムスタンプは、エポック (1970 年 1 月 1 日など) からの秒数を格納するのに十分なスペースがあり、1 マイクロ秒を少し超える十分な解像度があるため、非常に便利に double に格納できます

たとえば、R は次のようにします。

R> now <- Sys.time()                    # get current date and time
R> now                                  # default format to test
[1] "2014-11-11 20:38:27.307228 CST"    # NB I have an option set for subsec.
R> as.integer(now)                      # as integer: seconds since epoch
[1] 1415759907
R> as.double(now)                       # as double under default precision
[1] 1415759907
R> print(as.double(now), digits=16)     # as double with forced higher prec.
[1] 1415759907.307228
R> 

私は常にこれらをdoubleC/C++ レイヤーで使用していました。そして、私が間違っていなければ、Boost に変換してもらうことができます。

編集:どこかにあることは知っていました:

boost::posix_time::ptime pt;        
// ... in what follows dt has subcomponents we can access
pt = boost::posix_time::ptime(boost::gregorian::date(dt.getYear(), 
                                                     dt.getMonth(), 
                                                     dt.getDay()), 
                              boost::posix_time::time_duration(dt.getHours(), 
                                                              dt.getMinutes(),
                                                              dt.getSeconds(), 
                                                 dt.getMicroSeconds()/1000.0));

time_tサブ秒を含む変換:

boost::posix_time::ptime dt = .... 


boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1)); 
boost::posix_time::time_duration x = dt - epoch;  // needs UTC to local corr.,
                                                  // but we get the fract. sec.
struct tm t = boost::posix_time::to_tm(dt);       // this helps with UTC conve.
time_t tt = mktime(&t) + 1.0 * x.fractional_seconds() / x.ticks_per_second()));
于 2014-11-12T02:42:27.183 に答える