Skip to content

jstalex/tingo

 
 

Repository files navigation

Интервальный робот (Уровневый, Сеточный)

Стратегия

Есть бумаги с высокой волатильностью, цены которых часто ходят в рамках коридора. Цель сеточного бота - найти подходящие бумаги и значения границ этого коридора, чтобы автоматически покупать по нижней границе и продавать по верхней границе.

Алгоритм работы бота:

  1. Отбор инструментов

    Например, берутся все рублевые акции с Московской биржи, если цена одного лота больше чем MaxPositionPrice, инструмент отбрасывается. Далее для оставшихся инструментов запускается анализ Analyse их исторических свечей за DaysToCalculateInterval дней. Результат анализа - это значение интервала цены и максимальная волатильность - максимум функции волатильности где Crosses - кол-во пересечений исторических свечей и интервала (width/price * 100) - ширина этого интервала относительно средней цены в процентах Volatility = Crosses * (width/price * 100)

  2. Торговля

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

Конфигурация

type IntervalStrategyConfig struct {
// Instruments - Слайс идентификаторов инструментов первичный
Instruments []string
// PreferredPositionPrice - Предпочтительная стоимость открытия позиции в валюте
PreferredPositionPrice float64
// MaxPositionPrice - Максимальная стоимость открытия позиции в валюте
MaxPositionPrice float64
// MinProfit - Минимальный процент выгоды, с которым можно совершать сделки
MinProfit float64
// IntervalUpdateDelay - Время ожидания для перерасчета интервала цены
IntervalUpdateDelay time.Duration
// TopInstrumentsQuantity - Топ лучших инструментов по волатильности
TopInstrumentsQuantity int
// SellOut - Если true, то по достижению дедлайна бот выходит из всех активных позиций
SellOut bool
// StorageDBPath - Путь к бд sqlite, в которой лежат исторические свечи по инструментам
StorageDBPath string
// StorageCandleInterval - Интервал для обновления и запроса исторических свечей
StorageCandleInterval pb.CandleInterval
// StorageFromTime - Время, от которого будет хранилище будет загружать историю для новых инструментов
StorageFromTime time.Time
// StorageUpdate - Если true, то в хранилище обновятся все свечи до now
StorageUpdate bool
// DaysToCalculateInterval - Кол-во дней, на которых рассчитывается интервал цен для торговли
DaysToCalculateInterval int
// StopLossPercent - Процент изменения цены, для стоп-лосс заявки
StopLossPercent float64
// AnalyseLowPercentile - Нижний процентиль для расчета интервала
AnalyseLowPercentile float64
// AnalyseHighPercentile - Верхний процентиль для расчета интервала
AnalyseHighPercentile float64
// Analyse - Тип анализа исторических свечей при расчете интервала
Analyse AnalyseType
}

Доступно 3 варианта анализа свечей:

// AnalyseType - Тип анализа исторических свечей при расчете интервала
type AnalyseType int

const (
	// MATH_STAT - Анализ свечей при помощи пакета stats. Интервал для цены это AnalyseLowPercentile-AnalyseHighPercentile
	// из выборки средних цен свечей за последние DaysToCalculateInterval дней
	MATH_STAT AnalyseType = iota
	// BEST_WIDTH - Анализ свечей происходит так:
	// Вычисляется медиана распределения выборки средних цен свечей за последние DaysToCalculateInterval дней, от нее берется
	// сначала фиксированный интервал шириной MinProfit процентов от медианы, далее если это выгодно интервал расширяется.
	// Так же есть возможность задать фиксированный интервал в процентах.
	BEST_WIDTH
	// SIMPLEST - Поиск интервала простым перебором
	SIMPLEST
)

Исполнитель

Под стратегию написан исполнитель, он выставляет лимитные торговые поручения. Так же реализован механизм отслеживания последних цен для стоп-лосс заявки и стоп-лимит заявки на покупку. Цикл работы исполнителя:

  1. Если цена достигла нижней границы интервала, выставляем лимитную заявку на покупку
  2. Как только заявка на покупку исполнилась, выставляем лимитную заявку на продажу
  3. Как только заявка на продажу исполнилась переходим к шагу 1

Если после покупки цена инструмента падает ниже цена покупки * (1-StopLossPercent/100), отменяем заявку на продажу и продаем по рынку. Если после покупки цена в этот торговый день так не достигла верхнего интервала и не упала ниже цена покупки * (1-StopLossPercent/100), то продаем в конце дня по рынку

Покупка

Заявка на покупку не выставляется если:

  • Позиция уже открыта
  • На счету недостаточно денежных средств
  • Цена последней сделки меньше нижней границы интервала

Продажа

Заявка на продажу не выставляется если:

  • Позиция не открыта

Режим работы

Данный пример ориентирован на торговлю внутри одного дня. За расписанием торгов следит investgo.Timer, он сигнализирует о начале и завершении основной торговой сессии на сегодня. При запуске main investgo.Timer возвращает канал с событиями, START/STOP - сигналы к запуску и остановке бота, если выставлен флаг SellOut в конфигурации стратеги и время cancelAhead при создании таймера, то бот завершит работу и закроет все позиции за cancelAhead до конца торгов текущего дня.

Запуск

Важно! В примерах роботов interval_bot и загрузчика стаканов order_book_download используется драйвер для sqlite, который является cgo пакетом. Перед запуском убедитесь, что на вашем компьютере установлен gcc.

Клонируйте репозиторий

git clone https://github.com/russianinvestments/invest-api-go-sdk

Перейдите в папку с ботом

cd invest-api-go-sdk/examples/interval_bot

Создайте файл config.yaml

touch "config.yaml"

И заполните его по примеру example.yaml

AccountId: ""
APIToken: <your_token>
EndPoint: sandbox-invest-public-api.tinkoff.ru:443
AppName: invest-api-go-sdk
DisableResourceExhaustedRetry: false
DisableAllRetry: false
MaxRetries: 3

Важно! Далее необходимо загрузить исторические свечи по инструментам. Для этого нужно воспользоваться загрузчиком, который будет по частям запрашивать свечи и сохранять их в sqlite. Вы можете указать свой набор инструментов, но для быстрого старта рекомендуется просто запустить загрузчик с настройками по умолчанию и он загрузит все минутные свечи по рублевым фондам и акциям с Московской биржи за последние полгода. Этот процесс займет ~30 минут.

Создайте папку для свечей

mkdir candles

Запустите загрузчик

go run cmd/candles_downloader/download_candles.go

После этого можно запускать бота на песочнице, проде или проверить бектест

Для быстрого старта на песочнице достаточно указать только токен, остальное заполнится по умолчанию.

go run cmd/main.go

Обратите внимание, что в одной функции main есть возможность создать несколько клиентов для investAPI c разными токенами и счетами, а с разными клиентами можно создавать разных ботов и запускать их одновременно.

Backtest

У робота реализована возможность проверки стратегии на исторических данных. Логика бектеста максимально приближена к логике работы настоящего исполнителя, в ней учтены стоп-лоссы, стоп-лимиты на покупку, а так же комиссия брокера за сделку.

Убедитесь, что вы выполнили все шаги необходимые для запуска робота и скачали историю, затем выполните:

go run cmd/backtest/backtest.go

Пройдет проверка одного конфига на истории за последние полгода. Чтобы изменить конфигурацию для проверки, откройте файл backtest/backtest.go и в самом начале измените нужные параметры.

  • Для проверки другого конфига измените структуру configToTest
  • Для запуска генерации различных конфигураций измените переменную mode с TEST_WITH_CONFIG на TEST_WITH_MULTIPLE_CONFIGS. Генерация и проверка многих конфигураций достаточно ресурсоемкий процесс и время исполнения напрямую зависит от производительности вашего компьютера и может достигать десятков минут. Этот вариант бектеста позволяет автоматически перебрать множество конфигураций стратегии на разных временных интервалах и убедится в том, что некоторые конфигурации оказываются выгодными за последний месяц, но убыточными за полгода.
  • Для изменения временного интервала проверки измените переменные initdate и stopdate
  • Для изменения способа анализа свечей измените поле Analyse в структуре configToTest

Дисклеймер

Разработчики не несут ответственность за любые финансовые потери, возникшие в процессе использования ботов из данного репозитория. Примеры торговых роботов не являются абсолютно верными решениями, их основная цель - продемонстрировать возможности investAPI и go-sdk в частности. Вы свободно можете использовать код из примеров для развития своих проектов.

About

Go/Postgres/Docker/Grafana

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 99.4%
  • Other 0.6%