trengin

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 18, 2021 License: MIT Imports: 7 Imported by: 3

README

trengin

Lint Status Test Status Go Report Card

Golang библиотека для создания торгового робота. Связывает торговую стратегию и реализацию исполнения торговых операций. Позволяет гибко описать стратегию.

Содержание

Установка

go get github.com/evsamsonov/trengin

Как использовать

Импортировать пакет.

import "github.com/evsamsonov/trengin"

Создать экземпляр, передав объекты реализующие интерфейс Strategy и Broker.


tradingEngine := trengin.New(strategy, broker)
tradingEngine.Run()

Основные сущности

Название Описание
Engine Торговый движок
Strategy Торговая стратегия
Broker Модуль исполнения торговых операций
Actions Канал для отправки торговых действий
Position Торговая позиция
PositionClosed Канал, в который будет отправлена позиция при закрытии

Как реализовать торговую стратегию

Торговая стратегия описана следующим интерфейсом.

type Strategy interface {
	Run(ctx context.Context)
	Actions() Actions
	Errors() <-chan error
}

В методе Run реализуется логика торговой стратегии. Здесь может быть анализ текущих данных, открытие позиции, анализ данных по открытой позиции для закрытия или для изменения условной заявки (перестановка стопа в безубыток, трейлинг стоп и т. п.).

Метод Actions должен вернуть канал через который будет происходить отправка торговых действий. Если закрыть канал, то торговый движок завершит свою работу.

Метод Errors должен вернуть канал для отправки критических ошибок в работе стратегии. Если закрыть канал или передать в него ошибку, торговый движок завершит свою работу.

В канал торговых действий можно отправить экземпляры OpenPositionAction, ClosePositionAction, ChangeConditionalOrderAction. Создаются через конструкторы. При отправке неожидаемых типов торговый движок завершит работу с ошибкой.

OpenPositionAction

Открытие позиции.

Конструктор: NewOpenPositionAction

Параметр Описание
positionType Тип позиции (покупка или продажа)
stopLossIndent Отступ стоп-лосса от цены открытия позиции
takeProfitIndent Отступ тейк-профита от цены открытия позиции
ChangeConditionalOrderAction

Изменение условной заявки.

Конструктор: NewChangeConditionalOrderAction

Наименование Описание
positionID Идентификатор позиции
stopLoss Новое значения для стоп-лосса (если равно 0, то не изменять)
takeProfit Новое значения для стоп-лосса (если равно 0, то не изменять)
ClosePositionAction

Закрытие позиции.

Конструктор: NewClosePositionAction

Наименование Описание
positionID Идентификатор позиции

Пример отправки действия и получения результата.

sendActionOrDone := func(ctx context.Context, action interface{}) error {
    select {
    case <-ctx.Done():
    	return ctx.Err()
    case s.actions <- action:
    }
    return nil
}

var stopLossIndent, takeProfitIndent float64
action := trengin.NewOpenPositionAction(trengin.Long, stopLossIndent, takeProfitIndent)
if err = s.sendActionOrDone(ctx, action); err != nil {
    // Обработка ошибки
}
result, err := action.Result(ctx)
if err != nil {
    // Обработка ошибки
}

Как реализовать модуль исполнения торговых операций

Описан следующим интерфейсом.

type Broker interface {
	OpenPosition(ctx context.Context, action OpenPositionAction) (Position, PositionClosed, error)
	ClosePosition(ctx context.Context, action ClosePositionAction) (Position, error)
	ChangeConditionalOrder(ctx context.Context, action ChangeConditionalOrderAction) (Position, error)
}

Метод OpenPosition должен открывать новую позицию по action, возвращать экземпляр открытой позиции и канал, в который будет записана позиция при её закрытии. Должен реализовывать отслеживания закрытия позиции по условной заявке. После отправки закрытой позиции канал PositionClosed требуется закрыть.

Метод ClosePosition должен закрывать позицию по action. Возвращать экземпляр закрытой позиции.

Метод ChangeConditionalOrder должен изменить условную заявку по action. Возвращать актуальный экземпляр позиции.

Описание сущности Position

Структура Position описывает торговую позицию. Содержит уникальный в рамках одного запуска идентификатор ID , основные и дополнительные данные о позиции. Может быть в двух состояниях — открытом и закрытом. Некоторые методы возвращают корректное значение только при закрытой позиции.

Дополнительные данные Extra следует использовать только в информационных целях, не завязывая на них логику работы стратегии и модуля исполнения торговых операций. Кроме случаев локального использования.

Создается через конструктор NewPosition по action с временем открытия openTime и ценой открытия openPrice. Позиция должна создаваться и закрываться в реализации Broker. В реализацию Strategy передается копия позиции с возможностью установить дополнительные данные.

Поля

Название Описание
ID Уникальный идентификатор в рамках запуска
Type Тип
OpenTime Время открытия
OpenPrice Цена открытия
CloseTime Время закрытия
ClosePrice Цена закрытия
StopLoss Текущий стоп лосс
TakeProfit Текущий тейк профит

Методы

Название Описание
Close Метод для закрытия позиции. Принимает время закрытия closeTime и цену закрытия closePrice. Если позиция уже закрыта, вернет ошибку ErrAlreadyClosed
Closed Возвращает канал, который будет закрыт при закрытии позиции
IsLong Тип сделки "покупка"
IsShort Тип сделки "продажа"
Profit Прибыль по закрытой сделке
ProfitByPrice Прибыль по переданной цене price
Duration Длительность сделки с момента открытия до закрытия
Extra Вернет дополнительные данные по ключу key, либо nil, если данные не найдены
SetExtra Устанавливает значение val для ключа key
RangeExtra Выполняет переданную функцию для каждого значения в списке Extra

Дополнительные действия на события

Для выполнения дополнительных действий (отправка оповещений, сохранение позиции в БД и т. п.) торговый движок предоставляется методы, с помощью которых можно установить колбэки. Методы не потокобезопасны, вызывать следует до запуска стратегии в работу.

Метод Описание
OnPositionOpened Устанавливает коллбек на открытие позиции
OnConditionalOrderChanged Устанавливает коллбек на изменение условной заявки
OnPositionClosed Устанавливает коллбек на закрытие позиции

Что дальше

  • Реализовать модули для исполнения торговых операций для различных торговых систем.
  • Добавить возможность открывать позиции по разным торговым инструментам.

Documentation

Overview

Package trengin предоставляет каркас для создания торгового робота. Определяет интерфейс Strategy и Broker, позволяя связать реализации этих интерфейсов через экземпляр Engine.

Strategy имеет возможность гибко выполнять действия по открытию новой позиции (OpenPositionAction), изменении условной заявки позиции (стоп-лосс и тейк-профит) (ChangeConditionalOrderAction) и закрытию позиции (ClosePositionAction).

Broker должен реализовывать функционал открытия сделки, отслеживания статуса условной заявки, изменения условной заявки и закрытия позиции.

Для выполнения дополнительного функционала можно устанавливать коллбеки на события изменения позиции c помощью методов OnPositionOpened, OnPositionClosed и OnConditionalOrderChanged

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrSendResultTimeout = errors.New("send result timeout")
	ErrUnknownAction     = errors.New("unknown action")
	ErrAlreadyClosed     = errors.New("already closed")
	ErrActionNotValid    = errors.New("action not valid")
)

Functions

This section is empty.

Types

type Actions

type Actions <-chan interface{}

Actions это канал для передачи торговых действий от Strategy к Broker Может принимать типы OpenPositionAction, ClosePositionAction, ChangeConditionalOrderAction. Неожиданные типы приведут к ошибке и завершению работы Engine

type Broker

type Broker interface {
	// OpenPosition открывает позицию и запускает отслеживание условной заявки
	// Возвращает открытую позицию, и канал PositionClosed, в который будет отправлена
	// позиция при закрытии.
	OpenPosition(ctx context.Context, action OpenPositionAction) (Position, PositionClosed, error)

	// ClosePosition закрывает позицию. Возвращает закрытую позицию
	ClosePosition(ctx context.Context, action ClosePositionAction) (Position, error)

	// ChangeConditionalOrder изменяет условную заявку по позиции. Возвращает измененную позицию
	ChangeConditionalOrder(ctx context.Context, action ChangeConditionalOrderAction) (Position, error)
}

Broker описывает интерфейс клиента, исполняющего торговые операции и отслеживающего статус условных заявок по позициям.

type ChangeConditionalOrderAction

type ChangeConditionalOrderAction struct {
	PositionID PositionID
	StopLoss   float64
	TakeProfit float64
	// contains filtered or unexported fields
}

ChangeConditionalOrderAction описывает действие на изменение условной заявки позиции с идентификатором PositionID. При передаче StopLoss или TakeProfit равным 0 данные значения не должны изменяться.

func NewChangeConditionalOrderAction

func NewChangeConditionalOrderAction(positionID PositionID, stopLoss, takeProfit float64) ChangeConditionalOrderAction

NewChangeConditionalOrderAction создает действие на изменение условной заявки по позиции с указанным positionID и новыми значения stopLoss и takeProfit. Если менять stopLoss или takeProfit не требуется, то нужно передать их равными 0.

func (*ChangeConditionalOrderAction) Result

Result возвращает канал, который вернет результат выполнения действия на изменения условной заявки.

type ChangeConditionalOrderActionResult

type ChangeConditionalOrderActionResult struct {
	Position Position
	// contains filtered or unexported fields
}

ChangeConditionalOrderActionResult описывает результат изменения условной заявки

type ClosePositionAction

type ClosePositionAction struct {
	PositionID PositionID
	// contains filtered or unexported fields
}

ClosePositionAction описывает действие по закрытию позиции.

func NewClosePositionAction

func NewClosePositionAction(positionID PositionID) ClosePositionAction

NewClosePositionAction создает действие на закрытие позиции с идентификатором positionID.

func (*ClosePositionAction) Result

Result возвращает результат выполнения действия на закрытия позиции.

type ClosePositionActionResult

type ClosePositionActionResult struct {
	Position Position
	// contains filtered or unexported fields
}

ClosePositionActionResult описывает результат закрытия позиции.

type Engine

type Engine struct {
	// contains filtered or unexported fields
}

Engine описывыет торговый движок. Создавать следует через конструктор New

func New

func New(strategy Strategy, broker Broker) *Engine

New создает экземпляр Engine и возвращает указатель на него

func (*Engine) OnConditionalOrderChanged

func (e *Engine) OnConditionalOrderChanged(f func(position Position)) *Engine

OnConditionalOrderChanged устанавливает коллбек f на изменение условной заявки по позиции. Актуальная позиция передается параметром в метод f. Возвращает указатель на Engine, реализуя текучий интерфейс.

Метод не потокобезопасен. Не следует вызывать в разных горутинах и после запуска Engine

func (*Engine) OnPositionClosed

func (e *Engine) OnPositionClosed(f func(position Position)) *Engine

OnPositionClosed устанавливает коллбек f на закрытие позиции. Актуальная позиция передается параметром в метод f. Возвращает указатель на Engine, реализуя текучий интерфейс.

Метод не потокобезопасен. Не следует вызывать в разных горутинах и после запуска Engine

func (*Engine) OnPositionOpened

func (e *Engine) OnPositionOpened(f func(position Position)) *Engine

OnPositionOpened устанавливает коллбек f на открытие позиции. Актуальная позиция передается параметром в метод f. Возвращает указатель на Engine, реализуя текучий интерфейс.

Метод не потокобезопасен. Не следует вызывать в разных горутинах и после запуска Engine

func (*Engine) Run

func (e *Engine) Run(ctx context.Context) (err error)

Run запускает стратегию в работу

type MockBroker

type MockBroker struct {
	mock.Mock
}

MockBroker is an autogenerated mock type for the Broker type

func (*MockBroker) ChangeConditionalOrder

func (_m *MockBroker) ChangeConditionalOrder(ctx context.Context, action ChangeConditionalOrderAction) (Position, error)

ChangeConditionalOrder provides a mock function with given fields: ctx, action

func (*MockBroker) ClosePosition

func (_m *MockBroker) ClosePosition(ctx context.Context, action ClosePositionAction) (Position, error)

ClosePosition provides a mock function with given fields: ctx, action

func (*MockBroker) OpenPosition

func (_m *MockBroker) OpenPosition(ctx context.Context, action OpenPositionAction) (Position, PositionClosed, error)

OpenPosition provides a mock function with given fields: ctx, action

type MockStrategy

type MockStrategy struct {
	mock.Mock
}

MockStrategy is an autogenerated mock type for the Strategy type

func (*MockStrategy) Actions

func (_m *MockStrategy) Actions() Actions

Actions provides a mock function with given fields:

func (*MockStrategy) Errors

func (_m *MockStrategy) Errors() <-chan error

Errors provides a mock function with given fields:

func (*MockStrategy) Run

func (_m *MockStrategy) Run(ctx context.Context)

Run provides a mock function with given fields: ctx

type OpenPositionAction

type OpenPositionAction struct {
	Type PositionType

	// Отступ стоп-лосса от цены открытия. Если равен 0, то стоп-лосс не должен использоваться
	StopLossIndent float64

	// Отступ тейк-профита от цены открытия. Если равен 0, то тейк-профит не должен использоваться
	TakeProfitIndent float64
	// contains filtered or unexported fields
}

OpenPositionAction описывает действие по открытию позиции с типом Type и отступами условной заявки StopLossIndent и TakeProfitIndent

func NewOpenPositionAction

func NewOpenPositionAction(positionType PositionType, stopLossIndent, takeProfitIndent float64) OpenPositionAction

NewOpenPositionAction создает действие на открытие позиции с типом positionType, отступом стоп-лосса от цены открытия stopLossIndent и отступом тейк-профита от цены открытия takeProfitIndent. Если стоп-лосс или тейк-профит не требуются, то соответствующие значения отступов должны быть равны 0.

func (*OpenPositionAction) IsValid

func (a *OpenPositionAction) IsValid() bool

IsValid проверяет, что действие валидно

func (*OpenPositionAction) Result

Result возвращает результат выполнения действия на открытие позиции.

type OpenPositionActionResult

type OpenPositionActionResult struct {
	Position Position
	Closed   PositionClosed // Канал, для отслеживания закрытия сделки
	// contains filtered or unexported fields
}

OpenPositionActionResult результат открытия позиции

type Position

type Position struct {
	ID         PositionID
	Type       PositionType
	OpenTime   time.Time
	OpenPrice  float64
	CloseTime  time.Time
	ClosePrice float64
	StopLoss   float64
	TakeProfit float64
	// contains filtered or unexported fields
}

Position описывает торговую позицию. Идентификатор ID является уникальным только в рамках одного запуска

func NewPosition

func NewPosition(action OpenPositionAction, openTime time.Time, openPrice float64) (*Position, error)

NewPosition создает новую позицию по action, с временем открытия openTime и с ценой открытия openPrice. Если action невалиден, то вернет ErrActionNotValid.

func (*Position) Close

func (p *Position) Close(closeTime time.Time, closePrice float64) (err error)

Close закрывает позицию с временем закрытия closeTime и ценой закрытия closePrice. При повторном вызове вернет ошибку ErrAlreadyClosed, время и цена закрытия в этом случае не изменится.

func (*Position) Closed

func (p *Position) Closed() <-chan struct{}

Closed возвращает канал, который будет закрыт при закрытии позиции

func (*Position) Duration

func (p *Position) Duration() time.Duration

Duration возвращает длительность закрытой сделки

func (*Position) Extra

func (p *Position) Extra(key interface{}) interface{}

Extra получает значение дополнительного поля по ключу key. Если значение не задано, то вернет nil

func (*Position) IsLong

func (p *Position) IsLong() bool

func (*Position) IsShort

func (p *Position) IsShort() bool

func (*Position) Profit

func (p *Position) Profit() float64

Profit возвращает прибыль по закрытой сделке. Для получения незафиксированной прибыли по открытой позиции следует использовать метод ProfitByPrice

func (*Position) ProfitByPrice

func (p *Position) ProfitByPrice(price float64) float64

ProfitByPrice возвращает прибыль позиции при указанной цене price

func (*Position) RangeExtra

func (p *Position) RangeExtra(f func(key interface{}, val interface{}))

RangeExtra применяет функцию f ко всем элементам списка Extra

func (*Position) SetExtra

func (p *Position) SetExtra(key interface{}, val interface{}) *Position

SetExtra устанавливает значение дополнительного поля с ключом key. Может использоваться для хранения дополнительных необязательных информационных данных при реализации стратегии или брокера. Не следует завязываться на эти данные при реализации логики работы Strategy или Broker. Исключение: локальное использование в рамках реализации Strategy или Broker

type PositionClosed

type PositionClosed <-chan Position

PositionClosed канал, в который отправляется позиция при закрытии

type PositionID

type PositionID int64

type PositionType

type PositionType int
const (
	Long PositionType = iota + 1
	Short
)

func (PositionType) Multiplier

func (t PositionType) Multiplier() float64

Multiplier возвращает 1 для значения Long, -1 для значения Short и 0 на любое другое значение. Может использоваться как множитель при вычислениях, которые зависят от типа позиции, например, при вычислении прибыли по позиции

type Strategy

type Strategy interface {
	// Run запускает стратегию в работу
	Run(ctx context.Context)

	// Actions возвращает канал для получения торговых действий. При закрытии
	// канала Engine завершит работу.
	Actions() Actions

	// Errors возвращает канал для получения ошибок. При получении сообщения
	// из канала или на его закрытие Engine завершит работу.
	Errors() <-chan error
}

Strategy описывает интерфейс торговой стратегии. Позволяет реализовать стратегию, взаимодействуя с Engine через каналы, которые возвращают методы Actions и Errors. Actions используется для отправки торговых действий, Errors для оповещения о критической ошибке. Есть закрыть любой из каналов или отправить значение в канал ошибок, то Engine завершит свою работу

Directories

Path Synopsis
broker
tinkoff Module

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL