-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathforts.go
134 lines (122 loc) · 9.3 KB
/
forts.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
package iss
import (
"fmt"
"log/slog"
"net/http"
)
// FortsInfo параметры инструментов по рынку фортс
// https://iss.moex.com/iss/engines/futures/markets/forts/columns.json?iss.only=securities
// TODO добавить csv таг
type FortsInfo struct {
SecID string `json:"SECID"` // Код инструмента
BoardID string `json:"BOARDID"` // Код режима
ShortName string `json:"SHORTNAME"` // Кратк. наим.
SecName string `json:"SECNAME"` // Наименование срочного инструмента
PrevSetTlePrice float64 `json:"PREVSETTLEPRICE"` // Расчетная цена предыдущего дня, рублей
Decimals int `json:"DECIMALS"` // Точность
MinStep float64 `json:"MINSTEP"` // Мин. шаг цены
LastTradeDate string `json:"LASTTRADEDATE"` // Последний торговый день
LastDelDate string `json:"LASTDELDATE"` // День исполнения
SecType string `json:"SECTYPE"` // Тип инструмента
LatName string `json:"LATNAME"` // Наименование финансового инструмента на английском языке
AssetCode string `json:"ASSETCODE"` // Код базового актива
PrevOpenPosition int `json:"PREVOPENPOSITION"` // Открытые позиции предыдущего дня, контр.
LotVolume int `json:"LOTVOLUME"` // К-во единиц базового актива в инструменте
InitialMargin float64 `json:"INITIALMARGIN"` // Гарантийное обеспечение на первом уровне лимита концентрации
HighLimit float64 `json:"HIGHLIMIT"` // Верхний лимит
LowLimit float64 `json:"LOWLIMIT"` // Нижний лимит
StepPrice float64 `json:"STEPPRICE"` // Стоимость шага цены
LastSettlePrice float64 `json:"LASTSETTLEPRICE"` // Расчетная цена последнего клиринга
PrevPrice float64 `json:"PREVPRICE"` // Цена последней сделки предыдущего торгового дня
IMTime string `json:"IMTIME"` // Данные по ГО на
BuySellFee float64 `json:"BUYSELLFEE"` // Сбор за регистрацию сделки*, руб.
ScalPerFee float64 `json:"SCALPERFEE"` // Сбор за скальперскую сделку*, руб.
NegotiatedFee float64 `json:"NEGOTIATEDFEE"` // Сбор за адресную сделку*, руб.
ExerciseFee float64 `json:"EXERCISEFEE"` // Клиринговая комиссия за исполнение контракта*, руб.
}
// FortsData рыночные данные по инструментам фортс
// https://iss.moex.com/iss/engines/futures/markets/forts/columns.json?iss.only=marketdata
// TODO добавить csv таг
type FortsData struct {
SecID string `json:"SECID"` // Код инструмента
BoardID string `json:"BOARDID"` // Код режима
Bid float64 `json:"BID"` // Лучшая котировка на покупку
Offer float64 `json:"OFFER"` // Лучшая котировка на продажу
Spread float64 `json:"SPREAD"` // Разница между лучшей котировкой на продажу и покупку (спред), руб
Open float64 `json:"OPEN"` // Цена первой сделки
Low float64 `json:"LOW"` // Минимальная цена сделки
High float64 `json:"HIGH"` // Максимальная цена сделки
Last float64 `json:"LAST"` // Цена последней сделки
Quantity int `json:"QUANTITY"` // Объем последней сделки, контрактов
LastChange float64 `json:"LASTCHANGE"` // Изменение цены последней сделки к предыдущей цене
SettlePrice float64 `json:"SETTLEPRICE"` // Текущая расчетная цена
SettleTopRevSettle float64 `json:"SETTLETOPREVSETTLE"` // Изменение текущей расчетной цены
NumTrades int `json:"NUMTRADES"` // Количество совершенных сделок, штук
VolToDay int64 `json:"VOLTODAY"` // Объем совершенных сделок, контрактов
ValToDay float64 `json:"VALTODAY"` // Объем совершенных сделок, рублей
ValToDay_USD float64 `json:"VALTODAY_USD"` // Объем совершенных сделок, дол. США
UpdateTime string `json:"UPDATETIME"` // Время последнего обновления
LastChangePrcnt float64 `json:"LASTCHANGEPRCNT"` // Изменение цены последней сделки к предыдущей, %"
BidDepth int `json:"BIDDEPTH"` // Объем заявок на покупку по лучшей котировке, выраженный в лотах null
BidDepthT int `json:"BIDDEPTHT"` // Суммарный объем заявок на покупку null
NumBids int `json:"NUMBIDS"` // Количество заявок на покупку null
OfferDepth int `json:"OFFERDEPTH"` // Объем заявки на продажу по лучшей котировке null
OfferDepthT int `json:"OFFERDEPTHT"` // Суммарный объем заявок на продажу null
NumOffers int `json:"NUMOFFERS"` // Количество заявок на продажу null
Time string `json:"TIME"` // Время заключения последней сделки
SETTLETOPREVSETTLEPRC float64 `json:"SETTLETOPREVSETTLEPRC"` // Изменение текущей расчетной цены относительно расчетной цены предыдущего торгового дня, %
SEQNUM int64 `json:"SEQNUM"` // Номер обновления (служебное поле)
SysTime string `json:"SYSTIME"` // Время загрузки данных системой
TradeDate string `json:"TRADEDATE"` // Дата последней сделки
LastToPrevPrice float64 `json:"LASTTOPREVPRICE"` // Изменение цены последней сделки к последней цене предыдущего дня, %
OpenPosition int64 `json:"OPENPOSITION"` // Открытые позиции, контрактов
OiChange int64 `json:"OICHANGE"` // Изменение открытых позиций к предыдущему закрытию, контр.
OpenPeriodPrice float64 `json:"OPENPERIODPRICE"` // Цена аукциона открытия
SwapRate float64 `json:"SWAPRATE"` // Фандинг в рублях (величина SwapRate, согласно спецификации контракта)
}
// GetFortsInfo получить параметры инструментов по фьючерсам
func (c *Client) GetFortsInfo(symbols string) ([]FortsInfo, error) {
var err error
const op = "GetFortsInfo"
url := NewIssRequest().Forts().Json().MetaData(false).OnlySecurities().Symbols(symbols).URL()
r := &request{
method: http.MethodGet,
fullURL: url,
}
var resp Response
err = c.getJSON(r, &resp)
if err != nil {
slog.Error("GetFortsInfo.getJSON", "err", err.Error())
return nil, fmt.Errorf("%s: %w", op, err)
}
result := make([]FortsInfo, 0, len(resp.Securities.Data))
err = Unmarshal(resp.Securities.Columns, resp.Securities.Data, &result)
if err != nil {
slog.Error("GetFortsInfo.Unmarshal", "err", err.Error())
return nil, fmt.Errorf("%s: %w", op, err)
}
return result, nil
}
// GetFortsData получить рыночные данные по фьючерсам
func (c *Client) GetFortsData(symbols string) ([]FortsData, error) {
var err error
const op = "GetFortsData"
url := NewIssRequest().Forts().Json().MetaData(false).OnlyMarketData().Symbols(symbols).URL()
r := &request{
method: http.MethodGet,
fullURL: url,
}
var resp Response
err = c.getJSON(r, &resp)
if err != nil {
slog.Error("GetFortsData.getJSON", "err", err.Error())
return nil, fmt.Errorf("%s: %w", op, err)
}
result := make([]FortsData, 0, len(resp.MarketData.Data))
err = Unmarshal(resp.MarketData.Columns, resp.MarketData.Data, &result)
if err != nil {
slog.Error("GetFortsData.Unmarshal", "err", err.Error())
return nil, fmt.Errorf("%s: %w", op, err)
}
return result, nil
}