-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtradestats.go
189 lines (161 loc) · 7.9 KB
/
tradestats.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
package iss
import (
"errors"
"fmt"
"log/slog"
"net/http"
)
/*
https://moexalgo.github.io/des/supercandles/
// все за заданный день
https://iss.moex.com/iss/datashop/algopack/eq/tradestats.json?date=2024-04-17
// заданная акция за период
https://iss.moex.com/iss/datashop/algopack/eq/tradestats/SBER.json?from=2024-08-30&till=2024-09-03&latest=1
datashop/algopack/eq/tradestats
/datashop/algopack/eq/obstats
eq = акции
fo = фьючерсы
fx = валюта
*/
// TradeStats
type TradeStats struct {
TradeDate string `csv:"tradedate" json:"tradedate"` // дата сделки
TradeTime string `csv:"tradetime" json:"tradetime"` // время сделки
SecID string `csv:"secid" json:"secid"` // код инструмента
AssetCode string `csv:"asset_code" json:"asset_code"` // Код базового актива (для фьючерсов)
Open float64 `csv:"pr_open" json:"pr_open"` // цена открытия
High float64 `csv:"pr_high" json:"pr_high"` // максимальная цена за период
Low float64 `csv:"pr_low" json:"pr_low"` // минимальная цена за период
Close float64 `csv:"pr_close" json:"pr_close"` // последняя цена за период
Std float64 `csv:"pr_std" json:"pr_std"` // стандартное отклонение цены
Volume int64 `csv:"vol" json:"vol"` // объем в лотах
Value float64 `csv:"val" json:"val"` // объем в рублях
Trades int64 `csv:"trades" json:"trades"` // количество сделок
Vwap float64 `csv:"pr_vwap" json:pr_vwap"` // взвешенная средняя цена
Change float64 `csv:"pr_change" json:"pr_change"` // изменение цены за период, %
TradesBuy int64 `csv:"trades_b" json:"trades_b"` // кол-во сделок на покупку
TradesSell int64 `csv:"trades_s" json:"trades_s"` // кол-во сделок на продажу
ValueBuy float64 `csv:"val_b" json:"val_b"` // объем покупок в рублях
ValueSell float64 `csv:"val_s" json:"val_s"` // объем продаж в рублях
VolumeBuy int64 `csv:"vol_b" json:"vol_b"` // объем покупок в лотах
VolumeSell int64 `csv:"vol_s" json:"vol_s"` // объем продаж в лотах
Disb float64 `csv:"disb" json:"disb"` // соотношение объема покупок и продаж
VwapBuy float64 `csv:"pr_vwap_b" json:"pr_vwap_b"` // средневзвешенная цена покупки
VwapSell float64 `csv:"pr_vwap_s" json:"pr_vwap_s"` // средневзвешенная цена продажи
OiOpen int64 `csv:"oi_open" json:"oi_open"` // ОИ на открытии (для фьючерсов)
OiHigh int64 `csv:"oi_high" json:"oi_high"` // максимальный ОИ (для фьючерсов)
OiLow int64 `csv:"oi_low" json:"oi_low"` // минимальный ОИ (для фьючерсов)
OiClose int64 `csv:"oi_close" json:"oi_close"` // ОИ на закрытии (для фьючерсов)
SYSTIME string `csv:"SYSTIME" json:"SYSTIME"` // время системы
}
// TradeStatsService сервис для получения супер свечей (TradeStats)
type TradeStatsService struct {
client *Client
issRequest *IssRequest
}
// NewTradeStatsService создание сервиса
// или все за заданную дату symbol == "" + указана date
// или по одному символу за период symbol != "" + указаны from, to (если не указаны = то за текущий день)
func (c *Client) NewTradeStatsService(markets, symbol string, from, to string, date string, latest bool) *TradeStatsService {
// eq = акции
iss := NewIssRequest().
AlgoPackMarkets(markets).
AlgoPack("tradestats").
Target(symbol).
From(from).
To(to).
Date(date).
Latest(latest).
Json().MetaData(false)
return &TradeStatsService{
client: c,
issRequest: iss,
}
}
// Next загружает следующую страницу данных
// Если данных больше нет, то возвращается ошибка EOF
// TODO что возвращать данные или ссылку?
func (s *TradeStatsService) Next() ([]TradeStats, error) {
var err error
const op = "TradeStatsService.Next"
r := &request{
method: http.MethodGet,
fullURL: s.issRequest.URL(),
}
var resp Response
err = s.client.getJSON(r, &resp)
if err != nil {
slog.Error(op+".getJSON", "err", err.Error())
return nil, fmt.Errorf("%s: %w", op, err)
}
result := make([]TradeStats, 0, len(resp.Data.Data))
err = Unmarshal(resp.Data.Columns, resp.Data.Data, &result)
if err != nil {
slog.Error(op+".Unmarshal", "err", err.Error())
return nil, fmt.Errorf("%s: %w", op, err)
}
// TODO поменять на константу (не равную 0. а к примеру 10)
if len(result) == 0 {
//if len(result) < 10 {
return result, EOF
}
//s.client.log.Debug(op,
// "len(result)", len(result),
// "mindate", result[0].Begin,
// "maxdate", result[len(result)-1].Begin,
//)
// увеличим параметр start на кол-во полученных данных
s.issRequest.start += len(result)
s.client.log.Debug(op, "s.issRequest.start", s.issRequest.start)
return result, nil
}
// Do выполняет выгрузку свечей
func (s *TradeStatsService) Do() ([]TradeStats, error) {
const op = "TradeStatsService.Do"
result := make([]TradeStats, 0)
count := 1
for {
// "fetch candles: item(s) processed"
s.client.log.Debug(op, "запрос свечей: номер запроса", count)
t_result, err := s.Next()
if err != nil {
if errors.Is(err, EOF) {
break
}
return result, fmt.Errorf("%s: %w", op, err)
}
result = append(result, t_result...)
count++
}
return result, nil
}
// GetStockTradeStats получим данные TradeStats по заданной акции
func (c *Client) GetStockTradeStats(symbol string, from, to string, latest bool) ([]TradeStats, error) {
service := c.NewTradeStatsService(AlgoPackStock, symbol, from, to, "", latest)
return service.Do()
}
// GetStockTradeStatsAll получим данные TradeStats по всем акция за заданный день
func (c *Client) GetStockTradeStatsAll(date string, latest bool) ([]TradeStats, error) {
service := c.NewTradeStatsService(AlgoPackStock, "", "", "", date, latest)
return service.Do()
}
// GetFortsTradeStats получим данные TradeStats по заданному фьючерсу
func (c *Client) GetFortsTradeStats(symbol string, from, to string, latest bool) ([]TradeStats, error) {
service := c.NewTradeStatsService(AlgoPackForts, symbol, from, to, "", latest)
return service.Do()
}
// GetStockTradeStatsAll получим данные TradeStats по всем фьючерсам за заданный день
func (c *Client) GetFortsTradeStatsAll(date string, latest bool) ([]TradeStats, error) {
service := c.NewTradeStatsService(AlgoPackForts, "", "", "", date, latest)
return service.Do()
}
// GetFxTradeStats получим данные TradeStats по заданной валюте
func (c *Client) GetFxTradeStats(symbol string, from, to string, latest bool) ([]TradeStats, error) {
service := c.NewTradeStatsService(AlgoPackFx, symbol, from, to, "", latest)
return service.Do()
}
// GetFxTradeStatsAll получим данные TradeStats по всем валютам за заданный день
func (c *Client) GetFxTradeStatsAll(date string, latest bool) ([]TradeStats, error) {
service := c.NewTradeStatsService(AlgoPackFx, "", "", "", date, latest)
return service.Do()
}