diff --git a/externals/EnjoLib b/externals/EnjoLib index f033601..4f8d7b9 160000 --- a/externals/EnjoLib +++ b/externals/EnjoLib @@ -1 +1 @@ -Subproject commit f03360108a0829228acb09513b277dcab68c4ca1 +Subproject commit 4f8d7b99f4bc013888f97ee7f953b054f31afea7 diff --git a/src/lib-base/src/CLI.cpp b/src/lib-base/src/CLI.cpp index de536e8..30419be 100644 --- a/src/lib-base/src/CLI.cpp +++ b/src/lib-base/src/CLI.cpp @@ -20,9 +20,11 @@ EnjoLib::Result CLI::GetConfigs(int argc, char ** argv) const const char * OPT_MIN_YEAR = "min-year"; const char * OPT_MAX_MONTH = "max-month"; const char * OPT_MAX_YEAR = "max-year"; - //const char * OPT_LATEST_DATE = "latest-date"; + const char * OPT_LATEST_DATE = "latest-date"; const char * OPT_SYMBOL = "sym"; const char * OPT_PERIOD = "per"; + const char * OPT_DATA_FILE = "data"; + const char * OPT_OUT_DIR = "out"; const char * OPT_LAGS = "lags"; const char * OPT_PER_SEASONAL = "per-seasonal"; @@ -33,9 +35,12 @@ EnjoLib::Result CLI::GetConfigs(int argc, char ** argv) const popState.AddInt(OPT_MIN_YEAR, "Start year"); popState.AddInt(OPT_MAX_MONTH, "End month"); popState.AddInt(OPT_MAX_YEAR, "End year"); + popState.AddBool(OPT_LATEST_DATE, "Select latest date"); popState.AddStr(OPT_SYMBOL, "Symbol name"); popState.AddStr(OPT_PERIOD, "Period name"); - + popState.AddStr(OPT_DATA_FILE, "Data file"); + popState.AddStr(OPT_OUT_DIR, "Output directory"); + popState.AddInt(OPT_LAGS, ConfigTS::DESCR_PLOT_LAGS_NUM); popState.AddInt(OPT_PER_SEASONAL, ConfigTS::DESCR_PLOT_PERIOD_NUM); @@ -75,11 +80,17 @@ EnjoLib::Result CLI::GetConfigs(int argc, char ** argv) const confSym.dates.yearStart = pops.GetIntFromMap(OPT_MIN_YEAR); confSym.dates.monthEnd = pops.GetIntFromMap(OPT_MAX_MONTH); confSym.dates.yearEnd = pops.GetIntFromMap(OPT_MAX_YEAR); + if (pops.GetBoolFromMap(OPT_LATEST_DATE)) + { + confSym.dates.SetNoEnd(); + } confSym.symbol = pops.GetStrFromMap(OPT_SYMBOL); confSym.period = pops.GetStrFromMap(OPT_PERIOD); + confSym.dataFile = pops.GetStrFromMap(OPT_DATA_FILE); confTS.PLOT_LAGS_NUM = pops.GetIntFromMap(OPT_LAGS); confTS.PLOT_PERIOD_NUM = pops.GetIntFromMap(OPT_PER_SEASONAL); + confTS.m_outDir = pops.GetStrFromMap(OPT_OUT_DIR); //auto pluginName = pops.GetStrFromMap (OPT_PLUGIN); diff --git a/src/lib-base/src/ConfigSym.cpp b/src/lib-base/src/ConfigSym.cpp index 6c85396..cd6dd03 100644 --- a/src/lib-base/src/ConfigSym.cpp +++ b/src/lib-base/src/ConfigSym.cpp @@ -60,6 +60,7 @@ void ConfigSym::UpdateFromOther(const ConfigSym & cfgSymCmdLine) dates.UpdateIfNot0(cfgSymCmdLine.dates); if (cfgSymCmdLine.symbol.size()) symbol = cfgSymCmdLine.symbol; if (cfgSymCmdLine.period.size()) period = cfgSymCmdLine.period; + if (cfgSymCmdLine.dataFile.size()) dataFile = cfgSymCmdLine.dataFile; } /* diff --git a/src/lib-base/src/ConfigSym.h b/src/lib-base/src/ConfigSym.h index 4b6010c..7f178cb 100644 --- a/src/lib-base/src/ConfigSym.h +++ b/src/lib-base/src/ConfigSym.h @@ -44,7 +44,7 @@ class ConfigSym : public ConfigBase DataDates dates; long int percentBars = 100; long int barNum = 0; - EnjoLib::Str symbol, period; + EnjoLib::Str symbol, period, dataFile; protected: EnjoLib::Str GetFileNameProt() const override; diff --git a/src/lib-base/src/ConfigTS.cpp b/src/lib-base/src/ConfigTS.cpp index f8d2c50..e67463c 100644 --- a/src/lib-base/src/ConfigTS.cpp +++ b/src/lib-base/src/ConfigTS.cpp @@ -58,6 +58,7 @@ void ConfigTS::RegisterAndReadStrs(EnjoLib::Istream & f) RegisterAndReadStr(f, m_scriptPathTxt, dirs.DIR_SCRIPTS2 + DEFAULT_SCRIPT_FILE_NAME); RegisterAndReadStr(f, m_scriptPathTxtR, dirs.DIR_SCRIPTS2 + DEFAULT_SCRIPT_FILE_NAME_R); RegisterAndReadStr(f, m_scriptPathTxtGen, dirs.DIR_SCRIPTS2 + DEFAULT_SCRIPT_FILE_NAME_GEN); + //RegisterAndReadStr(f, m_outDir, ""); } PredictorType ConfigTS::GetPredType() const @@ -81,6 +82,8 @@ void ConfigTS::SetPriceType(const PriceType & type) void ConfigTS::UpdateFromOther(const ConfigTS & cfgTSCmdLine) { + if (cfgTSCmdLine.m_outDir.size()) m_outDir = cfgTSCmdLine.m_outDir; + if (cfgTSCmdLine.PLOT_LAGS_NUM > 0) { PLOT_LAGS_NUM = cfgTSCmdLine.PLOT_LAGS_NUM; diff --git a/src/lib-base/src/ConfigTS.h b/src/lib-base/src/ConfigTS.h index b960488..8076c17 100644 --- a/src/lib-base/src/ConfigTS.h +++ b/src/lib-base/src/ConfigTS.h @@ -36,6 +36,8 @@ class ConfigTS : public ConfigBase EnjoLib::Str m_scriptPathTxt; EnjoLib::Str m_scriptPathTxtR; EnjoLib::Str m_scriptPathTxtGen; + EnjoLib::Str m_outDir; + bool crashOnRecoverableErrors = false; bool PLOT_SERIES = true; bool PLOT_BASELINE = true; diff --git a/src/lib-base/src/DataDates.cpp b/src/lib-base/src/DataDates.cpp index 9e4f938..685715f 100644 --- a/src/lib-base/src/DataDates.cpp +++ b/src/lib-base/src/DataDates.cpp @@ -1,4 +1,5 @@ #include "DataDates.h" +#include "TimeUtil.h" #include @@ -15,6 +16,13 @@ void DataDates::Set0() yearStart = yearEnd = monthStart = monthEnd = 0; } +void DataDates::SetNoEnd() +{ + const TimeUtil tut; + monthEnd = tut.GetCurrentMonth(); + yearEnd = tut.GetCurrentYear(); +} + EnjoLib::Str DataDates::ToStr() const { EnjoLib::Osstream oss; diff --git a/src/lib-base/src/DataDates.h b/src/lib-base/src/DataDates.h index ec9f9be..7f7cd64 100644 --- a/src/lib-base/src/DataDates.h +++ b/src/lib-base/src/DataDates.h @@ -10,6 +10,7 @@ class DataDates virtual ~DataDates() {} void Set0(); + void SetNoEnd(); void SetStart(int year, int month); void SetEnd(int year, int month); void UpdateIfNot0(const DataDates & other); diff --git a/src/lib-base/src/MainTester.cpp b/src/lib-base/src/MainTester.cpp index d28e040..0a559af 100644 --- a/src/lib-base/src/MainTester.cpp +++ b/src/lib-base/src/MainTester.cpp @@ -46,18 +46,25 @@ MainTester::MainTester(const SymbolFactoryAbstract & symFact, const ConfigTF2 * { if (confSym) { - const DataSrcType type = confSym->GetDataSrc(); - switch (type) + if (not confSym->dataFile.empty()) { - case DataSrcType::FOREX_TESTER: - m_tickProvType = TickProviderType::ARCHIVER; - break; - case DataSrcType::MONERO: - m_tickProvType = TickProviderType::XMR; - break; - case DataSrcType::GENERATED: - m_tickProvType = TickProviderType::GENERATED; - break; + m_tickProvType = TickProviderType::DATA_FILE; + } + else + { + const DataSrcType type = confSym->GetDataSrc(); + switch (type) + { + case DataSrcType::FOREX_TESTER: + m_tickProvType = TickProviderType::ARCHIVER; + break; + case DataSrcType::MONERO: + m_tickProvType = TickProviderType::XMR; + break; + case DataSrcType::GENERATED: + m_tickProvType = TickProviderType::GENERATED; + break; + } } } } diff --git a/src/lib-base/src/PredictorOutputType.h b/src/lib-base/src/PredictorOutputType.h index 68f3ae6..5e19c5e 100644 --- a/src/lib-base/src/PredictorOutputType.h +++ b/src/lib-base/src/PredictorOutputType.h @@ -7,6 +7,10 @@ enum class PredictorOutputType SERIES, PREDICTION, BASELINE, + SEASONAL, + MA, + MA2DIFF, + MA2DIFF_NO_SEASONAL, RECONSTRUCTION, RECONSTRUCTION_PRED, RECONSTRUCTION_PRED_BASELINE diff --git a/src/lib-base/src/PredictorSMAMA.cpp b/src/lib-base/src/PredictorSMAMA.cpp index 3dd606d..42ca1a3 100644 --- a/src/lib-base/src/PredictorSMAMA.cpp +++ b/src/lib-base/src/PredictorSMAMA.cpp @@ -10,7 +10,7 @@ using namespace EnjoLib; PredictorSMAMA::PredictorSMAMA(const IDataProvider & dat) : PredictorBase(dat, "SMAMA_MA") -, m_lagMine(dat, "LAG_SMAMA", true, 10, 1, 50, 1) +, m_lagMine(dat, "LAG_SMAMA", true, 10, 1, 150, 1) { AddOptiVar(m_lagMine); } @@ -24,7 +24,7 @@ EnjoLib::VecD PredictorSMAMA::PredictVec(const EnjoLib::VecD & data) const const EnjoLib::VecD & predSma = util.SimpleMA(numSamplesSma, data); const EnjoLib::VecD & errors = util.GetErrorsCorrected(predSma, data); const EnjoLib::VecD & predMA = util.Regression(numSamplesMA, errors); - const EnjoLib::VecD & SMAMA = predSma + predMA; + const EnjoLib::VecD & SMAMA = predSma;// + predMA; return SMAMA; } diff --git a/src/lib-base/src/PredictorStats.cpp b/src/lib-base/src/PredictorStats.cpp index 30f94bc..e7df77e 100644 --- a/src/lib-base/src/PredictorStats.cpp +++ b/src/lib-base/src/PredictorStats.cpp @@ -61,6 +61,9 @@ PredictorStatsRes PredictorStats::GenPoints(const EnjoLib::VecD & orig, const En res.rmsBase2Truth = stat.RMSTwo(predBaseline, orig); /// TODO: different readouts with diffs and without res.rmsPred2Base = stat.RMSTwo(predCorrected, predBaseline); res.rmsPred2Truth = stat.RMSTwo(predCorrected, orig); + //res.rmsBase2Truth = (predBaseline - orig).Mean(); /// TODO: different readouts with diffs and without + //res.rmsPred2Base = (predCorrected - predBaseline).Mean(); + //res.rmsPred2Truth = (predCorrected - orig).Mean(); if (res.rmsBase2Truth != 0) { diff --git a/src/lib-base/src/Seasonal.cpp b/src/lib-base/src/Seasonal.cpp new file mode 100644 index 0000000..fd199e2 --- /dev/null +++ b/src/lib-base/src/Seasonal.cpp @@ -0,0 +1,165 @@ +#include "Seasonal.h" +#include "IDataProvider.h" +#include "IBufferCandles.h" +#include "Candle.h" +#include "typesVec.h" + +#include +#include +#include + +#include + + +using namespace EnjoLib; + +const int Seasonal::PERIOD_SEASONAL = 24; /// TODO: Exclude Weekend! Iterate by date? + +/* +Seasonal::Seasonal() +{ + //ctor +} + +Seasonal::~Seasonal() +{ + //dtor +} +*/ + + +VecF Seasonal::Run(const VecD & sig, int pred) const +{ + const int period = PERIOD_SEASONAL; + //const int maxNumObs = 1; /// TODO: This is the original signal + //const int maxNumObs = 50; /// TODO: This is already a model + const int maxNumObs = m_averages; + const Statistical stat; + const VecCan & canVec = m_dat.GetCandles().GetDataVec(); + //Matrix obs(period); + + VecF ret; + for (int i = 0; i < sig.size(); ++i) + { + if (i < period) + { + ret.Add(0); + } + else + { + const Candle & canThis = canVec.at(i); + + VecD obsV(period); + for (int j = i - 1; j >= pred; j -= 1) + //for (int j = i; j >= period; j -= period) + { + const Candle & canTest = canVec.at(j); + if (not IsSeasonalCandle(canThis, canTest)) + { + continue; + } + //LOGL << "Found can = " << canTest.GetDateStr() << " for this " << canThis.GetDateStr() << Nl; + const double diff = sig.at(j) - sig.at(j-pred); + //const double diff = sig.at(j) - sig.at(j-period); + const int idx = j % period; + obsV.Add(diff); + if (int(obsV.size()) >= maxNumObs) + { + break; + } + } + const double val = obsV.Mean(); + //const double val = stat.Median(obsV); + ret.Add(val); + } + + + } + //ret = sig; + //LOGL << "Len ret = " << ret.Len() << ", sig = " << sig.Len() << Nl; + return ret; +} + +int Seasonal::FindOffsetToSeasonalCandle(int idxStart0, const VecCan & vecCan) +{ + const Candle & canThis = vecCan.at(idxStart0); + for (int j = idxStart0 - 1; j >= 0; j -= 1) + { + const Candle & canTest = vecCan.at(j); + if (not IsSeasonalCandle(canThis, canTest)) + { + continue; + } + return j; + } + return -1; +} + +bool Seasonal::IsSeasonalCandle(const Candle & canThis, const Candle & canTest) +{ + return canThis.GetHour() == canTest.GetHour(); +} + +VecF SeasonalModel::Run(const VecD & sig, int pred) const +{ + const VecF & base = Seasonal::Run(sig, pred); + return base * m_averages * 0.7; +} + +double SeasonalModel::PredictNext(const BufferDouble & datExpanding) const +{ + return Run(datExpanding.GetData()).Last(); +} +unsigned SeasonalModel::GetLags() const +{ + return PERIOD_SEASONAL; +} + + +VecF SeasonalModel2::Run(const VecD & sig, int pred) const +{ + const int pers = Seasonal::PERIOD_SEASONAL; + const VecF & base = m_model.Run(sig, pred); + VecF ret(base.size(), 0); + for (int i = pred; i < 2 ; ++i) + { + const float val = base[i]; + //ret.push_back(val); + } + for (int i = pers; i < base.size() - pred; ++i) + { + //const float val = base.at(i + pred); + //ret.push_back(val); + } + + for (int i = pers; i < base.size(); ++i) + { + if (i < base.size() - 1) + { + const float val = base.at(i - pers + 1); + ret.at(i) = val; + } + else + { + const float val = base.at(i); + //ret.push_back(val); + ret.at(i) = val; + } + + } + //ret.pop_front(); + //ret.pop_back(); + //LOGL << "Seasonal2 = " << ret.Print(); + //ret = base; + return ret; +} + +double SeasonalModel2::PredictNext(const BufferDouble & datExpanding) const +{ + return Run(datExpanding.GetData()).Last(); +} +unsigned SeasonalModel2::GetLags() const +{ + return Seasonal::PERIOD_SEASONAL - 1; +} + diff --git a/src/lib-base/src/Seasonal.h b/src/lib-base/src/Seasonal.h new file mode 100644 index 0000000..c9f568d --- /dev/null +++ b/src/lib-base/src/Seasonal.h @@ -0,0 +1,72 @@ +#ifndef SEASONAL_H +#define SEASONAL_H + +#include "PredictorBase.h" + +/* +class Seasonal +{ + public: + Seasonal(); + virtual ~Seasonal(); + + protected: + + private: +}; +*/ +class Seasonal +{ +public: + Seasonal(const IDataProvider & dat, int averages = 1) + : m_averages(averages) + , m_dat(dat) + {} + virtual ~Seasonal(){} + + virtual EnjoLib::VecF Run(const EnjoLib::VecD & sig, int pred = 1) const; + + static int FindOffsetToSeasonalCandle(int idxStart0, const VecCan & vecCan); + static bool IsSeasonalCandle(const Candle & canThis, const Candle & canTest); + static const int PERIOD_SEASONAL; +protected: + int m_averages = 1; + const IDataProvider & m_dat; +}; + +class SeasonalModel : public Seasonal, public PredictorBase +{ + public: + SeasonalModel(const IDataProvider & dat, int averages) + : Seasonal(dat, averages) + , PredictorBase(dat, "SeasonalH1") + {} + virtual ~SeasonalModel(){} + + double PredictNext(const BufferDouble & datExpanding) const override; + unsigned GetLags() const override; + + EnjoLib::VecF Run(const EnjoLib::VecD & sig, int pred = 1) const override; +}; + +class SeasonalModel2 : public PredictorBase +{ + public: + SeasonalModel2(const IDataProvider & dat, const SeasonalModel & model) + : PredictorBase(dat, "SeasonalH1") + , m_model(model) + , m_dat(dat) + {} + virtual ~SeasonalModel2(){} + + const SeasonalModel & m_model; + const IDataProvider & m_dat; + + double PredictNext(const BufferDouble & datExpanding) const override; + unsigned GetLags() const override; + + EnjoLib::VecF Run(const EnjoLib::VecD & sig, int pred = 1) const; +}; + + +#endif // SEASONAL_H diff --git a/src/lib-base/src/TicksProviderFactory.cpp b/src/lib-base/src/TicksProviderFactory.cpp index 5c7937c..3d7780d 100644 --- a/src/lib-base/src/TicksProviderFactory.cpp +++ b/src/lib-base/src/TicksProviderFactory.cpp @@ -10,6 +10,7 @@ #include "TicksProviderGenerated.h" #include "TicksProviderAdaptive.h" #include "TicksProviderAdaptiveFake.h" +#include "TicksProviderTxtAdHoc.h" TickProviderFactory::TickProviderFactory(){} TickProviderFactory::~TickProviderFactory(){} @@ -28,6 +29,8 @@ CorPtr TickProviderFactory::Create(TickProviderType type) const return CorPtr(new TicksProviderXMRFake()); case TickProviderType::XMR: return CorPtr(new TicksProviderAdaptive()); + case TickProviderType::DATA_FILE: + return CorPtr(new TicksProviderTxtAdHoc()); case TickProviderType::ADAPTIVE: return CorPtr(new TicksProviderAdaptive()); case TickProviderType::ADAPTIVE_FAKE: diff --git a/src/lib-base/src/TicksProviderFactory.h b/src/lib-base/src/TicksProviderFactory.h index 70b27e7..4dd10cf 100644 --- a/src/lib-base/src/TicksProviderFactory.h +++ b/src/lib-base/src/TicksProviderFactory.h @@ -9,6 +9,7 @@ enum class TickProviderType ARCHIVER, SMALL, XMR, + DATA_FILE, GENERATED, XMR_FAKE, ADAPTIVE_FAKE, diff --git a/src/lib-base/src/TicksProviderTxtAdHoc.cpp b/src/lib-base/src/TicksProviderTxtAdHoc.cpp new file mode 100644 index 0000000..2e7ffa3 --- /dev/null +++ b/src/lib-base/src/TicksProviderTxtAdHoc.cpp @@ -0,0 +1,43 @@ +#include "TicksProviderTxtAdHoc.h" +#include "ConfigMan.h" +#include "ConfigSym.h" +#include "TicksFormatGuesser.h" +#include "TicksProviderXMR.h" +#include "ITicks.h" +#include "Tick.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace EnjoLib; + +TicksProviderTxtAdHoc::TicksProviderTxtAdHoc(){} +TicksProviderTxtAdHoc::~TicksProviderTxtAdHoc(){} + +CorPtr TicksProviderTxtAdHoc::GetTicks(const Str & symbolName, const ConfigSym * confSym) const +{ + const ConfigSym & cfgSym = *gcfgMan.cfgSym; + + Ifstream file(cfgSym.dataFile); + const Tokenizer tok; + Str line1st; + const VecStr & lines = tok.GetLines(file, true); + const TicksFormat fmt = TicksFormatGuesser().Run(lines); + if (fmt != TicksFormat::FMT_TIMESTAMP_VALUE) + { + Assertions::Throw(("Unhandled format:\n" + lines.at(0)).c_str(), "TicksProviderTxtAdHoc::GetTicks"); + } + const VecStr & linesConv = TicksProviderXMR().ConvertStat(lines); + + CorPtr ticks = ITicks::Create(); + for (const Str & line : linesConv) + { + ticks->Add(Tick(line)); + } + return CorPtr(ticks.release()); +} diff --git a/src/lib-base/src/TicksProviderTxtAdHoc.h b/src/lib-base/src/TicksProviderTxtAdHoc.h new file mode 100644 index 0000000..0b9d92c --- /dev/null +++ b/src/lib-base/src/TicksProviderTxtAdHoc.h @@ -0,0 +1,20 @@ +#ifndef TICKSPROVIDERTXTADHOC_H +#define TICKSPROVIDERTXTADHOC_H + +#include "TicksProviderGenerated.h" + + +class TicksProviderTxtAdHoc : public TicksProviderGenerated +{ + public: + TicksProviderTxtAdHoc(); + virtual ~TicksProviderTxtAdHoc(); + + CorPtr GetTicks(const EnjoLib::Str & symbolName, const ConfigSym * confSym = nullptr) const override; + + protected: + + private: +}; + +#endif // TICKSPROVIDERTXTADHOC_H diff --git a/src/lib-base/src/TimeUtil.cpp b/src/lib-base/src/TimeUtil.cpp new file mode 100644 index 0000000..0cf7646 --- /dev/null +++ b/src/lib-base/src/TimeUtil.cpp @@ -0,0 +1,38 @@ +#include "TimeUtil.h" + +#include +#include + +#include +#include +#include +#include + +TimeUtil::TimeUtil(){} +TimeUtil::~TimeUtil(){} + +int TimeUtil::GetCurrentHour() const +{ + return GetCurrentTimeComponent('H'); +} + +int TimeUtil::GetCurrentYear() const +{ + return GetCurrentTimeComponent('Y'); +} + +int TimeUtil::GetCurrentMonth() const +{ + return GetCurrentTimeComponent('m'); +} + +int TimeUtil::GetCurrentTimeComponent(const char fmt) const +{ + std::time_t t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + std::tm ltime; + localtime_r(&t, <ime); + EnjoLib::Osstream oss; + const EnjoLib::Str fmtStr = EnjoLib::Str("%") + fmt; + oss.OStr() << std::put_time(<ime, fmtStr.c_str()); + return EnjoLib::CharManipulations().ToInt(oss.str()); +} diff --git a/src/lib-base/src/TimeUtil.h b/src/lib-base/src/TimeUtil.h new file mode 100644 index 0000000..cc545c8 --- /dev/null +++ b/src/lib-base/src/TimeUtil.h @@ -0,0 +1,21 @@ +#ifndef TIMEUTIL_H +#define TIMEUTIL_H + + +class TimeUtil +{ + public: + TimeUtil(); + virtual ~TimeUtil(); + + int GetCurrentHour() const; + int GetCurrentYear() const; + int GetCurrentMonth() const; + int GetCurrentTimeComponent(const char fmt) const; + + protected: + + private: +}; + +#endif // TIMEUTIL_H diff --git a/src/qt-lib/src/PlotElements.cpp b/src/qt-lib/src/PlotElements.cpp index ada6f99..c591a0c 100644 --- a/src/qt-lib/src/PlotElements.cpp +++ b/src/qt-lib/src/PlotElements.cpp @@ -203,7 +203,17 @@ void PlotElements::SetupTechsVec(QCustomPlot * p, const IStrategy & strat, QCPAx void PlotElements::SetupTechsXform(QCustomPlot * p, const ISimulatorTS & simTS, QCPAxisRect *techRect, const PlotDataBase & d) { - SetupTSLine(p, techRect, d, simTS, PredictorOutputType::SERIES, QPen(Qt::blue), "Series"); + const ConfigQTPlot & confPlot = *gcfgMan.cfgQTPlot; + if (confPlot.MA) + { + Util::AddMA(d.GetTime(), Util::stdVectToQVectF(simTS.GetOutputSeries(PredictorOutputType::MA).Data()), p, Qt::green); + } + + SetupTSLine(p, techRect, d, simTS, PredictorOutputType::SEASONAL, QPen(Qt::green), "Seasonal"); + SetupTSLine(p, techRect, d, simTS, PredictorOutputType::MA2DIFF, QPen(Qt::green), "MA2diff"); + SetupTSLine(p, techRect, d, simTS, PredictorOutputType::MA2DIFF_NO_SEASONAL, QPen(Qt::blue), "MA2diff"); + + //SetupTSLine(p, techRect, d, simTS, PredictorOutputType::SERIES, QPen(Qt::blue), "Series"); //SetupTSLine(p, techRect, d, simTS, PredictorOutputType::PREDICTION, QPen(Qt::green), "Prediction"); //SetupTSLine(p, techRect, d, simTS, PredictorOutputType::BASELINE, QPen(Qt::gray), "Baseline"); } @@ -226,6 +236,10 @@ QCPGraph * PlotElements::SetupTSLine(QCustomPlot * p, QCPAxisRect *techRect, con newCurve->setPen(pen); const VecD & tsdata = simTS.GetOutputSeries(type); SetupTechLine(p, d, Util::stdVectToQVectF(tsdata.Data()), newCurve); + QCPItemText * txt = new QCPItemText(p); + txt->setText(name); + txt->position->setCoords(10, 10); + txt->setPen(pen); return newCurve; } diff --git a/src/tsqsim-lib/src/SimulatorTS.cpp b/src/tsqsim-lib/src/SimulatorTS.cpp index cee4875..ccb8ece 100644 --- a/src/tsqsim-lib/src/SimulatorTS.cpp +++ b/src/tsqsim-lib/src/SimulatorTS.cpp @@ -16,16 +16,21 @@ #include "PredictorType.h" #include "PredictorFactory.h" #include "PredictorOutputType.h" +#include "PredictorUtil.h" #include "BufferDouble.h" #include "Logic.h" +#include "Seasonal.h" +#include #include +#include #include #include #include #include #include #include +#include #include