Найти в Дзене
Старый биржевик

Мой робот «забыл», что купил акции: неожиданный баг в Scatter&Gather v10.4

Знаете, в работе над торговым роботом есть два типа дней. Первые — когда ты гений, всё летает, и кажется, что вот он, ключ к рынку. Вторые — когда твое творение, в которое ты вложил столько сил, вдруг делает настолько глупую ошибку, что хоть плачь. Сегодня я расскажу про один такой день. Речь пойдет о версии 10.4 моего робота Scatter&Gather, в которой поселился баг настолько досадный, что хотелось биться головой о клавиатуру. Но, как известно, смех — лучшее лекарство, так что давайте разберем эту историю с улыбкой. Всё началось с того, что мне надоели проблемы лимитных заявок — то они исполнялись частично, то не исполнялись вообще из-за «проскальзывания» цены. Данные портфеля по версии робота и биржи постоянно расходились. «Что если сделать умнее? — подумал я. — Пусть робот сначала «прицеливается» виртуально, а бьет наверняка рыночным ордером». В моей голове это выглядело как переход от стрельбы с закрытыми глазами к работе снайпера. Я назвал это системой «предзаявок» и реализовал в v
Оглавление

Знаете, в работе над торговым роботом есть два типа дней. Первые — когда ты гений, всё летает, и кажется, что вот он, ключ к рынку. Вторые — когда твое творение, в которое ты вложил столько сил, вдруг делает настолько глупую ошибку, что хоть плачь. Сегодня я расскажу про один такой день. Речь пойдет о версии 10.4 моего робота Scatter&Gather, в которой поселился баг настолько досадный, что хотелось биться головой о клавиатуру. Но, как известно, смех — лучшее лекарство, так что давайте разберем эту историю с улыбкой.

Отличная идея, которая привела к ошибке

Всё началось с того, что мне надоели проблемы лимитных заявок — то они исполнялись частично, то не исполнялись вообще из-за «проскальзывания» цены. Данные портфеля по версии робота и биржи постоянно расходились. «Что если сделать умнее? — подумал я. — Пусть робот сначала «прицеливается» виртуально, а бьет наверняка рыночным ордером». В моей голове это выглядело как переход от стрельбы с закрытыми глазами к работе снайпера. Я назвал это системой «предзаявок» и реализовал в v10.4.

И знаете, первое время я собой гордился. Архитектура стала изящнее, гибче. Но я, как тот самый горе-изобретатель, увлекся красотой идеи и забыл про бытовые мелочи. А именно — что роботу иногда нужно останавливаться, чтобы «поучиться» (пересчитать шаг сделки). Раньше-то всё было просто: остановился — снял все выставленные лимитные заявки — отучился — выставил новые лимитные заявки с обновленным шагом. Делов-то.

Но теперь появились «виртуальные прицелы» (предзаявки) и «реальные пули» (рыночные заявки), уже летящие в цель. И мой код остановки, унаследованный со старых времен, поступал радикально: «Всех в утиль!». Он чистил и предзаявки, и память о выставленных заявках. И вот здесь таилась ловушка. Причем ловушка коварная, в которую я умудрился ни разу не угодить за месяцы тестирования.

«Извините, а мы разве что-то покупали?» — сказал робот

Комичная ситуация (теперь-то смешно) случилась на дивгэпе акций «Озон Фармацевтика». Робот, как и задумано, увидел точку входа, выставил виртуальную предзаявку, та сработала — и бац! — рыночный ордер полетел в биржу. И все это в первые секунды торгов. Но в этот самый момент срабатывает триггер автообучения.

Представьте картину: ордер уже парит между моим сервером и шлюзом QUIK, а робот получает команду: «Стоп! Учиться!». И мой доблестный алгоритм остановки торговли, не долго думая, объявляет: «Всё, торговли нет. Стираем всё из памяти и начинаем с чистого листа». Он просто взял и выкинул из «головы» факт только что отправленного ордера, как неактуальную информацию.

А биржа-то ни о чем не знает! Она получает заявку и честно ее исполняет. Робот должен был отследить исполнение заявки и записать сделку, выяснив ее рыночную цену. Но ему не хватило совсем немного времени, чего раньше не случалось.

Закончив «урок», мой робот просыпается с кристально чистой памятью. Он напрочь забыл об отправленном ордере и уверен, что никаких сделок до сих пор не было. Соответственно, продолжает торговать, основываясь на неверной картине. Получился цифровой вариант склероза.

Scatter&Gather v10.5_medium: лечим склероз

Осознав всю глубину комизма ситуации, я сел фиксить баг. Нужно было четко разделить: что можно забывать при остановке, а что — ни в коем случае.

В версии 10.5_medium я построил новую логику, когда предзаявки снимаются, но отправленные заявки отслеживаются до их исполнения независимо от состояния робота. Список отслеживания теперь очищается не по команде «Стоп», а только когда заявка получает статус «Исполнена».

Если вам интересно попробовать уже исправленного и более осознанного робота, скачать версию Scatter&Gather v10.5_medium можно, как обычно, на сайте ikinvestor.ru.