Блог им. SergeyBagdasarov_d69

Бот и биржа почти сошлись в прибыли. Почему я всё равно проверил каждую сделку

Итог почти сошёлся. А сделки?

В отчёте бота одна сумма, в выписке биржи почти такая же. Разница меньше двадцати центов за два месяца. Можно выдохнуть?

Я разрабатываю софт для автоматической торговли и решил проверить не только общий итог. Оказалось, у 94 из 495 закрытых сделок разница больше цента. Просто в одних строках бот показывал больше биржи, в других меньше. В итоговой сумме это почти исчезло.

Но началась эта история с другого числа: 65,64 USDT. Именно столько комиссий сначала будто бы не хватало в базе бота.

Куда делись 65 долларов

Бот работает на Freqtrade. В базе у сделки есть два поля с убедительными названиями: fee_open_cost и fee_close_cost. Стоимость комиссии на входе и на выходе. Сложить их и сравнить с выпиской биржи кажется естественной проверкой.

На первоначальной выборке из 493 закрытых сделок сумма этих полей оказалась на 65,64 USDT меньше фактически списанных торговых комиссий. Возникает неприятный вопрос: неужели бот недоучитывает расходы и показывает лишнюю прибыль?

Но между «два поля не сошлись с выпиской» и «прибыль завышена» есть шаг, который нельзя пропускать: посмотреть, как эта прибыль вообще считается.

Я проверил код версии, работавшей у нас на момент сверки, Freqtrade 2026.5.1. Эти поля не оказались накопительным журналом всех списаний. В частности, входное поле пересчитывается из ставки и расчётной маржи, то есть обеспечения позиции, а не хранит сумму комиссий всех исполнений. Прибыль же движок пересчитывает по исполненным заявкам, учитывая дополнительные входы и частичные закрытия.

Вот одна из разобранных сделок:

Два поля не заменяют журнал комиссий

В этой сделке комиссия не потерялась в расчёте: мы пытались проверить её не тем способом. Более того, прибыль бота по этой же сделке была на 0,52 USDT ниже биржевой. Версия «разница полей комиссии целиком прибавилась к прибыли» здесь не работала.

Это ещё не ответ на все вопросы. Но уже причина перестать вычитать 65 долларов из результата и начать сравнивать одно и то же.

Сверять нужно не похожие числа, а одинаковые сделки

Для следующей проверки я взял один реальный счёт на Bybit: фьючерсы с расчётами в USDT, с 29 августа до утра 26 октября 2026 года, время UTC. Это не демо и не бэктест.

У биржи выгрузил Closed PnL, отчёт о результате закрытых позиций. Закрывающие заявки связал с базой бота по orderId, идентификатору заявки. В биржевой выгрузке была 501 запись о закрытии, а сделок бота 495: некоторые закрывались несколькими заявками. Связались все, без потерянных строк.

Получился почти успокаивающий итог:

Источник Прибыль по этим закрытым сделкам, USDT
База бота 39,898
Closed PnL биржи 39,723
Бот минус биржа +0,175

Суммы здесь округлены до тысячных. Это прибыль выбранных закрытых сделок, не доходность счёта и не изменение всего его капитала: открытые позиции и движение денег в эту проверку не входят.

Почти одинаковый итог ещё не означает точность по каждой строке

Дальше я сравнил каждую сделку отдельно.

401 из 495 уложилась в допуск ±0,01 USDT. У 94 разница была больше. Самое большое отклонение вверх составило около 0,53 USDT, вниз около 0,52 USDT.

А сумма абсолютных разниц по всем 495 сделкам оказалась 8,92 USDT. Абсолютных означает без взаимного погашения: и положительную, и отрицательную разницу считаем по величине.

Здесь нет сложной математики. Если в одной строке отклонение +1 USDT, а в другой −1 USDT, общий итог равен нулю. Но обе строки всё равно расходятся.

8,92 USDT не означают, что столько денег пропало или столько комиссий недоплатили. Это мера построчного несовпадения двух расчётов. А 0,175 USDT остаётся реальной разницей их общих итогов. Эти числа отвечают на разные вопросы, и нужны оба.

Плюсы и минусы почти погасились

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

Исполненных заявок в сделке Сделок В допуске ±0,01 USDT Средняя абсолютная разница, USDT
2 335 334 0,00004
3 131 60 0,038
4 20 6 0,098
5 8 1 0,238
6 1 0 0,077

В группе «один вход, один выход» сошлись 334 сделки из 335. При нескольких заявках расхождения встречались гораздо чаще. Это подсказка, куда смотреть дальше, а не общий закон: последние группы малы, а средняя разница не растёт в каждой строке таблицы.

Здесь считаются заявки, не отдельные исполнения. Одна заявка может исполниться частями. Несколько заявок в сделке тоже не обязательно означают только дополнительные входы: бывают частичные закрытия.

Одну причину нашли. Остальные пока не объявляем найденными

В проверенной версии движка общая входная или выходная ставка комиссии не всегда воспроизводит сумму фактических комиссий всех заявок. Особенно важно различать их, когда исполнения оплачиваются по разным тарифам. На исследованном счёте мейкерская ставка была 0,036 %: это исполнение заявки, которая уже стояла в стакане. Тейкерская составляла 0,1 %: такое исполнение забирает чужую заявку. Это ставки этого счёта, не универсальный тариф Bybit.

В другой разобранной сделке с двумя входами и двумя выходами расчёт по сохранённым общим ставкам дал около 0,792 USDT комиссии. Биржа списала 1,073 USDT. Разница около 0,281 USDT практически совпала с разницей прибыли этой сделки.

В этом конкретном примере различие комиссий объясняет различие результата почти до округления. Это не значит, что тем же объяснены остальные 93 случая или что движок просто забывает комиссии дополнительных входов.

Есть ещё funding, периодические платежи между сторонами бессрочного фьючерса: их можно как платить, так и получать. Bybit включает их в Closed PnL вместе с торговыми комиссиями, а при частичном закрытии распределяет соответствующую часть расходов. Это описано в справке биржи.

Но наличие funding в формуле ещё не объясняет конкретное расхождение. Для этого нужна отдельная сверка начислений и их распределения по закрытиям. Её в этом разборе не делали. Поэтому фразу «всё остальное объясняется funding» я здесь не пишу.

Тринадцать сделок с другим вопросом

Для 482 из 495 сделок сохранённая прибыль воспроизводилась по записанным ценам, ставкам и funding с допуском 0,00001 USDT. Это проверка внутреннего расчёта бота, не совпадение всех этих сделок с биржей.

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

Значит, здесь другой вопрос: почему историческая запись выглядит именно так? Версию старого кода, порядок обновления полей или другую причину этой проверкой не установили. Подставлять удобное объяснение вместо ответа не буду.

Пять вещей, которые стоит проверить у себя

  1. Сначала свяжите одинаковые сделки. Проверьте окно, суммы закрытия и частичные выходы. Совпадения двух итоговых сумм для этого недостаточно.
  2. Считайте и общий итог, и разницы по каждой сделке. Укажите допуск, сумму абсолютных разниц и самое большое отклонение. Ни один показатель не заменяет остальные.
  3. Отдельно посмотрите сделки с несколькими заявками. В нашей выборке они оказались полезной отправной точкой, но у другого бота картина может быть иной.
  4. Проверьте смысл полей именно своей версии движка. Название fee_open_cost само по себе не обещает полного журнала биржевых списаний.
  5. Сравнивайте одинаковый состав прибыли. Торговые комиссии, funding и частичные закрытия должны учитываться согласованно. Непонятный остаток не стоит сразу называть ошибкой какого-то одного компонента.

В этой истории было бы легко ошибиться дважды. Сначала объявить прибыль завышенной на 65 долларов, прочитав не те поля. Потом объявить расчёт проверенным, увидев почти одинаковые итоги.

Построчная сверка не дала такого удобного финала. Часть различий объяснена, часть ещё требует работы. Зато теперь понятно, какие вопросы остались открыты. Для меня это полезнее, чем красивое «всё сошлось».

Если вы сверяли своего бота с биржей, где чаще расходилось: на комиссиях, частичных закрытиях или учёте funding?

Подробности и границы проверки

Проверены только закрытые сделки одного счёта с 29.08.2026 00:00 до 26.10.2026 05:37:35 UTC. Другие счета, открытая прибыль, вводы и выводы, точность всего кабинета и будущие результаты этим не подтверждаются. Описание кода относится к прочитанной версии Freqtrade 2026.5.1, а не к доказанной истории всех её обновлений с августа.

Для воспроизведения цифр: разница общих итогов до округления +0,17469608 USDT; сумма абсолютных разниц 8,91628758 USDT. Если восстановить из биржевого Closed PnL компонент funding по формуле «Closed PnL − ценовая прибыль + торговые комиссии» (комиссии уже уменьшили результат, поэтому их возвращают), получится +16,01362925 USDT. Funding, записанный у тех же сделок в базе бота, +14,49423411 USDT. Первый показатель не является независимо выгруженной лентой funding, поэтому это не готовое доказательство причины расхождения.

Поля биржевого ответа и связь записей по заявкам описаны в документации Closed PnL API. Биржевые данные при исходной проверке запрашивались только на чтение.

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
426

Читайте на SMART-LAB:
Фото
💥 «Счёт слит» — серия 4 «Опционов на миллион»
После первых серьёзных потерь ситуация становится критической: из 500 000 ₽ у Андрея Чеберяченко остаётся всего 75 000 ₽. Трейдер признаёт ошибки...
🛡️ Ближний Восток: рынок кибербезопасности и новые возможности для SOFL
Друзья, продолжаем рассказывать о ключевых тенденциях ИТ-рынка и их значении для SOFL. Сегодня обсудим, как кибербезопасность становится...
Фото
Ежегодный Форум лидеров страхового рынка - собрали основное для инвесторов
Сегодня в Москве проходит ежегодный Форум лидеров страхового рынка, основные тренды:   По данным Банка России, прибыль страховщиков за девять...

теги блога Сергей Багдасаров

....все тэги



UPDONW
Новый дизайн