Documentation
¶
Index ¶
- Variables
- func Duration2CandleInterval(d time.Duration) proto.CandleInterval
- func Duration2SubscriptionInterval(period time.Duration) proto.SubscriptionInterval
- func FindSeries(series *techan.TimeSeries, time time.Time) int
- func IsLimitError(e error) bool
- func LoadTimeSeries(dataDir string, figi string, period time.Duration) (*techan.TimeSeries, error)
- func NewDecimal(q *proto.Quotation) big.Decimal
- func NewMoneyValue(m *Money) *proto.MoneyValue
- func NewQuotation(d big.Decimal) *proto.Quotation
- func SaveTimeSeries(dataDir string, figi string, period time.Duration, ...) error
- func SetLogger(logger *zap.Logger)
- func SubscriptionInterval2Duration(subscriptionInterval proto.SubscriptionInterval) time.Duration
- func UnitsNano2Decimal(units int64, nano int32) big.Decimal
- func UpsertSeries(series *techan.TimeSeries, newCandle *techan.Candle)
- type Account
- type AccountDescription
- type AccountEngine
- type AccountSmart
- type Bot
- type BotConfig
- type Bots
- type CandleChan
- type Candles
- type Client
- type EngineType
- type Instrument
- type LastPrice
- type Money
- type Order
- type OrderBook
- type OrderBookOrder
- type Position
- type Positions
- type TargetPosition
Constants ¶
This section is empty.
Variables ¶
var Interval2string = map[proto.CandleInterval]string{ proto.CandleInterval_CANDLE_INTERVAL_1_MIN: "1min", proto.CandleInterval_CANDLE_INTERVAL_5_MIN: "5min", proto.CandleInterval_CANDLE_INTERVAL_15_MIN: "15min", proto.CandleInterval_CANDLE_INTERVAL_HOUR: "hour", proto.CandleInterval_CANDLE_INTERVAL_DAY: "day", }
Functions ¶
func Duration2CandleInterval ¶
func Duration2CandleInterval(d time.Duration) proto.CandleInterval
func Duration2SubscriptionInterval ¶
func Duration2SubscriptionInterval(period time.Duration) proto.SubscriptionInterval
func FindSeries ¶
func FindSeries(series *techan.TimeSeries, time time.Time) int
TODO очень не оптимально, надо переделывать, например на деление пополам с кешированием последней найденной позиции
func LoadTimeSeries ¶
func NewMoneyValue ¶
func NewMoneyValue(m *Money) *proto.MoneyValue
func SaveTimeSeries ¶
func SubscriptionInterval2Duration ¶
func SubscriptionInterval2Duration(subscriptionInterval proto.SubscriptionInterval) time.Duration
func UpsertSeries ¶
func UpsertSeries(series *techan.TimeSeries, newCandle *techan.Candle)
Types ¶
type Account ¶
type Account interface {
AccountDescription
AccountEngine
AccountSmart
}
Интерфейс торгового счёта
type AccountDescription ¶
type AccountDescription interface {
GetId() string
GetType() proto.AccountType
GetEngineType() EngineType
GetName() string
GetStatus() proto.AccountStatus
GetAccessLevel() proto.AccessLevel
GetClosedDate() time.Time
GetOpenedDate() time.Time
}
описание счёта (совместим с proto интерфейсами tinkoff инвестиции)
type AccountEngine ¶
type AccountEngine interface {
GetPositions(ctx context.Context) (*Positions, error)
GetOrders(ctx context.Context) ([]Order, error)
GetBalance(ctx context.Context, i Instrument) int64
GetBlocked(ctx context.Context, i Instrument) int64
PostOrder(ctx context.Context, instrument Instrument, quantity int64, price big.Decimal, direction proto.OrderDirection, orderType proto.OrderType, orderId string) (Order, error)
CancelOrder(ctx context.Context, orderId string) (time.Time, error)
GetClient() Client // возвращает интерфейс Client, в рамках которого создан данный счёт
}
реализация торговых поручений
type AccountSmart ¶
type AccountSmart interface {
// стремиться достичь требуемую позицию используя лимитированные заявки с ценой на минимальный шаг лучше текущей лучшей цены
DoPosition(ctx context.Context, bot Bot, instrument Instrument, targetPosition int64) TargetPosition
// стремиться достичь требуемую позицию используя лимитированные заявки с ценой на priceIncriment лучше текущей лучшей цены
DoPositionExtended(ctx context.Context, bot Bot, instrument Instrument, targetPosition int64, priceIncriment big.Decimal) TargetPosition
// отправляет лимитированную заявку с ценой на priceIncriment лучше текущей лучшей цены
PostOrderWithBestPrice(ctx context.Context, instrument Instrument, quantity int64, priceIncriment big.Decimal) (Order, error)
}
функции, позволяющие писать робота в парадигме "сейчас нужна позиция XXX", вместо нужно выставить сделку
type Bot ¶
type Bot interface {
Start() error // вызывается при старте робота. Отличное место чтобы подписатсья на рыночную информацию
Stop() error // вызывается при остановки робота. Отличное место чтобы отписаться от рыночной информации, закрыть позиции.
Context() context.Context // контекст робота, именно от него происходит взаимодействие с tinkoff api
Name() string // имя робота, желательно читаемое и уникальное. Активно используется в качестве меток метрик
}
интерфейс, который должны реализовывать роботы
type BotConfig ¶
type BotConfig struct {
Name string // имя робота
Account Account // счёт, на котором робот будет торгавать
Instrument Instrument // инструмент, которым робот будет торгавать
Values map[string]any // произвольные параметры робота
}
настройки для робота
func (*BotConfig) GetIntOrDie ¶
func (*BotConfig) GetStringOrDie ¶
type Candles ¶
type Candles interface {
GetFigi() string
GetPeriod() time.Duration
GetSeries() *techan.TimeSeries
Load(ctx context.Context, from time.Time, to time.Time) error
Subscribe() (candleChan CandleChan, err error)
Unsubscribe(candleChan CandleChan) error
}
интерфейс работы со свечами
type Client ¶
type Client interface {
// получить параметры инструмента и рыночные данные о торгах
// на каждый вызов, для одного и того же figi будет возвращён один и тот же объект
GetInstrument(figi string) Instrument
// текущее время
// например, если считаем свечку закрытой, через 10 секунд после наступления нового периода,
// или если заявку по плохой цене держим ещё в течении минуты
// то, оринтироваться надо именно на это время, т.к. в режиме тестирования на истории время time.Now() будет возвращять не то, что ожидает робот
Now() time.Time
// если в процессе торговли робот выводи сообщения, то их выводить следует через данную функцию,
// т.к. в зависимости от режима торгов, назначение вывода может меняться. Например, при тестировании на истории, вывод робота игнорируется
Printf(format string, arg ...any) (n int, err error)
}
Корневой элемент, через который робот может получить информацию об окружающем мире
type EngineType ¶
type EngineType int32
Тип счёта.
const ( EngineType_UNSPECIFIED EngineType = iota // значение не определено EngineType_HISTORICAL EngineType = iota // счёт для тестирования на истории EngineType_SANDBOX EngineType = iota // счёт для песочницы EngineType_REAL EngineType = iota // боевой счёт )
type Instrument ¶
type Instrument interface {
GetCandles(period time.Duration) Candles // Получить интерфейс дл работы со свечами указанного периода
GetFigi() string // Figi-идентификатор инструмента.
GetExchange() string // Торговая площадка.
GetClassCode() string // Класс-код (секция торгов).
GetIsin() string // Isin-идентификатор инструмента.
GetLot() int32 //Количество в лоте
GetTicker() string // Тикер инструмента.
GetCurrency() string // Валюта расчётов.
GetName() string // Название инструмента.
GetLastPrices(ctx context.Context) ([]*LastPrice, error) // Получить массив последних цен инструмента
GetOrderBook(ctx context.Context, depth int32) (*OrderBook, error) // Получить стакан инструмента
GetMinPriceIncrement() big.Decimal // Шаг цены.
IsStatus(tradingStatus ...proto.SecurityTradingStatus) bool // Проверяет, является ли статус инструмента, любым из указанных в аргументах
IsLimitOrderAvailable() bool // Можно ли выставлять лимитные заявки по данному инструменту
IsMarketOrderAvailable() bool // Можно ли выставлять рыночные заявки по данному инструменту
Now() time.Time // Текущее (для тестирования на истории)
}
получение информации по инструменту
type LastPrice ¶
type LastPrice struct {
Figi string //Идентификатор инструмента.
Price big.Decimal //Последняя цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента.
Time time.Time //Время получения последней цены в часовом поясе UTC по времени биржи.
}
Информация о цене.
type Order ¶
type Order interface {
GetFigi() string //Идентификатор инструмента.
GetExecutionReportStatus() proto.OrderExecutionReportStatus //Текущий статус заявки.
GetDirection() proto.OrderDirection //Направление сделки.
GetLotsRequested() int64 //Запрошено лотов.
GetLotsExecuted() int64 //Исполнено лотов.
GetOrderId() string // Идентификатор заявки
GetOrderDate() time.Time //Дата и время выставления заявки в часовом поясе UTC.
GetInitialOrderPrice() *Money //Начальная цена заявки. Произведение количества запрошенных лотов на цену.
Cancel(ctx context.Context) (time.Time, error) // Отменить заявку
IsActive() bool // Является ли заявка активной
IsBestInOrderBook(ctx context.Context) bool // Является ли заявка лучшей в стакане
}
информация о торговом поручении
type OrderBook ¶
type OrderBook struct {
Figi string //Figi-идентификатор инструмента.
Depth int32 //Глубина стакана.
Bids []OrderBookOrder //Множество пар значений на покупку.
Asks []OrderBookOrder //Множество пар значений на продажу.
LastPrice big.Decimal //Цена последней сделки за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента.
ClosePrice big.Decimal //Цена закрытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента.
LimitUp big.Decimal //Верхний лимит цены за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента.
LimitDown big.Decimal //Нижний лимит цены за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента.
}
Информация о стакане.
func NewOrderBook ¶
func NewOrderBook(ob *proto.GetOrderBookResponse) *OrderBook
type OrderBookOrder ¶
type OrderBookOrder struct {
Price big.Decimal //Цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента.
Quantity int64 //Количество в лотах.
}
информация о заявке
func NewOrderBookOrders ¶
func NewOrderBookOrders(orders []*proto.Order) []OrderBookOrder
type Position ¶
type Position interface {
GetFigi() string //Figi-идентификатор.
GetBlocked() int64 //Заблокировано.
GetBalance() int64 //Текущий незаблокированный баланс.
}
Баланс позиции
type Positions ¶
type Positions struct {
Money []*Money //Массив валютных позиций портфеля.
Blocked []*Money //Массив заблокированных валютных позиций портфеля.
Positions map[string]Position //Список позиций портфеля (обединяет ценно-бумажные и фьючерсы). Ключ figi.
LimitsLoadingInProgress bool //Признак идущей в данный момент выгрузки лимитов.
}
Портфель по счёту.
type TargetPosition ¶
объект возвращаемый DoPosition, который сообщает о статусе достежения требуемой позиции, и об ошибках, если они были