Блог им. Volokola

Как я написал коннектор к REST IP Финама на Go

Предисловие

Я — профессиональный программист. Уже достаточно давно. Последние N лет разработчик БД. В основном пишу на sql процедуры и функции. Другие языки программирования начинаю забывать (так как нет практики по ним). В свое время писал на Visual FoxPro (да, это уже «мертвый» язык, он уже давно не поддерживается Microsoft). Но у нас до сих пор крутится задача, где клиентская частью написана на VFP.


Почему Go

Так вот. Встала тут задача написать небольшую консольную утилиту с доступом к БД. Сначала хотел написать на Питоне, но не хотелось на компьютере клиента качать и устанавливать его. И стал я присматриваться к другим языкам программирования. C# не хотелось, во первых чисто субъективно, во вторых, клиент в дальнейшем собирался переходить на Linux (хотя вроде есть core net под линукс). И тогда cтал я присматриваться к языку Go.

Прочитал по нему несколько статей. По описанию, он как никто подходил к поставленной задаче: крост-платформенный. Компилируется в один исполняемый файл, который не требует зависимостей.
Скачал и прочитал пару книжек. Для изучения Не первого языка программирования, Go оказался очень прост по структуре и синтаксису. Начать кодить на нем можно достаточно быстро.
Написал утилитку по работе. И этот язык мне так понравился, что я решил его изучать дальше. Но что за изучение языка без практического навыка? Обязательно в этом случае нужен «Пет-проект». А так как я уже некоторое время занимаюсь спекуляцией на рынках (давно написан и крутится в работе бот-помощник для торговли), то проект решил делать в финансовом направлении.

Выбор пал на создание коннектора к брокеру Финам к его Trade API через REST

 

Аналоги

Первоначально начал искать аналоги для ознакомления.
На сайте с примерами в основном проекты на Python. И есть один на Goland от DBoyara  (на текущий момент он в статусе архива = не поддерживается). Он реализует протокол gRPC. Для меня, только начинающего изучать эту технологию, это сложновато. Хотелось начать с чего то попроще, с REST API

Нашел хороший «звездный» проект: коннектор кBinance API . Изучил его и некоторые идеи стал использовать в своей разработке.

Trade API от Финама

Спасибо тем, кто смог дочитать до этого места.
Сразу дам ссылку проекта на github.

Весь код бесплатный. Использовать на свой страх и риск. В боевых условиях не тестировалось. Возможны ошибки. 

Реализован почти весь базовый функционал, который есть по протоколу REST API

// AccessTokens проверка подлинности токена
AccessTokens(ctx context.Context) (ok bool, err error)

// GetPortfolio получить данные по портфелю
GetPortfolio(ctx context.Context, opts ...Option) (Portfolio, error)

// GetSecurity получить список инструментов (Максимальное Количество запросов в минуту = 1 )
GetSecurity(ctx context.Context, board, symbol string) (Securities, error)

// GetCandles получить свечи
GetCandles(ctx context.Context, board, symbol string, timeFrame TimeFrame, opts ...Option) ([]Candle, error)

// получить список заявок
GetOrders(ctx context.Context, opts ...Option) ([]Order, error)

// отменить заявку
DeleteOrder(ctx context.Context, transactionId int64) error

// создать новую заявку
//SendOrder(ctx context.Context, order NewOrderRequest) (int64, error)
	
// купить по рынку
BuyMarket(ctx context.Context, symbol, board string, lot int32) (int64, error)
	
// выставить лимитную заявку на покупку
BuyLimit(ctx context.Context, board, symbol string, lot int32, price float64) (int64, error)
	
// продать по рынку
SellMarket(ctx context.Context, board, symbol string, lot int32) (int64, error)
	
// выставить лимитную заявку на продажу
SellLimit(ctx context.Context, board, symbol string, lot int32, price float64) (int64, error)

// TODO
// получить список стоп-заявок
// создать новую стоп-заявку
// отменить стоп-заявку

 

Не доделано выставление стоп-заявок. Возможно это будет в будущем.
В планах также реализовать создание «еванса получение новой свечи». В штатном функционале Финама этого нет (даже по протоколу gRPC).

Приведу пример кода на goland по работе с коннектором (Другие примеры можно увидеть на странице проекта в папке example):

// создание клиента
token := "ваш token"
clientId := "ваш client_id"

client, err := finam.NewClient(token, clientId)
if err != nil {
    slog.Error("main", slog.Any("ошибка создания finam.client", err))
}
// Пример получения данных о портфеле
portfolio, err := client.GetPortfolio(ctx,
    finam.WithIncludePositions(true),
    finam.WithIncludeCurrencies(true),
    finam.WithIncludeMoney(true),
    finam.WithIncludeMaxBuySell(true))

if err != nil {
    slog.Error("main.GetPortfolio", "err", err.Error())
return
}

// баланс счета
slog.Info("Balance", "Equity", portfolio.Equity, "Balance", portfolio.Balance)

// список позиций
for _, pos := range portfolio.Positions {
    slog.Info("position", slog.Any("pos", pos))
}
// список валют счета
slog.Info("portfolio.Currencies", slog.Any("Currencies", portfolio.Currencies))
// список денег
slog.Info("portfolio.Money", slog.Any("Money", portfolio.Money))

 


Что вызвало трудности (непонятки)

1. Разная структура и точки вызова свечей. Почему-то проектировщики api в финаме решили разделить дневные и внутридневные свечи.
2. Очень «мало» информации (полей) в Security (инструменты). В частности, мне для анализа, нужно поле «Открытый интерес».
3. В api нет подписок на появления новых свечей (зато есть возможность реализовать данный функционал самому :) ).

Что дальше?


А дальше, уже практически готов, коннектор к брокеру Алор. К его Alor OpenAPI V2 
Базовый функционал уже реализован. Проект на github выложил в свободном доступе.
Пока не знаю, нужно ли, писать отдельную статью по коннектору к Алор?

И в работе проект по доступу к ISS Московкой биржи и его новому проекту ALGOPACK






 



Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
4.1К | ★7
8 комментариев
воу воу, в полку коннекторов прибыло )
avatar
Луа рулит, го г… О
Т.е. не хотел скачать питон и прочитал пару книжек про го?
avatar

Доктор, Примерно так :)

В «идеале» не хотел быть зависимым от «внешних» библиотек.

avatar
Vadim S, питон скрипт можно собрать в один исполняемый файл с интерпретатором и вкоряченными внутрь всеми либами
avatar
А где веб сокеты? Отношение к REST у меня как к чему-то уходящему. Веб сокеты вполне себе производят все операции. И обработку команду и доставку реал-тайм цифр. Зачем-то еще пока делают две эти пары, хотя сами по себе веб сокеты вполне самодостаточные.

Gambler, веб сокеты реализовал к коннектору Алор .

У Финама нет такой технологии в протоколе. Они пошли по технологии gRPC

avatar
Vadim S, я очень даже в курсе. osaengine.ru/ — тут они у меня в избранном. Вопрос к тебе — зачем рест тогда решил. Это заведомо умирающая технология.

Веб сокеты — это транспорт. gRPC — это формат передачи данных через транспорт. Не путаем )

Ты ответь на вопрос. А почему Go? Ладно сишарп, может и прав. Но ведь очевидно что Питон берут для тредйинга.

Читайте на SMART-LAB:
Фото
🏦 Первый и единственный «золотой банк» России создадут на базе МГКЛ
Совет директоров ПАО «МГКЛ» утвердил обновленную стратегию развития Группы на 2026–2030 годы. Одним из ключевых решений станет приобретение...
Фото
Мушкетёры против хаоса фондового рынка
В кампании «Классика вдохновляет» мы вспомнили о Д'Артаньяне, Атосе, Портосе и Арамисе. Они с детства наши верные товарищи. Интеллект тоже может...
Фото
XAU/USD: тренд остается нисходящим, несмотря на коррекционный отскок
Золото сохраняло нисходящую динамику, обновив очередные локальные минимумы, после чего перешло к умеренному восстановлению. В начале периода...
Фото
Сетевые компании. Изменение целевых цен и смена рейтинга!
Я последнее время наблюдаю такую тенденцию — у компании дивидендный гэп, но акции продолжают отвесно падать, это и произошло с сетевыми...

теги блога Vadim S

....все тэги



UPDONW
Новый дизайн