Skip to content

Commit b446e9a

Browse files
authored
Auto input format guessing (#63)
1 parent 0edb90e commit b446e9a

22 files changed

+464
-57
lines changed

src/lib-base/src/TicksFormat.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "TicksFormat.h"

src/lib-base/src/TicksFormat.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#ifndef TICKSFORMATS_H
2+
#define TICKSFORMATS_H
3+
4+
enum class TicksFormat
5+
{
6+
FMT_FX,
7+
FMT_ORDERED_SERIES,
8+
FMT_TIMESTAMP_VALUE,
9+
FMT_UNKNOWN
10+
};
11+
12+
#endif // TICKSFORMATS_H
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include "TicksFormatGuesser.h"
2+
3+
#include <Util/CoutBuf.hpp>
4+
#include <Util/Tokenizer.hpp>
5+
6+
using namespace EnjoLib;
7+
8+
TicksFormatGuesser::TicksFormatGuesser(){}
9+
TicksFormatGuesser::~TicksFormatGuesser(){}
10+
11+
TicksFormat TicksFormatGuesser::Run(const VecStr & lines) const
12+
{
13+
const Str & line = lines.at(1); // It's safer to assume that the 1st (index = 0) line is the header
14+
15+
const Str delims = ","; // Possibility to extend by other delims
16+
const char delim = delims.at(0);
17+
return Run(line, delim);
18+
}
19+
20+
TicksFormat TicksFormatGuesser::Run(const EnjoLib::Str & line, const char delim) const
21+
{
22+
const Tokenizer tok;
23+
const VecStr & tokens = tok.Tokenize(line, delim);
24+
const int len = tokens.size();
25+
ELO
26+
LOG << "TicksFormatGuesser: size = " << len << ", line = " << line << " ";
27+
if (len == 1)
28+
{
29+
LOG << "Ordered series\n";
30+
return TicksFormat::FMT_ORDERED_SERIES;
31+
}
32+
if (len == 2)
33+
{
34+
LOG << "Timestamp value\n";
35+
return TicksFormat::FMT_TIMESTAMP_VALUE;
36+
}
37+
if (len == 8)
38+
{
39+
LOG << "Timestamp OHLC\n";
40+
return TicksFormat::FMT_FX;
41+
}
42+
43+
LOG << "Unknown!\n";
44+
return TicksFormat::FMT_UNKNOWN;
45+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#ifndef TICKSFORMATGUESSER_H
2+
#define TICKSFORMATGUESSER_H
3+
4+
#include "TicksFormat.h"
5+
#include <Util/Str.hpp>
6+
#include "typesStr.h"
7+
8+
class TicksFormatGuesser
9+
{
10+
public:
11+
TicksFormatGuesser();
12+
virtual ~TicksFormatGuesser();
13+
14+
TicksFormat Run(const VecStr & lines) const;
15+
TicksFormat Run(const EnjoLib::Str & line, const char delim) const;
16+
17+
protected:
18+
19+
20+
private:
21+
};
22+
23+
#endif // TICKSFORMATGUESSER_H
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include "TicksProviderAdaptive.h"
2+
3+
#include "TicksFormat.h"
4+
#include "TicksProviderFake.h"
5+
#include "TicksProviderXMR.h"
6+
#include "TicksProviderOrderedSeries.h"
7+
#include "Ticks.h"
8+
#include "TradeUtil.h"
9+
#include "TicksFormatGuesser.h"
10+
11+
#include <Ios/Osstream.hpp>
12+
#include <Util/Str.hpp>
13+
#include <Util/Tokenizer.hpp>
14+
//#include <Template/LoopThreadedT
15+
16+
#include <Util/Str.hpp>
17+
#include <Util/Except.hpp>
18+
19+
using namespace EnjoLib;
20+
21+
TicksProviderAdaptive:: TicksProviderAdaptive(){}
22+
TicksProviderAdaptive::~TicksProviderAdaptive(){}
23+
24+
CorPtr<TicksProviderBinary> TicksProviderAdaptive::Create(const TicksFormat & format) const
25+
{
26+
switch (format)
27+
{
28+
case TicksFormat::FMT_FX:
29+
return CorPtr<TicksProviderBinary>(new TicksProviderBinary());
30+
case TicksFormat::FMT_ORDERED_SERIES:
31+
return CorPtr<TicksProviderBinary>(new TicksProviderOrderedSeries());
32+
case TicksFormat::FMT_TIMESTAMP_VALUE:
33+
return CorPtr<TicksProviderBinary>(new TicksProviderXMR());
34+
case TicksFormat::FMT_UNKNOWN:
35+
break;
36+
}
37+
throw EnjoLib::ExceptNotImpl("TicksProviderAdaptive::Create(): Not implemented type");
38+
}
39+
40+
VecStr TicksProviderAdaptive::Convert(const VecStr & raw) const
41+
{
42+
const TicksFormatGuesser guesser;
43+
const TicksFormat & format = guesser.Run(raw);
44+
const CorPtr<TicksProviderBinary> provider = Create(format);
45+
46+
return provider->Convert(raw);
47+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef TICKSPROVIDERADAPTIVE_H
2+
#define TICKSPROVIDERADAPTIVE_H
3+
4+
#include <TicksProviderBinary.h>
5+
6+
enum class TicksFormat;
7+
8+
class TicksProviderAdaptive : public TicksProviderBinary
9+
{
10+
public:
11+
TicksProviderAdaptive();
12+
virtual ~TicksProviderAdaptive();
13+
14+
protected:
15+
CorPtr<TicksProviderBinary> Create(const TicksFormat & format) const;
16+
VecStr Convert(const VecStr & raw) const override;
17+
18+
private:
19+
};
20+
21+
#endif // TICKSPROVIDERADAPTIVE_H
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#include "TicksProviderAdaptiveFake.h"
2+
3+
#include "TicksProviderFake.h"
4+
5+
TicksProviderAdaptiveFake::TicksProviderAdaptiveFake(){}
6+
TicksProviderAdaptiveFake::~TicksProviderAdaptiveFake(){}
7+
8+
9+
CorPtr<ITicks> TicksProviderAdaptiveFake::GetTicks(const EnjoLib::Str & symbolName, const ConfigSym * confSym) const
10+
{
11+
return CorPtr<ITicks>(TicksProviderFake().GetTicks(symbolName, confSym).release());
12+
}
13+
CorPtr<ITicks> TicksProviderAdaptiveFake::GetPeriod(const EnjoLib::Str & symbolName, const EnjoLib::Str & periodName) const
14+
{
15+
return CorPtr<ITicks>(TicksProviderFake().GetPeriod(symbolName, periodName).release());
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef TICKSPROVIDERADAPTIVEFAKE_H
2+
#define TICKSPROVIDERADAPTIVEFAKE_H
3+
4+
#include <ITicksProvider.h>
5+
6+
7+
class TicksProviderAdaptiveFake : public ITicksProvider
8+
{
9+
public:
10+
TicksProviderAdaptiveFake();
11+
virtual ~TicksProviderAdaptiveFake();
12+
13+
CorPtr<ITicks> GetTicks(const EnjoLib::Str & symbolName, const ConfigSym * confSym = nullptr) const override;
14+
CorPtr<ITicks> GetPeriod(const EnjoLib::Str & symbolName, const EnjoLib::Str & periodName) const override;
15+
16+
protected:
17+
18+
private:
19+
};
20+
21+
#endif // TICKSPROVIDERADAPTIVEFAKE_H

src/lib-base/src/TicksProviderBinary.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ class TicksProviderBinary : public ITicksProvider
1616
CorPtr<ITicks> GetTicks(const EnjoLib::Str & symbol, const ConfigSym * confSym = nullptr) const override;
1717
CorPtr<ITicks> GetPeriod(const EnjoLib::Str & symbolName, const EnjoLib::Str & periodName) const override;
1818

19-
protected:
2019
virtual VecStr Convert(const VecStr & lines) const;
20+
21+
protected:
22+
2123
private:
2224
CorPtr<ITicks> StoreOrRestore(const EnjoLib::Str & symbol, const EnjoLib::Str & fileName) const;
2325
void Archive(const EnjoLib::Str & symbol, const Ticks & t) const;

src/lib-base/src/TicksProviderFactory.cpp

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,30 @@
88
#include "TicksProviderXMR.h"
99
#include "TicksProviderFake.h"
1010
#include "TicksProviderGenerated.h"
11+
#include "TicksProviderAdaptive.h"
12+
#include "TicksProviderAdaptiveFake.h"
1113

12-
TickProviderFactory::TickProviderFactory()
13-
{
14-
//ctor
15-
}
16-
17-
TickProviderFactory::~TickProviderFactory()
18-
{
19-
//dtor
20-
}
14+
TickProviderFactory::TickProviderFactory(){}
15+
TickProviderFactory::~TickProviderFactory(){}
2116

22-
Corrade::Containers::Pointer<ITicksProvider> TickProviderFactory::Create(TickProviderType type) const
17+
CorPtr<ITicksProvider> TickProviderFactory::Create(TickProviderType type) const
2318
{
2419
switch (type)
2520
{
2621
case TickProviderType::ARCHIVER:
27-
return Corrade::Containers::Pointer<ITicksProvider>(new TicksProviderBinary());
22+
return CorPtr<ITicksProvider>(new TicksProviderAdaptive());
2823
case TickProviderType::SMALL:
29-
return Corrade::Containers::Pointer<ITicksProvider>(new TicksProviderFake());
24+
return CorPtr<ITicksProvider>(new TicksProviderFake());
3025
case TickProviderType::GENERATED:
31-
return Corrade::Containers::Pointer<ITicksProvider>(new TicksProviderGenerated());
26+
return CorPtr<ITicksProvider>(new TicksProviderGenerated());
3227
case TickProviderType::XMR_FAKE:
33-
return Corrade::Containers::Pointer<ITicksProvider>(new TicksProviderXMRFake());
28+
return CorPtr<ITicksProvider>(new TicksProviderXMRFake());
3429
case TickProviderType::XMR:
35-
return Corrade::Containers::Pointer<ITicksProvider>(new TicksProviderXMR());
30+
return CorPtr<ITicksProvider>(new TicksProviderAdaptive());
31+
case TickProviderType::ADAPTIVE:
32+
return CorPtr<ITicksProvider>(new TicksProviderAdaptive());
33+
case TickProviderType::ADAPTIVE_FAKE:
34+
return CorPtr<ITicksProvider>(new TicksProviderAdaptiveFake());
3635
}
3736
throw EnjoLib::ExceptRuntimeError("Not handled type ");
3837
}

0 commit comments

Comments
 (0)