-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiss_request.go
390 lines (344 loc) · 9.87 KB
/
iss_request.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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
package iss
import (
"errors"
"net/url"
"path"
"strconv"
)
const (
FortsBoard = "RFUD" // фьючерсы
StockBoard = "TQBR" // акция
OptionsBoard = "ROPD" // опционы
AlgoPackStock = "eq" // акции
AlgoPackForts = "fo" // фьючерсы
AlgoPackFx = "fx" // валюта
)
var (
// EOF обозначает конец выгрузки
EOF = errors.New("end of data")
)
// IssRequest построитель запроса iss-moex
type IssRequest struct {
history bool // /history – данные итогов торгов.
engines string // trade_engine_name
markets string // market_name
boards string //
securities bool // securities
symbol string // один символ (после securities) для запроса "candle"
target string //
format string // формат данных json xml csv
// параметры запроса
symbols string // список инструментов для строки запроса
iss_only string // iss.only=block1,block2 = ответ может содержать несколько блоков данных и этот
metadata bool // iss.meta=on|off = включать или нет метаинформацию
jsonFull bool // iss.json=compact|extended сокращенный или расширенный формат json;
dateFrom string // дата from
dateTo string // дата till
date string // дата date
interval int // Интервал свечек
start int // start =
q string // Поиск инструмента по части Кода, Названию, ISIN, Идентификатору Эмитента, Номеру гос.регистрации.
algoPack string // тип данных алгопака
algoPackMarkets string // рынок для алгопака eq = акции fo = фьючерсы fx = валюта
latest bool // Super Candles флаг latest=1 возвращает последнюю пятиминутку за указанную дату
algoPackStock bool //
algoPackForts bool //
algoPackFx bool //
}
func NewIssRequest() *IssRequest {
// значение по умолчанию
u := &IssRequest{
format: "json",
metadata: true,
}
return u
}
// URL создадим строку url
func (u *IssRequest) URL() string {
_url, err := url.Parse(DefaultApiURL)
if err != nil {
return ""
}
if u.algoPack != "" {
_url.Path = path.Join(_url.Path, DefaultAlgoPack)
// выберем рынок
if u.algoPackMarkets != "" {
_url.Path = path.Join(_url.Path, u.algoPackMarkets)
}
if u.algoPackStock {
_url.Path = path.Join(_url.Path, AlgoPackStock)
}
if u.algoPackForts {
_url.Path = path.Join(_url.Path, AlgoPackForts)
}
if u.algoPackFx {
_url.Path = path.Join(_url.Path, AlgoPackFx)
}
// что выбираем
_url.Path = path.Join(_url.Path, u.algoPack)
}
if u.history {
_url.Path = path.Join(_url.Path, "history")
}
if u.engines != "" {
_url.Path = path.Join(_url.Path, "engines", u.engines)
}
if u.markets != "" {
_url.Path = path.Join(_url.Path, "markets", u.markets)
}
if u.boards != "" {
_url.Path = path.Join(_url.Path, "boards", u.boards)
}
if u.securities {
_url.Path = path.Join(_url.Path, "securities")
}
// если не пустой символ
if u.symbol != "" {
_url.Path = path.Join(_url.Path, u.symbol)
}
if u.target != "" {
target := u.target
if u.format != "" {
target = target + "." + u.format
}
_url.Path = path.Join(_url.Path, target)
}
// все равно проставим формат
if u.target == "" {
_url.Path = path.Join(_url.Path, "."+u.format)
}
// создаем параметры
q := _url.Query()
if !u.metadata {
q.Set("iss.meta", "off")
}
if u.iss_only != "" {
q.Set("iss.only", u.iss_only)
}
if u.jsonFull {
//iss.json=compact|extended
q.Set("iss.json", "extended")
}
// нет проверки на формат даты
if u.date != "" {
q.Set("date", u.date)
}
// нет проверки на формат даты
if u.dateFrom != "" {
q.Set("from", u.dateFrom)
}
// нет проверки на формат даты
if u.dateTo != "" {
q.Set("till", u.dateTo)
}
if u.interval != 0 {
q.Set("interval", strconv.Itoa(u.interval))
}
if u.start != 0 {
q.Set("start", strconv.Itoa(u.start))
}
// если не пустой список инструментов
if u.symbols != "" && u.target != "candles" {
q.Set("securities", u.symbols)
}
if u.latest {
q.Set("latest", "1")
}
// // если не пустой список колонок
// //q.Set("securities.columns", params.columns)
// if params.columns != "" {
// q.Set(params.iss_only+".columns", params.columns)
// }
// добавляем к URL параметры
_url.RawQuery = q.Encode()
return _url.String()
}
// History
func (u *IssRequest) History() *IssRequest {
u.history = true
return u
}
// Stock проставим параметры для акций
func (u *IssRequest) Stock() *IssRequest {
u.engines = "stock"
u.markets = "shares"
u.boards = StockBoard
u.target = "securities"
return u
}
// Forts проставим параметры для фьючерсов
func (u *IssRequest) Forts() *IssRequest {
u.engines = "futures"
u.markets = "forts"
u.target = "securities"
u.boards = ""
return u
}
// Options проставим параметры для опционов
func (u *IssRequest) Options() *IssRequest {
u.engines = "futures"
u.markets = "options"
u.target = "securities"
u.boards = ""
return u
}
//https://iss.moex.com/iss/engines/stock/markets/bonds/boards/tqob/securities.json
// Bondsпроставим параметры для Bonds
func (u *IssRequest) Bonds() *IssRequest {
u.engines = "stock"
u.markets = "bonds"
u.target = "securities"
u.boards = ""
return u
}
// Candle проставим параметры для запроса свечи
func (u *IssRequest) Candle() *IssRequest {
u.target = "candles"
u.securities = true
return u
}
// Engines /engines/(trade_engine_name)
func (u *IssRequest) Engines(param string) *IssRequest {
u.engines = param
return u
}
// Markets /markets/(market_name)
func (u *IssRequest) Markets(param string) *IssRequest {
u.markets = param
return u
}
// Boards /boards/(boardid)
func (u *IssRequest) Boards(param string) *IssRequest {
u.boards = param
return u
}
// Target
func (u *IssRequest) Target(param string) *IssRequest {
u.target = param
//если target == candles всегда вставляем securities
if param == "candles" {
u.securities = true
}
return u
}
// WithSecurities добавлять securities в строку
func (u *IssRequest) WithSecurities(param bool) *IssRequest {
u.securities = param
return u
}
// Json проставим формат данных: json xml
func (u *IssRequest) Json() *IssRequest {
u.format = "json"
return u
}
//// Xml проставим формат данных: xml
//func (u *IssRequest) Xml() *IssRequest {
// u.format = "xml"
// return u
//}
//
//// формат данных: csv
//func (u *IssRequest) Csv() *IssRequest {
// u.format = "csv"
// return u
//}
//
//// формат данных: html
//func (u *IssRequest) Html() *IssRequest {
// u.format = "html"
// return u
//}
// MetaData включать или нет метаинформацию перечень,
// тип данных и размер полей (столбцов или атрибутов xml)
// iss.meta=on|off
func (u *IssRequest) MetaData(param bool) *IssRequest {
u.metadata = param
return u
}
// JsonFull расширенный формат json
// iss.json=extended
func (u *IssRequest) JsonFull() *IssRequest {
u.jsonFull = true
return u
}
// Only iss.only=
func (u *IssRequest) Only(param string) *IssRequest {
u.iss_only = param
return u
}
// OnlySecurities iss.only=securities
func (u *IssRequest) OnlySecurities() *IssRequest {
u.iss_only = "securities"
return u
}
// OnlyMarketData iss.only=marketdata
func (u *IssRequest) OnlyMarketData() *IssRequest {
u.iss_only = "marketdata"
return u
}
// MarketData iss.only=marketdata
func (u *IssRequest) MarketData() *IssRequest {
u.iss_only = "marketdata"
return u
}
func (u *IssRequest) Start(param int) *IssRequest {
u.start = param
return u
}
// From нет проверки на формат даты
func (u *IssRequest) From(param string) *IssRequest {
u.dateFrom = param
return u
}
// To нет проверки на формат даты
func (u *IssRequest) To(param string) *IssRequest {
u.dateTo = param
return u
}
// Date нет проверки на формат даты
func (u *IssRequest) Date(param string) *IssRequest {
u.date = param
return u
}
// Symbols список символов в строке запроса
func (u *IssRequest) Symbols(param string) *IssRequest {
u.symbols = param
return u
}
// Symbol один символ. после securities
func (u *IssRequest) Symbol(param string) *IssRequest {
u.symbol = param
return u
}
// Interval
func (u *IssRequest) Interval(param int) *IssRequest {
u.interval = param
return u
}
// что выбираем из алгопака
func (u *IssRequest) AlgoPack(param string) *IssRequest {
u.algoPack = param
return u
}
// какой рынок в алгопаке
func (u *IssRequest) AlgoPackMarkets(param string) *IssRequest {
u.algoPackMarkets = param
return u
}
// флаг latest=1 возвращает последнюю пятиминутку за указанный период
func (u *IssRequest) Latest(param bool) *IssRequest {
u.latest = param
return u
}
func (u *IssRequest) AlgoPackStock(param bool) *IssRequest {
u.algoPackStock = param
return u
}
func (u *IssRequest) AlgoPackForts(param bool) *IssRequest {
u.algoPackForts = param
return u
}
func (u *IssRequest) AlgoPackFx(param bool) *IssRequest {
u.algoPackFx = param
return u
}