Есть бумаги с высокой волатильностью, цены которых часто ходят в рамках коридора. Цель сеточного бота - найти подходящие бумаги и значения границ этого коридора, чтобы автоматически покупать по нижней границе и продавать по верхней границе.
Алгоритм работы бота:
-
Отбор инструментов
Например, берутся все рублевые акции с Московской биржи, если цена одного лота больше чем
MaxPositionPrice
, инструмент отбрасывается. Далее для оставшихся инструментов запускается анализAnalyse
их исторических свечей заDaysToCalculateInterval
дней. Результат анализа - это значение интервала цены и максимальная волатильность - максимум функции волатильности гдеCrosses
- кол-во пересечений исторических свечей и интервала(width/price * 100)
- ширина этого интервала относительно средней цены в процентахVolatility = Crosses * (width/price * 100)
-
Торговля
Робот сортирует инструменты по убыванию максимальной волатильности и берет первые
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
Если после покупки цена инструмента падает ниже цена покупки * (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 разными токенами и счетами, а с разными клиентами можно создавать разных ботов и запускать их одновременно.
У робота реализована возможность проверки стратегии на исторических данных. Логика бектеста максимально приближена к логике работы настоящего исполнителя, в ней учтены стоп-лоссы, стоп-лимиты на покупку, а так же комиссия брокера за сделку.
Убедитесь, что вы выполнили все шаги необходимые для запуска робота и скачали историю, затем выполните:
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 в частности. Вы свободно можете использовать код из примеров для развития своих проектов.