Skip to content

Utility to broadcast last deal price from MOEX via redis publishing

License

Notifications You must be signed in to change notification settings

vodolaz095/stocks_broadcaster

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

36 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Stocks Broadcaster

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ подписываСтся Π½Π° GRPC ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈ рСтранслируСт Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π»Ρ‹ (pub/sub channels) Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… redis для Ρ‚ΠΎΡ€Π³ΠΎΠ²Ρ‹Ρ… Π±ΠΎΡ‚ΠΎΠ². ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ брокСрский счёт Π² T-Bank Open Investment API ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° - https://www.tinkoff.ru/rm/ostroumov.anatoliy2/4HFzm76801/

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° задания

ВСстовоС Π·Π°Π΄Π°Π½ΠΈΠ΅, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π·Π° 4 дня.

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ (10 сСнтября 2024 Π³ΠΎΠ΄Π°) Π±Ρ€ΠΎΠΊΠ΅Ρ€ Π’-Π˜Π½Π²Π΅ΡΡ‚ΠΈΡ†ΠΈΠΉ прСдоставляСт доступ ΠΊ Ρ‚ΠΎΡ€Π³Π°ΠΌ 9383 Ρ‚ΠΈΠΏΠΎΠ² Π°ΠΊΡ†ΠΈΠΉ, 4745 ΠΎΠ±Π»ΠΈΠ³Π°Ρ†ΠΈΠΉ, 2125 Ρ„ΠΎΠ½Π΄ΠΎΠ², 38 Π²Π°Π»ΡŽΡ‚ ΠΈ 1552 Ρ„ΡŒΡŽΡ‡Π΅Ρ€ΡΠΎΠ² ΠΈ Π½Π° ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ этих инструмСнтов ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ. Open Investement API ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Тёсткими Π»ΠΈΠΌΠΈΡ‚Π°ΠΌΠΈ - 300 подписок Π½Π° ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° (ΠΈ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, с ΠΎΠ΄Π½ΠΎΠ³ΠΎ IP адрСса).

Как Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ‚ΠΎΡ€Π³ΠΎΠ²Ρ‹Ρ… Π±ΠΎΡ‚ΠΎΠ², я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π°ΠΊΡ†ΠΈΠΉ (Ρ†Π΅Π½Π° ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ сдСлки) Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π»Ρ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… redis. Для ΠΎΠ±Ρ…ΠΎΠ΄Π° Π»ΠΈΠΌΠΈΡ‚Π° Π² 300 подписок я Ρ…ΠΎΡ‡Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ систСму, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ исходящиС соСдинСния с Ρ€Π°Π·Π½Ρ‹Ρ… сСтСвых интСрфСйсов, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΊ сСрвСру. Π’ΠΎ Π΅ΡΡ‚ΡŒ, я ΠΌΠΎΠ³Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΠΊΠ΅Π½ secret1 ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„ΠΎΠ½Π΄ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСтСвой интСрфСйс с адрСсом 192.168.12.2, Π° ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π°ΠΊΡ†ΠΈΠΉ я ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· интСрфСйс с 192.168.12.3 ΠΏΠΎ Ρ‚ΠΎΠΊΠ΅Π½Ρƒ SECRET2.

inputs:
  - name: "etfs"
    token: "<<<SECRET1>>>"
    figis:
      - "BBG333333333"
      - ...
    local_addr: "192.168.12.2"
  - name: "stocks"
    token: "<<<SECRET2>>>"
    figis:
      - "BBG004730RP0"
      - "BBG00475KKY8"
      - ...
    local_addr: "192.168.12.3"

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ (рСтрансляция ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… GRPC подписок Π² ΠΊΠ°Π½Π°Π»Ρ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… redis) позволяСт ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π»ΠΈΠΌΠΈΡ‚Ρ‹ Π½Π° 300 подписок с Ρ‚ΠΎΠΊΠ΅Π½Π°\IP адрСса, ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚ΠΎΡ€Π³ΠΎΠ²ΠΎΠ³ΠΎ Ρ€ΠΎΠ±ΠΎΡ‚Π° (Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ GRPC ΠΊΠ»ΠΈΠ΅Π½Ρ‚), хотя ΠΈ вносит Π»Π°Π³ ΠΎΠΊΠΎΠ»ΠΎ 20 мс - Ρ‡Ρ‚ΠΎ, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Ρ‚Π΅Ρ€ΠΏΠΈΠΌΠΎ для Π°Π»Π³ΠΎΡ‚Ρ€Π΅ΠΉΠ΄ΠΈΠ½Π³Π°.

Π’Π°ΠΊΠΆΠ΅ я Ρ…ΠΎΡ‡Ρƒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ systemd unit Π½Π° Cents 9 / Fedora 40 Server.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

ΠžΠ±Ρ€Π°Π·Π΅Ρ† ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ - stocks_broadcaster_example.yaml Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

input

Π—Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Π²ΠΎΠ΄Π° - Ρ‚ΠΎΠΊΠ΅Π½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ API, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСтСвой адрСс (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) ΠΈ FIGI инструмСнтов, Π½Π° ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ.

inputs:
  - name: "etfs"
    token: "<<<SECRET1>>>"
    figis:
      - "BBG333333333"
      - ...
    local_addr: "192.168.12.2"
  - name: "stocks"
    token: "<<<SECRET2>>>"
    figis:
      - "BBG004730RP0"
      - "BBG00475KKY8"
      - ...

instruments

Π—Π°Π΄Π°Ρ‘Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сообщСния ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π² ΠΊΠ°Π½Π°Π»Ρ‹ рСдиса.

instruments:
  - figi: "BBG333333333"
    name: "tmos"
    channel: "stocks/tmos"
  - figi: "BBG004730RP0"
    name: "GAZP"
    channel: "stocks/gazp"
  - figi: "BBG00475KKY8"
    name: "NVTK"
    channel: "stocks/NVTK"

outputs

outputs:
  - name: "container"
    redis_url: "redis://127.0.0.1:6379" # syntax - https://pkg.go.dev/github.com/redis/go-redis/v9#ParseURL

Π—Π°Π΄Π°Ρ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ строку соСдинСния Π΄ΠΎ сСрвСра redis, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π€ΠΎΡ€ΠΌΠ°Ρ‚ сообщСния JSON Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ UTF-8

{
  "name": "tmos", // as defined in `name`
  "value": 5.73,  // price of lot / Ρ†Π΅Π½Π° Π»ΠΎΡ‚Π°
  "error": "",    // free form error message / сообщСниС ΠΎΠ± ошибки
  "timestamp":"Sun Aug 25 2024 01:06:23 GMT+0300"
}

ΠšΠ»ΡŽΡ‡ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ channel Π·Π°Π΄Π°Ρ‘Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π°, ΠΊΡƒΠ΄Π° публикуСтся сообщСниС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

instruments:
  - figi: "BBG004730RP0"
    name: "GAZP"
    channel: "stocks/gazp"

ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ сообщСниС

{
  "name": "GAZP",
  "value": 5.73, 
  "error": "", 
  "timestamp":"Sun Aug 25 2024 01:06:23 GMT+0300"
}

Π² ΠΊΠ°Π½Π°Π» stocks/gazp.

log Π—Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ логирования

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° с использованиСм компилятора ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… redis Π½Π° хост машинС.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ протСстированно Π½Π° соврСмСнном линуксС (tested on fedora 39+) с установлСнными ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² дистрибутива. Golang 1.22.0 ΠΈ GNU Make.

# install compiler tools
$ dnf install golang make redis 

# install redis database on host machine
$ dnf install -y redis && systemctl enable --now redis

# ensure development tools in place
$ make tools

# ensure golang modules are installed
$ make deps

# start application for development using configuration from contrib/local.yaml
$ make start

# build production grade binary at `build/stocks_broadcaster`
$ make build

Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Redis ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Ρ‡Π΅Ρ€Π΅Π· docker/podman.

# start development redis database  
$ make docker/resource
$ make podman/resource

Development using docker + docker compose

GNU Make, Docker engine with compose plugin should be installed. Installing golang toolchain on host machine is not required.

# start development databases and build and start application on http://localhost:3001 
$ make docker/up

# start development databases  
$ make docker/resource

# stop all
$ make docker/down

# prune all development environment
$ make docker/prune

Development using podman + podman-compose

Installing golang toolchain on host machine is not required. Tested on Fedora 39, 40 and Centos 9 Stream.

# install development environment
$ sudo dnf install make podman podman-compose podman-plugins containernetworking-plugins

# start development databases and build and start application on http://localhost:3001
$ make podman/up

# start development databases  
$ make podman/resource

# stop all
$ make podman/down

# prune all development environment
$ make podman/prune

Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ прилоТСния?

  1. Π—Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, допустим, Π² contrib/local.yaml
  2. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (make start, make docker/up ΠΈ Ρ‚.Π΄.)
  3. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ ΠΊ сСрвСру redis с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ redis-cli ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ monitor
  4. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ консоли рСдиса - Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π²Ρ‹Π²ΠΎΠ·Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ publish ΠΎΡ‚ прилоТСния Π½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ Π² ΠΊΠ°Π½Π°Π»Ρ‹. Π’ частности, Ссли сСйчас ΠΈΠ΄ΡƒΡ‚ Ρ‚ΠΎΡ€Π³ΠΈ акциями "Π“Π°Π·ΠΏΡ€ΠΎΠΌΠ°", Ρ‚ΠΎ сообщСния Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΈΠΌΠΈ:

vodolaz095@steel:~$ redis-cli monitor
OK
1731687168.592596 [0 127.0.0.1:39872] "publish" "stocks/gazp" "{\"name\":\"GAZP\",\"value\":133.25,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:48.397151Z\"}"
1731687168.592655 [0 127.0.0.1:39886] "publish" "stocks/gazp" "{\"name\":\"GAZP\",\"value\":133.25,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:48.397151Z\"}"
1731687169.099057 [0 127.0.0.1:39886] "publish" "stocks/gazp" "{\"name\":\"GAZP\",\"value\":133.27,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:48.882235Z\"}"
1731687169.099103 [0 127.0.0.1:39872] "publish" "stocks/gazp" "{\"name\":\"GAZP\",\"value\":133.27,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:48.882235Z\"}"
1731687170.635182 [0 127.0.0.1:39886] "publish" "stocks/gazp" "{\"name\":\"GAZP\",\"value\":133.28,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:50.443741Z\"}"
1731687170.635268 [0 127.0.0.1:39872] "publish" "stocks/gazp" "{\"name\":\"GAZP\",\"value\":133.28,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:50.443741Z\"}"
1731687170.635787 [0 127.0.0.1:39872] "publish" "stocks/NVTK" "{\"name\":\"NVTK\",\"value\":919.6,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:50.466195Z\"}"
1731687170.635985 [0 127.0.0.1:39886] "publish" "stocks/NVTK" "{\"name\":\"NVTK\",\"value\":919.6,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:50.466195Z\"}"
1731687171.352578 [0 127.0.0.1:39872] "publish" "stocks/gazp" "{\"name\":\"GAZP\",\"value\":133.26,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:51.179342Z\"}"
1731687171.352624 [0 127.0.0.1:39886] "publish" "stocks/gazp" "{\"name\":\"GAZP\",\"value\":133.26,\"error\":\"\",\"timestamp\":\"2024-11-15T16:12:51.179342Z\"}"
^C

  1. На ΡƒΡ€ΠΎΠ²Π½Π΅ логгирования debug ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄:

vodolaz095@steel:~/projects/stocks_broadcaster$ make start 
go run main.go ./contrib/local.yaml
19:15:40 INF main.go:61 > Starting StockBroadcaster version development. GOOS: linux. ARCH: amd64. Go Version: go1.22.8. Please, report bugs here: https://github.com/vodolaz095/stocks_broadcaster/issues
19:15:40 INF main.go:77 > Reader etfs uses local address 192.168.47.9 to dial invest API
19:15:40 WRN main.go:150 > Systemd watchdog disabled - application can work unstable in systemd environment
19:15:40 DBG service_start.go:19 > Preparing to start reader 0 InvestAPI reader etfs...
19:15:40 DBG service_start.go:19 > Preparing to start reader 1 InvestAPI reader stocks...
19:15:40 DBG service_subscribe.go:16 > Creating subscription channel for writer 0 container1...
19:15:40 DBG service_subscribe.go:16 > Creating subscription channel for writer 1 container2...
19:15:40 TRC reader.go:97 > Reader InvestAPI reader stocks received: subscribe_last_price_response:{tracking_id:"61ac060fc2703aef8e3c7b48a6c40ab9" last_price_subscriptions:{figi:"BBG004730RP0" subscription_status:SUBSCRIPTION_STATUS_SUCCESS instrument_uid:"962e2a95-02a9-4171-abd7-aa198dbe643a" stream_id:"88a48d6e-7896-47cc-99ce-d8a3aff381b0" subscription_id:"5c50ec81-79ff-4d08-aafb-971d9cc51edf"} last_price_subscriptions:{figi:"BBG00475KKY8" subscription_status:SUBSCRIPTION_STATUS_SUCCESS instrument_uid:"0da66728-6c30-44c4-9264-df8fac2467ee" stream_id:"88a48d6e-7896-47cc-99ce-d8a3aff381b0" subscription_id:"303860b0-b5a6-41b0-b5a3-35fd02a92fce"}}
19:15:40 TRC reader.go:97 > Reader InvestAPI reader etfs received: subscribe_last_price_response:{tracking_id:"5527ca8063a72475382a677df49faf22" last_price_subscriptions:{figi:"BBG333333333" subscription_status:SUBSCRIPTION_STATUS_SUCCESS instrument_uid:"9654c2dd-6993-427e-80fa-04e80a1cf4da" stream_id:"7165bfb2-e045-47c3-aeec-23c2cbfa00c1" subscription_id:"5078900a-d949-4221-9bc3-0f2ddc9e0186"}}
19:15:41 TRC reader.go:97 > Reader InvestAPI reader stocks received: last_price:{figi:"BBG004730RP0" price:{units:133 nano:490000000} time:{seconds:1731687340 nanos:971043000} instrument_uid:"962e2a95-02a9-4171-abd7-aa198dbe643a" last_price_type:LAST_PRICE_EXCHANGE}
19:15:41 DBG reader.go:100 > Reader InvestAPI reader stocks: instrument BBG004730RP0 has last lot price 133.4900
19:15:43 TRC reader.go:97 > Reader InvestAPI reader stocks received: last_price:{figi:"BBG00475KKY8" price:{units:921 nano:800000000} time:{seconds:1731687343 nanos:433960000} instrument_uid:"0da66728-6c30-44c4-9264-df8fac2467ee" last_price_type:LAST_PRICE_EXCHANGE}
19:15:43 DBG reader.go:100 > Reader InvestAPI reader stocks: instrument BBG00475KKY8 has last lot price 921.8000
19:15:43 TRC reader.go:97 > Reader InvestAPI reader stocks received: last_price:{figi:"BBG00475KKY8" price:{units:922} time:{seconds:1731687343 nanos:611561000} instrument_uid:"0da66728-6c30-44c4-9264-df8fac2467ee" last_price_type:LAST_PRICE_EXCHANGE}
19:15:43 DBG reader.go:100 > Reader InvestAPI reader stocks: instrument BBG00475KKY8 has last lot price 922.0000
19:15:43 TRC reader.go:97 > Reader InvestAPI reader stocks received: last_price:{figi:"BBG004730RP0" price:{units:133 nano:500000000} time:{seconds:1731687343 nanos:586901000} instrument_uid:"962e2a95-02a9-4171-abd7-aa198dbe643a" last_price_type:LAST_PRICE_EXCHANGE}
19:15:43 DBG reader.go:100 > Reader InvestAPI reader stocks: instrument BBG004730RP0 has last lot price 133.5000
19:15:44 TRC reader.go:97 > Reader InvestAPI reader stocks received: last_price:{figi:"BBG00475KKY8" price:{units:921 nano:800000000} time:{seconds:1731687344 nanos:567429000} instrument_uid:"0da66728-6c30-44c4-9264-df8fac2467ee" last_price_type:LAST_PRICE_EXCHANGE}
19:15:44 DBG reader.go:100 > Reader InvestAPI reader stocks: instrument BBG00475KKY8 has last lot price 921.8000
19:15:45 TRC reader.go:97 > Reader InvestAPI reader stocks received: last_price:{figi:"BBG00475KKY8" price:{units:922} time:{seconds:1731687345 nanos:742633000} instrument_uid:"0da66728-6c30-44c4-9264-df8fac2467ee" last_price_type:LAST_PRICE_EXCHANGE}
19:15:45 DBG reader.go:100 > Reader InvestAPI reader stocks: instrument BBG00475KKY8 has last lot price 922.0000
19:15:45 TRC reader.go:97 > Reader InvestAPI reader etfs received: last_price:{figi:"BBG333333333" price:{units:5 nano:880000000} time:{seconds:1731687345 nanos:793230000} instrument_uid:"9654c2dd-6993-427e-80fa-04e80a1cf4da" last_price_type:LAST_PRICE_EXCHANGE}
19:15:45 DBG reader.go:100 > Reader InvestAPI reader etfs: instrument BBG333333333 has last lot price 5.8800
^C19:15:46 INF main.go:172 > Signal interrupt is received
19:15:46 INF reader.go:72 > Reader InvestAPI reader stocks is closing grpc subscription for 2 instruments
19:15:46 DBG reader.go:90 > Connection for InvestAPI reader stocks is canceled
19:15:46 DBG service_subscribe.go:24 > Closing subscription channel for writer 1 container2...
19:15:46 DBG service_start.go:91 > Closing broadcasting...
19:15:46 DBG service_subscribe.go:27 > Subscription channel for writer 1 container2 is closed
19:15:46 DBG reader.go:90 > Connection for InvestAPI reader etfs is canceled
19:15:46 DBG service_subscribe.go:24 > Closing subscription channel for writer 0 container1...
19:15:46 DBG service_subscribe.go:27 > Subscription channel for writer 0 container1 is closed
19:15:46 DBG service_start.go:34 > 2 readers are closing
19:15:46 INF reader.go:72 > Reader InvestAPI reader etfs is closing grpc subscription for 1 instruments
19:15:46 DBG service_close.go:18 > close: reader InvestAPI reader etfs is terminated
19:15:46 DBG service_close.go:18 > close: reader InvestAPI reader stocks is terminated
19:15:46 DBG service_close.go:28 > close: writer container1 is terminated
19:15:46 DBG service_close.go:28 > close: writer container2 is terminated
19:15:46 INF service_close.go:30 > close: system is stopped
19:15:46 INF main.go:196 > Stocks Broadcaster is terminated.
make: *** [Makefile:38: start] Ошибка 1