mt4hstcvt

Форк
0
/
hstfmt.cpp 
97 строк · 2.4 Кб
1
#include <hstfmt.h>
2

3
namespace hst {
4

5
dataset::dataset(const std::string& path)
6
{
7
    m.f.open(path, std::ios_base::binary);
8
    if (!m.f) throw dataset_error("file open error");
9
    m.f.read(reinterpret_cast<char*>(&m.hdr), sizeof(header));
10
    if (!m.f) throw dataset_error("file read error");
11

12
    if (version() != MT4_509 && version() != MT4_574)
13
        throw dataset_error("file version error");
14

15
    m.f.seekg(0, std::ios_base::end);
16
    size_t flen = m.f.tellg();
17
    flen -= sizeof(header);
18
    m.count = flen / elem_size();
19
}
20

21
void dataset::update()
22
{
23
    m.f.seekg(0, std::ios_base::beg);
24
    if (!m.f) throw dataset_error("file position error");
25
    m.f.read(reinterpret_cast<char*>(&m.hdr), sizeof(header));
26
    if (!m.f) throw dataset_error("file read error");
27

28
    if (version() != MT4_509 && version() != MT4_574)
29
        throw dataset_error("file version error");
30

31
    m.f.seekg(0, std::ios_base::end);
32
    size_t flen = m.f.tellg();
33
    flen -= sizeof(header);
34
    m.count = flen / elem_size();
35
}
36

37
bar dataset::at(size_t index)
38
{
39
    if (index >= m.count)
40
        throw dataset_error("file indexing error");
41

42
    return this->operator[](index);
43
}
44

45
bar dataset::operator[](size_t index)
46
{
47

48
    std::streamoff off = elem_size() * index + sizeof(header);
49
    m.f.seekg(off, std::ios_base::beg);
50
    if (!m.f) throw dataset_error("file position error");
51

52
    bar result{};
53

54
    if (version() == MT4_574)
55
    {
56
        m.f.read(reinterpret_cast<char*>(&result), sizeof(bar));
57
    }
58
    else
59
    {
60
        bar_old tmp{};
61
        m.f.read(reinterpret_cast<char*>(&tmp), sizeof(bar_old));
62
        result.ctm = static_cast<datetime64>(tmp.ctm);
63
        result.volume = static_cast<decltype(result.volume)>(tmp.volume);
64
    }
65

66
    if (!m.f) throw dataset_error("file read error");
67

68
    return result;
69
}
70

71
void dataset::each(std::function<void(const bar&)> f)
72
{
73
    m.f.seekg(sizeof(header), std::ios_base::beg);
74
    if (!m.f) throw dataset_error("file position error");
75

76
    bar result{};
77
    while (!m.f.eof())
78
    {
79
        if (version() == MT4_574)
80
        {
81
            m.f.read(reinterpret_cast<char*>(&result), sizeof(bar));
82
        }
83
        else
84
        {
85
            bar_old tmp{};
86
            m.f.read(reinterpret_cast<char*>(&tmp), sizeof(bar_old));
87
            result.ctm = static_cast<datetime64>(tmp.ctm);
88
            result.volume = static_cast<decltype(result.volume)>(tmp.volume);
89
        }
90

91
        if (m.f.eof()) break;
92

93
        f(result);
94
    }
95
}
96

97
} // namespace
98

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.