Initial
This commit is contained in:
commit
4b35f7c2c3
10 changed files with 1987 additions and 0 deletions
18
README.md
Normal file
18
README.md
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Купоны с МосБиржи
|
||||||
|
Скрипт получающий с МосБиржи информацию о купонах для разных облигаций
|
||||||
|
|
||||||
|
По умолчанию формирует таблицы на 4 года с текущей даты. Поменять количество месяцев можно в файле `exporter.go` константа `const months = 48`
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
|
||||||
|
Достаточно запустить `go run *.go`
|
||||||
|
|
||||||
|
## Примичание
|
||||||
|
|
||||||
|
Если величина купона неизвестна, в соответствующей ячейке будет 0.0₽
|
||||||
|
|
||||||
|
## Пример результата:
|
||||||
|
|
||||||
|
[Купоны ОФЗ](./samples/офз.csv)
|
||||||
|
|
||||||
|
[Купоны корпоративных облигаций](./samples/офз.csv)
|
42
downloader.go
Normal file
42
downloader.go
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
Copyright © 2020 Alexander Kiryukhin <a.kiryukhin@mail.ru>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func download(url string) (*InXML, error) {
|
||||||
|
cl := http.DefaultClient
|
||||||
|
resp, err := cl.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
return nil, fmt.Errorf("expected code 200, got %d (%s)", resp.StatusCode, resp.Status)
|
||||||
|
}
|
||||||
|
d := new(InXML)
|
||||||
|
return d, xml.NewDecoder(resp.Body).Decode(d)
|
||||||
|
}
|
72
exporter.go
Normal file
72
exporter.go
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
Copyright © 2020 Alexander Kiryukhin <a.kiryukhin@mail.ru>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/csv"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const months = 48
|
||||||
|
|
||||||
|
func export(name string, documents []*Document) error {
|
||||||
|
var sheet [][]string
|
||||||
|
header := []string{"Облигации", "Тикер"}
|
||||||
|
now := time.Now()
|
||||||
|
for i := 0; i <= months; i++ {
|
||||||
|
year, month, _ := now.Date()
|
||||||
|
cellID := fmt.Sprintf("%02d.%d", month, year)
|
||||||
|
header = append(header, cellID)
|
||||||
|
now = now.AddDate(0, 1, 0)
|
||||||
|
}
|
||||||
|
sheet = append(sheet, header)
|
||||||
|
for _, document := range documents {
|
||||||
|
row := []string{document.Name, document.ID}
|
||||||
|
now = time.Now()
|
||||||
|
for i := 0; i <= months; i++ {
|
||||||
|
if sum, ok := document.GetByDate(now); ok {
|
||||||
|
row = append(row, strconv.FormatFloat(sum, 'f', 2, 64))
|
||||||
|
} else {
|
||||||
|
row = append(row, "")
|
||||||
|
}
|
||||||
|
now = now.AddDate(0, 1, 0)
|
||||||
|
}
|
||||||
|
sheet = append(sheet, row)
|
||||||
|
}
|
||||||
|
f, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
w := csv.NewWriter(f)
|
||||||
|
if err := w.WriteAll(sheet); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := w.Error(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
3
go.mod
Normal file
3
go.mod
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module github.com/neonxp/moex
|
||||||
|
|
||||||
|
go 1.14
|
0
go.sum
Normal file
0
go.sum
Normal file
42
main.go
Normal file
42
main.go
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "log"
|
||||||
|
|
||||||
|
const (
|
||||||
|
OFZ_URL = `https://iss.moex.com/iss/engines/stock/markets/bonds/boards/TQOB/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,NEXTCOUPON,COUPONVALUE,SECNAME,COUPONPERCENT,MATDATE,COUPONPERIOD`
|
||||||
|
CORP_URL = `https://iss.moex.com/iss/engines/stock/markets/bonds/boards/TQCB/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,NEXTCOUPON,COUPONVALUE,SECNAME,COUPONPERCENT,MATDATE,COUPONPERIOD`
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
d1, err := processFile(OFZ_URL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := export("офз.csv", d1); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
d2, err := processFile(CORP_URL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := export("корп.csv", d2); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func processFile(url string) ([]*Document, error) {
|
||||||
|
in, err := download(url)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var documents []*Document
|
||||||
|
for _, item := range in.Data.Rows.Items {
|
||||||
|
d, err := parse(item)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
documents = append(documents, d)
|
||||||
|
}
|
||||||
|
return documents, nil
|
||||||
|
}
|
56
parser.go
Normal file
56
parser.go
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
Copyright © 2020 Alexander Kiryukhin <a.kiryukhin@mail.ru>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func parse(row Row) (*Document, error) {
|
||||||
|
date, err := time.Parse("2006-01-02", row.Next)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
endDate, err := time.Parse("2006-01-02", row.EndDate)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
d := &Document{
|
||||||
|
ID: row.ID,
|
||||||
|
Name: row.Name,
|
||||||
|
From: date,
|
||||||
|
To: endDate,
|
||||||
|
Percent: row.Percent,
|
||||||
|
Coupons: []Coupon{},
|
||||||
|
}
|
||||||
|
if date.Equal(endDate) {
|
||||||
|
d.Add(endDate, row.Value)
|
||||||
|
}
|
||||||
|
for date.Before(endDate) {
|
||||||
|
d.Add(date, row.Value)
|
||||||
|
date = date.AddDate(0, 0, row.Period)
|
||||||
|
}
|
||||||
|
if !date.Equal(endDate) {
|
||||||
|
d.Add(endDate, row.Value)
|
||||||
|
}
|
||||||
|
return d, nil
|
||||||
|
}
|
1625
samples/корп.csv
Executable file
1625
samples/корп.csv
Executable file
File diff suppressed because it is too large
Load diff
48
samples/офз.csv
Executable file
48
samples/офз.csv
Executable file
|
@ -0,0 +1,48 @@
|
||||||
|
Облигации,Тикер,07.2020,08.2020,09.2020,10.2020,11.2020,12.2020,01.2021,02.2021,03.2021,04.2021,05.2021,06.2021,07.2021,08.2021,09.2021,10.2021,11.2021,12.2021,01.2022,02.2022,03.2022,04.2022,05.2022,06.2022,07.2022,08.2022,09.2022,10.2022,11.2022,12.2022,01.2023,02.2023,03.2023,04.2023,05.2023,06.2023,07.2023,08.2023,09.2023,10.2023,11.2023,12.2023,01.2024,02.2024,03.2024,04.2024,05.2024,06.2024,07.2024
|
||||||
|
КОБР-33,RU000A101MQ3,,12.40,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
КОБР-34,RU000A101R74,,,11.64,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
КОБР-35,RU000A101UM5,,,,11.31,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПК 24020 27/07/22,SU24020RMFS8,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПК 24021 24/04/24,SU24021RMFS6,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,,,,
|
||||||
|
ОФЗ-ПД 25083 15/12/21,SU25083RMFS5,,,,,,34.90,,,,,,34.90,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПД 25084 04/10/23,SU25084RMFS3,,,,33.54,,,,,,,33.54,,,,,,,,33.54,,,,,,,33.54,,,,,,,,33.54,,,,,,33.54,,,,,,,,,
|
||||||
|
ОФЗ-ПД 26205 14/04/21,SU26205RMFS3,,,,37.90,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПД 26207 03/02/27,SU26207RMFS9,,40.64,,,,,,40.64,,,,,,40.64,,,,,,40.64,,,,,,40.64,,,,,,40.64,,,,,,40.64,,,,,,40.64,,,,,
|
||||||
|
ОФЗ-ПД 26209 20/07/22,SU26209RMFS5,,,,,,,37.90,,,,,,37.90,,,,,,37.90,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПД 26211 25/01/23,SU26211RMFS1,34.90,,,,,,34.90,,,,,,34.90,,,,,,34.90,,,,,,34.90,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПД 26212 19/01/28,SU26212RMFS9,35.15,,,,,,35.15,,,,,,35.15,,,,,,35.15,,,,,,35.15,,,,,,35.15,,,,,,35.15,,,,,,35.15,,,,,,35.15
|
||||||
|
ОФЗ-ПД 26215 16/08/23,SU26215RMFS2,,34.90,,,,,,34.90,,,,,,34.90,,,,,,34.90,,,,,,34.90,,,,,,34.90,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПД 26217 18/08/21,SU26217RMFS8,,37.40,,,,,,37.40,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПД 26218 17/09/31,SU26218RMFS6,,,42.38,,,,,,42.38,,,,,,42.38,,,,,,42.38,,,,,,42.38,,,,,,42.38,,,,,,42.38,,,,,,42.38,,,,
|
||||||
|
ОФЗ-ПД 26219 16/09/26,SU26219RMFS4,,,38.64,,,,,,38.64,,,,,,38.64,,,,,,38.64,,,,,,38.64,,,,,,38.64,,,,,,38.64,,,,,,38.64,,,,
|
||||||
|
ОФЗ-ПД 26220 07/12/22,SU26220RMFS2,,,,,,36.90,,,,,,36.90,,,,,,36.90,,,,,,36.90,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПД 26221 23/03/33,SU26221RMFS0,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,
|
||||||
|
ОФЗ-ПД 26222 16/10/24,SU26222RMFS8,,,,35.40,,,,,,35.40,,,,,,35.40,,,,,,35.40,,,,,,35.40,,,,,,35.40,,,,,,35.40,,,,,,35.40,,,
|
||||||
|
ОФЗ-ПД 26223 28/02/24,SU26223RMFS6,,,32.41,,,,,,32.41,,,,,,32.41,,,,,,32.41,,,,,32.41,,,,,,,32.41,,,,,32.41,,,,,,,,,,,
|
||||||
|
ОФЗ-ПД 26224 23/05/29,SU26224RMFS4,,,,,,34.41,,,,,,34.41,,,,,,34.41,,,,,,34.41,,,,,34.41,,,,,,34.41,,,,,,34.41,,,,,,34.41,,
|
||||||
|
ОФЗ-ПД 26225 10/05/34,SU26225RMFS1,,,,,36.15,,,,,,36.15,,,,,,36.15,,,,,,36.15,,,,,,36.15,,,,,,36.15,,,,,,36.15,,,,,,36.15,,
|
||||||
|
ОФЗ-ПД 26226 07/10/26,SU26226RMFS9,,,,39.64,,,,,,39.64,,,,,,39.64,,,,,,39.64,,,,,,39.64,,,,,,39.64,,,,,,39.64,,,,,,39.64,,,
|
||||||
|
ОФЗ-ПД 26227 17/07/24,SU26227RMFS7,,,,,,,36.90,,,,,,36.90,,,,,,36.90,,,,,,36.90,,,,,,36.90,,,,,,36.90,,,,,,36.90,,,,,,
|
||||||
|
ОФЗ-ПД 26228 10/04/30,SU26228RMFS5,,,,38.15,,,,,,38.15,,,,,,38.15,,,,,,38.15,,,,,,38.15,,,,,,38.15,,,,,,38.15,,,,,,38.15,,,
|
||||||
|
ОФЗ-ПД 26229 12/11/25,SU26229RMFS3,,,,,35.65,,,,,,35.65,,,,,,35.65,,,,,,35.65,,,,,,35.65,,,,,,35.65,,,,,,35.65,,,,,,35.65,,
|
||||||
|
ОФЗ-ПД 26230 16/03/39,SU26230RMFS1,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,,,,38.39,,,
|
||||||
|
ОФЗ-ПД 26231 20/07/44,SU26231RMFS9,,1.25,,,,,,1.25,,,,,,1.25,,,,,,1.25,,,,,,1.25,,,,,,1.25,,,,,,1.25,,,,,,1.25,,,,,
|
||||||
|
ОФЗ-ПД 26232 06/10/27,SU26232RMFS7,,,,29.92,,,,,,29.92,,,,,,29.92,,,,,,29.92,,,,,,29.92,,,,,,29.92,,,,,,29.92,,,,,,29.92,,,
|
||||||
|
ОФЗ-ПД 26233 18/07/2035,SU26233RMFS5,,28.08,,,,,28.08,,,,,,28.08,,,,,28.08,,,,,,28.08,,,,,28.08,,,,,,28.08,,,,,28.08,,,,,,28.08,,,
|
||||||
|
ОФЗ-ПД 26234 16/07/2025,SU26234RMFS3,,,,,,,28.48,,,,,,,,28.48,,,,,,,28.48,,,,,,,,28.48,,,,,,,,28.48,,,,,,,28.48,,,,
|
||||||
|
ОФЗ-ПК 29006 29/01/25,SU29006RMFS2,,38.64,,,,,,38.64,,,,,,38.64,,,,,,38.64,,,,,,38.64,,,,,,38.64,,,,,,38.64,,,,,38.64,,,,,,38.64
|
||||||
|
ОФЗ-ПК 29007 03/03/27,SU29007RMFS0,,,38.10,,,,,,38.10,,,,,,38.10,,,,,,38.10,,,,,,38.10,,,,,,38.10,,,,,,38.10,,,,,,38.10,,,,
|
||||||
|
ОФЗ-ПК 29008 03/10/29,SU29008RMFS8,,,,37.65,,,,,,37.65,,,,,,37.65,,,,,,37.65,,,,,,37.65,,,,,,37.65,,,,,,37.65,,,,,,37.65,,,
|
||||||
|
ОФЗ-ПК 29009 05/05/32,SU29009RMFS6,,,,,37.30,,,,,,37.30,,,,,,37.30,,,,,,37.30,,,,,,37.30,,,,,,37.30,,,,,,37.30,,,,,,37.30,,
|
||||||
|
ОФЗ-ПК 29010 06/12/34,SU29010RMFS4,,,,,,36.80,,,,,,36.80,,,,,,36.80,,,,,,36.80,,,,,,36.80,,,,,,36.80,,,,,,36.80,,,,,,36.80,
|
||||||
|
ОФЗ-ПК 29012 16/11/22,SU29012RMFS0,,,,,31.81,,,,,,31.81,,,,,,31.81,,,,,,31.81,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ПК 29013 18/09/30,SU29013RMFS8,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,
|
||||||
|
ОФЗ-ПК 29014 25/03/26,SU29014RMFS6,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,,,0.00,
|
||||||
|
ОФЗ-АД 46011 20/08/25,SU46011RMFS1,,99.73,,,,,,,,,,,,99.73,,,,,,,,,,,,99.73,,,,,,,,,,,,99.73,,,,,,,,,,,
|
||||||
|
ОФЗ-АД 46012 05/09/29,SU46012RMFS9,,,59.39,,,,,,,,,,,,59.39,,,,,,,,,,,,59.39,,,,,,,,,,,,59.39,,,,,,,,,,
|
||||||
|
ОФЗ-АД 46018 24/11/21,SU46018RMFS6,,11.34,,,11.34,,,11.34,,,11.34,,,11.34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-АД 46020 06/02/36,SU46020RMFS2,,34.41,,,,,,34.41,,,,,,34.41,,,,,,34.41,,,,,,34.41,,,,,,34.41,,,,,,34.41,,,,,,34.41,,,,,
|
||||||
|
ОФЗ-АД 46022 19/07/23,SU46022RMFS8,,,,,,,27.42,,,,,,27.42,,,,,,27.42,,,,,,27.42,,,,,,27.42,,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-АД 46023 23/07/26,SU46023RMFS6,24.41,,,,,,24.41,,,,,,24.41,,,,,,24.41,,,,,,24.41,,,,,,24.41,,,,,,24.41,,,,,,24.41,,,,,,24.41
|
||||||
|
ОФЗ-ИН 52001 16/08/23,SU52001RMFS3,,15.52,,,,,,15.52,,,,,,15.52,,,,,,15.52,,,,,,15.52,,,,,,15.52,,,,,,,,,,,,,,,,,
|
||||||
|
ОФЗ-ИН 52002 02/02/28,SU52002RMFS1,,13.71,,,,,,13.71,,,,,,13.71,,,,,,13.71,,,,,,13.71,,,,,,13.71,,,,,,13.71,,,,,,13.71,,,,,
|
|
81
types.go
Normal file
81
types.go
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
Copyright © 2020 Alexander Kiryukhin <a.kiryukhin@mail.ru>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type InXML struct {
|
||||||
|
XMLName xml.Name `xml:"document"`
|
||||||
|
Data struct {
|
||||||
|
XMLName xml.Name `xml:"data"`
|
||||||
|
Rows struct {
|
||||||
|
XMLName xml.Name `xml:"rows"`
|
||||||
|
Items []Row `xml:"row"`
|
||||||
|
} `xml:"rows"`
|
||||||
|
} `xml:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Row struct {
|
||||||
|
XMLName xml.Name `xml:"row"`
|
||||||
|
ID string `xml:"SECID,attr"`
|
||||||
|
Name string `xml:"SECNAME,attr"`
|
||||||
|
Next string `xml:"NEXTCOUPON,attr"`
|
||||||
|
Value float64 `xml:"COUPONVALUE,attr"`
|
||||||
|
Percent float64 `xml:"COUPONPERCENT,attr"`
|
||||||
|
EndDate string `xml:"MATDATE,attr"`
|
||||||
|
Period int `xml:"COUPONPERIOD,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Document struct {
|
||||||
|
ID string
|
||||||
|
Name string
|
||||||
|
From time.Time
|
||||||
|
To time.Time
|
||||||
|
Percent float64
|
||||||
|
Coupons []Coupon
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Document) Add(date time.Time, sum float64) {
|
||||||
|
d.Coupons = append(d.Coupons, Coupon{
|
||||||
|
Date: date,
|
||||||
|
Sum: sum,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Document) GetByDate(date time.Time) (float64, bool) {
|
||||||
|
year, month, _ := date.Date()
|
||||||
|
for _, coupon := range d.Coupons {
|
||||||
|
cyear, cmonth, _ := coupon.Date.Date()
|
||||||
|
if year == cyear && month == cmonth {
|
||||||
|
return coupon.Sum, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
type Coupon struct {
|
||||||
|
Date time.Time
|
||||||
|
Sum float64
|
||||||
|
}
|
Loading…
Reference in a new issue