Logo hamster-bot
RU EN PT

Загрузка…


hw98_console_prompt.avif Тестирование торговых стратегий на исторических данных

Достоверный портфельный бэктест. Уровень quant-исследований quant

Первый запуск тестера video первый запуск тестера Обзор обновлений и оптимизатор параметров video обзор обновлений и оптимизатор параметров Перебор и анализ. Построение тепловых карт и 3d Surface video Перебор и анализ. построение тепловых карт и 3d surface Тестер торговых стратегий. Инструкция по проведению тестов. Перебор торговых пар. video инструкция по проведению тестов. перебор торговых пар Тестер торговых стратегий. Инструкция по новому веб-интерфейсу тестера. video инструкция по новому веб-интерфейсу тестера Тестер торговых стратегий. Перебор параметров в бэктесте. video перебор параметров в бэктесте Тестер торговых стратегий. Инструкция. Три сценария тестирования. video инструкция. три сценария тестирования

hamster-bot/tester - продвинутый инструмент для тестирования торговых систем на исторических данных.

Особенности бэктестера:

Реализовано как отдельный коннектор к "бирже" (Mock-объект заменяющий биржу). Таким образом можно протестировать весь ранее написанный код бота. Бот думает, что работает на реальной бирже (ставит ордера, получает баланс и инфу о позициях). А эта виртуальная биржа всё считает и генерирует отчет.

Инструкция по использованию (пошагово)

Ниже — порядок действий от первого запуска до подбора параметров. Подробности по каждому параметру смотрите в разделах ниже.

Что понадобится.
— установленный hamster-bot последней версии (тестер встроен в бота, отдельно ставить ничего не нужно);
— интернет для скачивания исторических данных и параметров инструментов с биржи;
— файлы настроек стратегий в папке tester/settings_strategy. API ключи и аккаунты из settings_accounts тестеру не нужны.
Тестер не отправляет ордера на реальную биржу: вместо неё бот работает с виртуальной биржей. С биржи берутся только публичные данные — история торгов и параметры инструмента (шаг цены, минимальный лот и т.п.), они кэшируются в tester/data/{exchange}/_markets.

Шаг 1. Подготовьте стратегии.
У тестера своя папка настроек — tester/settings_strategy, отдельная от рабочей settings_strategy. Рабочие настройки бота тест не трогает, а эксперименты в тестере не влияют на торговлю. Добавлять, копировать, редактировать и удалять настройки тестера удобно в веб-интерфейсе (вкладка "Тестер" → "Параметры", см. шаг 3), можно и просто положить .json файлы в папку.
Настройки можно разложить по вложенным папкам, например tester/settings_strategy/trend и tester/settings_strategy/grid, и переключаться между наборами в веб-интерфейсе (строка Папка настроек над таблицей). Таблица, добавление настроек и запуски работают с выбранной папкой, без её вложенных папок. Из консоли тестер читает только корень tester/settings_strategy.
Каждый файл в tester/settings_strategy — это одна стратегия на одной паре. Проверьте в нём:
— exchange.name — биржа, с которой будут скачаны данные (bybit, binance, mexc, bitmex и др., см. раздел "Рыночные данные");
— поле exchange.account тестер не учитывает: все стратегии работают на одном аккаунте тестера из config_tester.json (раздел accounts, см. "Параметры тестера");
— basic.symbol и basic.time_frame — пара и таймфрейм;
— размер лота и настройки стратегии — как для реальной торговли;
— при необходимости — свой период торговли для этой стратегии внутри общего теста (раздел tester в файле настройки):
"tester": { "StartDate": "2026-02-01T00:00:00", "EndDate": "2026-02-20T00:00:00" }
До StartDate стратегия не торгует, после EndDate тестер один раз снимает её ордера и закрывает позицию по рынку, дальше пара не торгует. Любое из полей можно не указывать — тогда ограничения с этой стороны нет. Удобно, когда пара появилась на бирже позже начала теста, была делистнута или когда нужно проверить портфель, где стратегии подключались в разное время.
При запуске из консоли в тест попадают все файлы из tester/settings_strategy сразу — это портфельный тест на одном общем балансе. В веб-интерфейсе стратегии для теста, перебора параметров и стресс-теста отмечаются в мастере тестера (шаг 3).

Шаг 2. Настройте config_tester.json.
Файл лежит в папке бота. Если его нет, он создаётся со значениями по умолчанию при запуске бота (как и settings_program.json). Редактировать можно в текстовом редакторе или в веб-интерфейсе бота (вкладка "Тестер" → "Параметры" → "Редактировать config_tester.json" — там же есть подсказки к каждому параметру).
Для первого теста достаточно задать:

"name_comment": "first_test",
"InitialBalance": 1000.0,
"StartDate": "2026-01-01T00:00:00",
"EndDate": "2026-03-01T00:00:00",
"WarmupDays": 30,
"MakerFee": 0.00036,
"TakerFee": 0.001,
"UpdateData": true,
"parameter_mining": []

name_comment — имя папки, куда сложатся отчёты: tester/report/first_test. WarmupDays берите не меньше, чем нужно самому длинному индикатору стратегии (например для MA 200 на 1h таймфрейме нужно минимум 9 дней). Комиссии укажите свои, с учётом уровня аккаунта. Остальные параметры можно оставить по умолчанию — их описание в разделе "Параметры тестера".

Шаг 3. Запустите тест. Есть два способа.

А) Через веб-интерфейс бота — вкладка Тестер. Бот при этом продолжает работать в обычном режиме.
Вкладка Параметры — статус тестера и настройки тестера из выбранной папки tester/settings_strategy:
— Статус тестера — что сейчас выполняется и прогресс: одиночный тест, перебор параметров, стресс-тест или запуск снимка, время старта и завершения. Обновляется сам;
— Папка настроек — путь к выбранной папке и её вложенные папки с числом файлов настроек; клик по папке открывает её, .. — на уровень выше;
— Добавить настройку — новая настройка: биржа, пара, стратегия и таймфрейм (API ключи не нужны, список пар берётся с биржи публичным запросом). В списке только биржи, для которых тестер умеет скачивать историю: Bybit, Binance (фьючерсы и спот), MEXC (спот и фьючерсы) и BitMEX. Пару можно вписать вручную, несколько — через запятую; вписанная пара важнее выбранной в списке. Это выручает, когда список пар не загрузился (например, биржа недоступна с вашего IP);
— в строке настройки: Тест — тест только этой стратегии, Редактировать, Копировать (копия с новым именем, биржей и парой — удобно размножить настройку на другие пары), JSON — скопировать настройку в буфер обмена, Удалить;
— Редактировать config_tester.json — редактор параметров тестера (сохраняет в файл);
— Загрузить данные — заранее скачать исторические данные для всех настроек тестера за период из config_tester.json. Статус загрузки показывается отдельно, ход — в консоли бота;
— Запустить тестер — окно "Мастер тестера" со стратегиями выбранной папки: отметьте нужные галочками (или Выбрать все).
После Тест или Запустить тестер откроется "Мастер тестера" с редактором параметров тестера. Поправьте период, баланс и т.д. и выберите, что запустить:
— Запустить — один прогон отмеченных стратегий на общем балансе с точными параметрами, без перебора parameter_mining;
— Перебор параметров — полный режим для отмеченных стратегий с конфигом из редактора: перебор parameter_mining, single_mode, параллельные процессы (max_parallel_runs). Прогресс показывает число пройденных комбинаций и % текущего прогона;
— Стресс-тест — те же настройки в худших условиях (см. раздел "Проверка устойчивости").
Если конфиг в редакторе отличается от config_tester.json, мастер спросит перед запуском: Сохранить и запустить, Запустить без сохранения (изменения действуют только на этот запуск) или Отмена. Перебор параметров и стресс-тест одновременно может идти только один.
После старта окно закрывается, прогресс показывается в блоке Статус тестера. Когда одиночный тест закончится, в строке стратегии появится кнопка Результат — она сразу открывает HTML отчёт прогона.

Вкладка Результаты (файлы) — файловый менеджер папок tester/runs, tester/report и tester/data: сортировка, открыть отчёт в браузере, скачать или удалить файл/папку (пока идёт тест или загрузка данных, удаление недоступно). Снимок прогона (run_snapshot_*.json) можно открыть в JSON редакторе, поправить и запустить кнопкой Запустить — тест повторится с настройками из снимка. Если в снимке много стратегий, их настройки не загружаются в редактор сразу, чтобы окно открывалось быстро: кнопка Загрузить настройки стратегий откроет их для правки, без неё снимок запускается с настройками из файла как есть. Кнопка + Параметр перебора работает и в редакторе снимка.

Б) Из консоли — удобно для больших переборов. Запускайте из папки бота:

# Windows
manage_tester.bat                      меню: тест, оптимизатор, скачать или сконвертировать данные
manage_tester.bat tester               или   hb_c.exe --run-tester
manage_tester.bat download             или   hb_c.exe --download-data
manage_tester.bat optimizer <папка>    или   hb_c.exe --run-report-optimizer tester\report\first_test

# macOS
./run_tester_mac.sh                    или   ./hb_c --run-tester

# Linux
./hb_c --run-tester
./hb_c --download-data
./hb_c --run-report-optimizer tester/report/first_test

--run-tester — тест, --download-data — только скачать данные, --run-report-optimizer — перестроить сводный отчёт оптимизатора. На Windows все эти режимы собраны в одном файле manage_tester.bat (он заменил прежние run_tester.bat, run_download_data.bat, run_report_optimizer.bat и run_convert_data.bat): без аргументов он показывает меню, а папку отчёта можно просто перетащить на файл, чтобы построить по ней отчёт оптимизатора. Если скрипта нет в папке бота, используйте команду из правой колонки.
В этом режиме бот не торгует: он читает настройки, проводит тесты и завершает работу. Если на этом же компьютере уже запущен торгующий бот, запускайте тестер из отдельной копии папки.

Шаг 4. Следите за консолью (лог). Что в ней важно:
— [LoadBars] ..., Загружено N баров для SYMBOL — скачивание и загрузка данных. Первый запуск на новом периоде может занять время, дальше данные берутся с диска;
— [RUN 1/1] start. params: ... — начало прогона (при переборе — с номером прогона и значениями параметров);
— Пропуск бота ... — стратегия исключена из теста (нет данных, ошибка в настройках), причина указана в строке;
— [MINER] Обнаружены невалидные parameter_mining.name — опечатка в пути перебираемого параметра;
— в конце — BACKTEST REPORT с итогами и строка Interactive chart generated: ... с путём к HTML отчёту.

Шаг 5. Изучите результаты. Всё лежит в папке tester/report/{name_comment}:
— HTML отчёт прогона — откройте в браузере (описание в разделе "Отчёт"). Начните со шапки: PnL, Max Drawdown, количество сделок, Profit Factor. Затем кривая эквити, сделки на графиках пар и вкладка Analytics — насколько результат зависит от нескольких удачных сделок или одной пары;
— reports_history.csv — строка с итогами каждого прогона (открывается в Excel / Google Sheets);
— run_snapshot_{name_comment}_{дата_время}.json — полный снимок настроек теста. Каждый запуск сохраняет свой снимок, прежние не перезаписываются. Его можно запустить прямо из вкладки "Результаты (файлы)" (кнопка Запустить) или положить в tester/runs и повторить тест из консоли (параметр use_runs).
Подробный лог прогона (при use_logger = true) — в папке logs, файлы TESTER_*.log.

Шаг 6. Подбор параметров (оптимизатор).
1) Добавьте в parameter_mining параметры для перебора (примеры в разделе "Оптимизатор"). Посчитайте число прогонов — это произведение количества значений всех параметров;
2) заранее скачайте данные: manage_tester.bat download или кнопка Загрузить данные;
3) для скорости: max_parallel_runs — по числу ядер процессора, report.enable_html_report = false, use_logger = false; при миллионах комбинаций — monte_carlo;
4) запустите manage_tester.bat tester (или кнопка Перебор параметров в мастере тестера) и проверьте консоль на предупреждения [MINER];
5) после перебора откройте report_optimizer_*.html и отсортируйте reports_history.csv. Выбирайте не одиночный лучший прогон, а устойчивую область, где хороши и соседние значения;
6) сузьте диапазоны вокруг лучшей области и повторите. Итоговые настройки проверьте одиночным тестом с HTML отчётом на другом периоде, который не участвовал в подборе.

Частые проблемы.

Рыночные данные для тестирования

Криптовалютные биржи публично делятся историческими рыночными данными. Тестер сам скачивает нужный диапазон данных о торгах, собирает из них минутные свечи и уже из минуток формирует бары нужного таймфрейма для бота. Никаких ручных действий и регистраций не требуется.
Дополнительно скачивается WarmupDays дней до начала теста, чтобы все индикаторы ТА стратегии успели рассчитаться к StartDate.

Поддерживаемые биржи. Биржа берётся из файла настроек стратегии: settings.exchange.name.

Если указана биржа, для которой нет загрузчика, тестер использует данные BYBIT.

Хранение. Данные сохраняются в папку tester/data/{exchange}/{symbol} — по одному файлу минутных свечей на день в формате Parquet (2026-02-03_1m.parquet). Файлы сжаты и занимают меньше места, чем CSV. Скачанные архивы сделок после конвертации удаляются, чтобы не занимать место. Уже скачанные дни повторно не загружаются: при следующих тестах тестер докачивает только недостающие дни (если UpdateData = true). При UpdateData = false тест идёт только на тех данных, что уже лежат в папке.
При запуске теста читаются только дневные файлы за период теста (с учётом прогрева), поэтому накопленная история за годы не замедляет короткие тесты. Файлы без даты в имени не читаются.
При параллельном переборе процессы не мешают друг другу: одну и ту же пару одновременно качает только один процесс, остальные ждут и берут уже готовые файлы.

Данные в старом формате CSV. Данные, скачанные прежними версиями бота (*_1m.csv), перекачивать не нужно: при первом тесте пары тестер сам конвертирует её CSV файлы в Parquet и удаляет CSV. Сконвертировать сразу всю папку tester/data можно командой manage_tester.bat convert (на macOS — run_convert_data_mac.sh) в папке бота: она запускает бота с флагом --convert-data. Запускать его можно и во время работы тестера.

Свои данные. В папку tester/data/{exchange}/{symbol} можно подкинуть свои данные в CSV формате. При первом тесте этой пары (или через manage_tester.bat convert) тестер сконвертирует их в Parquet, а исходный CSV удалит — сохраните копию, если она нужна. Требования:
— один файл на день, имя заканчивается датой и _1m.csv, например 2026-02-03_1m.csv (файлы без даты в имени тестер не читает);
— минутные свечи (тестер идёт по истории с шагом 1 минута / опционально можно сделать на каждый тик но будет медленно работать);
— первая строка — заголовок, дальше колонки timestamp,open,high,low,close,volume (остальные колонки игнорируются; если колонок 9 и больше, 7–9-я читаются как buy_volume,sell_volume,trades);
— timestamp в UTC: unix время в секундах, миллисекундах, микросекундах или наносекундах (формат определяется автоматически), либо дата строкой 2026-02-03 00:01:00;
— разделитель колонок — запятая, дробная часть — точка.
Пример:

timestamp,open,high,low,close,volume
1770076800000,97512.5,97540.0,97480.1,97530.2,12.345
1770076860000,97530.2,97561.7,97522.0,97555.0,8.910

Предварительное скачивание. Команда manage_tester.bat download (пункт 3 в меню) запускает бота с флагом --download-data. В этом режиме тестер ничего не тестирует, а только скачивает все нужные данные за период теста (+ прогрев) по всем парам из tester/settings_strategy, включая пары из перебора parameter_mining. Удобно запустить заранее перед большим перебором.

Поведение тестера

С точки зрения бота, тестер - это просто еще одна биржа. Бот подключается к ней и начинает получать бары, выставлять ордера и т.д. Тестер в это время просто эмулирует поведение реальной биржи.

Время и свечи. Тестер идёт по истории с шагом в 1 минуту, синхронно по всем торговым парам. Из минуток он сам собирает свечи рабочего таймфрейма стратегии (1m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 1w) с выравниванием по UTC, как на бирже: 1h свечи начинаются в XX:00, 4h — в 00:00/04:00/08:00…, 1d — в 00:00 UTC, 1w — в понедельник 00:00 UTC.
Стратегия вызывается каждую минуту, а не только на закрытии свечи — для 1h таймфрейма это ~60 вызовов на свечу. Бот получает закрытые бары и текущую формирующуюся свечу, OHLC которой обновляется каждую минуту. Поэтому логика, завязанная на цену внутри свечи (трейлинг стопы, перестановка ордеров, выход по текущей цене и т.д.), работает так же как в реальной торговле.
Бары периода прогрева (WarmupDays) используются только для расчёта индикаторов — торговля начинается с StartDate. Если в данных пропущена минута (не было сделок), тестер подставляет "пустую" свечу по последней цене.

Исполнение ордеров. На каждой минутной свече тестер проверяет все ожидающие ордера по её High/Low. Внутри минутки моделируется путь цены: у растущей свечи Open → Low → High → Close, у падающей Open → High → Low → Close. Ордера исполняются в том порядке, в котором цена до них доходит по этому пути, а не в порядке их выставления. Например если в одной минутке задеты и стоп, и тейк-профит, исполнится тот, до которого цена дошла первой, а второй (reduceOnly) будет снят, т.к. позиции уже нет.

Ордера можно изменять (цену, объём, триггер) и отменять — как на бирже.
Поддерживается reduceOnly: такой ордер может только уменьшить позицию и никогда её не перевернёт. Учитываются настройки стратегии use_long/use_short: если направление запрещено, ордер в эту сторону может только закрыть встречную позицию, а "лишний" объём отсекается.

Позиции. Режим One-Way (одна позиция на пару): покупка при шорте сначала закрывает/уменьшает шорт, а излишек открывает лонг (переворот). При добавлении в позицию цена входа усредняется. PnL фиксируется при каждом закрытии или уменьшении позиции.
Спот. Тип рынка тестер берёт из параметров инструмента биржи. На споте шортов нет: продажа может только уменьшить или закрыть лонг, "лишний" объём отсекается. Фандинг на споте не начисляется.

Баланс общий для всех стратегий. Поведение как на фьючерсах BYBIT/BINANCE с кросс маржой. Бот может запросить Wallet или Margin баланс:
— Wallet — реализованный баланс: начальный баланс + зафиксированный PnL − комиссии ± фандинг;
— Margin (equity) — Wallet + нереализованный PnL всех открытых позиций. По нему строится кривая эквити и считается максимальная просадка.
Комиссия списывается с баланса сразу при каждом исполнении ордера.
Если Margin баланс опускается до нуля, тестер останавливает прогон — депозит "слит", дальше тестировать нет смысла. Ликвидация отдельных позиций не моделируется: тест продолжается и на глубокой просадке, чтобы было видно, как система ведёт себя после неё. Остановить тест раньше можно параметрами target_drawdown_open и target_drawdown.

Фандинг. Каждые FundingIntervalHours часов (по UTC, в начале часа) по всем открытым фьючерсным позициям начисляется фандинг: размер позиции × цена × FundingRate. При положительной ставке лонги платят, шорты получают. Итоги видны в отчёте (Funding paid / received / net). Чтобы отключить фандинг, укажите FundingRate = 0.

Логика бота. В тестере работает та же самая логика, что и в реальной торговле: сервис позиций, лимитер одновременно открытых позиций, опции аккаунта (например закрытие по профиту маржи) — всё это общий продакшн код бота.

Отчёт

По окончании тестирования в папку tester/report/{name_comment} сохраняется подробный интерактивный HTML отчет.
И добавляется запись в reports_history.csv со сводной информацией по тесту для удобного поиска лучших комбинаций параметров при оптимизации стратегий.

Отчёт оптимизатора. При переборе параметров (parameter_mining) кроме отчётов по каждому прогону тестер строит ещё один, сводный отчёт report_optimizer_*.html по всем прогонам сразу. В нём результаты перебора показаны тепловыми картами и 3D surface графиками: по осям X и Y — значения перебираемых параметров, по оси Z — метрики (доходность, просадка, Profit Factor и др.). Так сразу видны устойчивые "плато" хороших значений, а не одиночные случайные пики. Отчёт создаётся автоматически при параллельном переборе (max_parallel_runs > 1) или вручную через manage_tester.bat optimizer, подробнее — в разделе "Оптимизатор".

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

Шапка отчета — ключевые показатели:

Графики:

Report Statistics — подробная статистика:

Details — вкладки с детализацией:

Параметры тестера

файл: config_tester.json Можно редактировать файл в текстовом редакторе.
name_comment - комментарий к тесту. Чтобы было удобнее ориентироваться в отчетах. Отчёты сохраняются в отдельную папку tester/report/{name_comment}.
comment - свободный комментарий прогона, помогает отличать отчёты в одной папке. Виден в шапке отчёта и на странице сравнения прогонов. При запуске к нему автоматически дописывается папка, откуда взяты настройки стратегий: [settings: settings_strategy/…]; в config_tester.json эта отметка не сохраняется.
InitialBalance - начальный баланс для тестирования в USDT
StartDate - дата начала тестирования в формате 2026-02-03T00:00:00
EndDate - дата окончания тестирования в формате 2026-02-13T00:00:00
WarmupDays - количество дней для прогрева перед началом тестирования. Данные за эти дни скачиваются дополнительно до StartDate, чтобы индикаторы ТА успели рассчитаться к началу тестирования. Если данных до StartDate меньше, чем WarmupDays (например пара появилась на бирже позже), торговля по этой паре начнётся позже — когда наберётся полный прогрев. В консоли об этом будет строка с новой датой начала.
MakerFee - комиссия мейкера (0.0001 = 0.01%) Стандартная на BYBIT: 0.00036 = 0,0360%. (инструкция как значительно уменьшить комиссию)
TakerFee - комиссия тейкера (0.0001 = 0.01%) Стандартная на BYBIT: 0.001 = 0,1000%
SlippagePercent - проскальзывание для маркет ордеров (0.0001 = 0.01%)
LimitOrderVolumeCheck - проверка объёма для корректного исполнения лимитных ордеров (true/false). Лимитный ордер исполняется не больше, чем позволяет объём текущей свечи: тестер "откусывает" от ордера доступный объём, а остаток ждёт следующую свечу (частичное/поэтапное исполнение). Если выкл — лимитка исполняется целиком при касании цены.
order_trigger_fill_worst - реалистичное исполнение стоп ордеров на гэпах (true/false). По умолчанию стоп исполняется по триггерной цене (± проскальзывание). Если включить, стоп исполняется по худшей из цен: триггер или цена открытия минутной свечи. Например стоп на продажу 100, а минутка открылась на 97 — исполнение по 97, а не по 100. Делает тест консервативнее на резких движениях и на парах с низкой ликвидностью.
order_limit_fill_plus_tick - реалистичное исполнение лимитных ордеров с учётом очереди в стакане (true/false). По умолчанию лимитка исполняется при касании цены. На реальной бирже при касании уровня ордер часто не исполняется — перед ним в очереди стоят другие заявки. Если включить, лимитка исполняется только когда цена прошла за её уровень. Например лимитка на покупку 95 исполнится, только если Low минутки ниже 95 — касание ровно 95 не засчитывается. Особенно важно для сеточных и усредняющих стратегий.
order_market_delay - задержка исполнения маркет ордеров (true/false). По умолчанию маркет ордер исполняется мгновенно — по цене закрытия той же минутки, которую только что увидела стратегия. На реальной бирже между решением бота и исполнением проходит время, и цена успевает сдвинуться. Если включить, маркет ордер исполняется по цене открытия следующей минутки (+ проскальзывание). Позиция в этом случае появляется у бота только на следующем шаге, как на бирже. Закрытие позиций в конце теста всегда происходит сразу.
target_drawdown_open - целевая просадка по открытым позициям в % (0 = выключено). Считается как отставание Margin баланса от Wallet баланса, т.е. текущий нереализованный убыток открытых позиций: (Wallet − Margin) / Wallet × 100. Как только она достигает заданного уровня, тест завершается (например 50 — остановка, когда Margin упал на 50% ниже Wallet). Можно использовать как свой уровень "ликвидации" — отсекать прогоны, которые на реальном счёте вы бы не пережили.
target_drawdown - целевая максимальная просадка в % (0 = выключено). Считается так же, как Max Drawdown, % в отчёте: падение Margin баланса от его исторического максимума (high watermark), (Пик Margin − Margin) / Пик Margin × 100. Учитывает и уже зафиксированные убытки, а не только открытые позиции. Как только достигает заданного уровня, тест завершается.
Пример разницы: баланс 100, открыли лонг, Margin вырос до 150, затем упал до 90. target_drawdown_open видит 10% (Margin на 10 ниже Wallet 100), а target_drawdown — 40% (от пика 150).
При остановке по любому из параметров открытые позиции закрываются по текущей цене, отчёт строится по данным до момента остановки. Удобно при переборе параметров: заведомо неудачные прогоны обрываются раньше и не тратят время.
FundingRate - Размер ставки фандинга (0.0001 = 0.01%)
FundingIntervalHours - Интервал между выплатами фандинга в часах (8)
maintenance_margin_rate - ставка поддерживающей маржи, доля от номинала позиции (по умолчанию 0.005 = 0.5%). Используется для линии Liquidation Level на графике баланса, если биржа не отдала тиры риск-лимита (сейчас тиры скачиваются только с Bybit). На ход теста не влияет.
accounts - аккаунт тестера. Используется первый элемент списка: из него берутся close_by_margin и open_positions_limiter для всех стратегий теста. API ключи не нужны. Если раздела нет, создаётся аккаунт по умолчанию (опции выключены):
"accounts": [ { "name": "tester", "open_positions_limiter": 0, "close_by_margin": { "profit": 1.0, "loss": 1.0, "size": 1.0, "each": false } } ]
  open_positions_limiter - максимум одновременно открытых позиций по стратегиям HiDeep, RedFlag, SmartProfit и ShadowOverlap (0 — без ограничения)
  close_by_margin.profit - когда Margin ≥ Wallet × profit, позиции всех стратегий сокращаются на долю size (1.04 — Margin выше Wallet на 4%; 1 — выключено). each: вкл. — Margin считается как Wallet + нереализованный PnL позиций бота, выкл. — Margin баланс аккаунта целиком
UpdateData - обновление (докачка) рыночных данных перед тестированием (true/false)
use_logger - использование логгера. Если выкл то ускоряет тестирование (true/false)
max_parallel_runs - количество параллельных прогонов тестера при переборе параметров. Каждый прогон запускается отдельным процессом. Если производительность компьютера позволяет то получается паралелить процессы без потерь скорости расчета. При значении больше 1 после завершения всех прогонов автоматически строится сводный отчёт оптимизатора (тепловые карты / 3D surface).
max_memory_load_percent - порог загрузки оперативной памяти в % при параллельных прогонах (по умолчанию 97). Если память загружена до этого уровня (с учётом памяти, которую займёт новый прогон — она оценивается по среднему пику уже завершённых прогонов), новые прогоны ждут, пока она освободится. Прогоны, упавшие из-за нехватки памяти, повторяются автоматически. 0 — без контроля.
single_mode - режим раздельного тестирования (true/false). Если включен, то каждый файл настроек из папки tester/settings_strategy тестируется отдельно, а не все вместе на общем балансе. Удобно для оценки каждой стратегии/пары по отдельности за один запуск. Перебор parameter_mining применяется к каждой стратегии.
use_runs - запуск тестов из сохранённых снимков (true/false). Если включен, тестер игнорирует текущие настройки и последовательно выполняет все *.json файлы из папки tester/runs. Каждый файл — это полный снимок (стратегии, настройки программы и тестера вместе с аккаунтом тестера accounts). Режим работает только при запуске из консоли (--run-tester): кнопка Перебор параметров его игнорирует, а отдельный снимок в веб-интерфейсе запускается кнопкой Запустить на вкладке "Результаты (файлы)". Такие снимки run_snapshot_{name_comment}_{дата_время}.json тестер сам сохраняет в папку отчёта перед каждым запуском (и при параллельном, и при последовательном переборе) — их можно скопировать в tester/runs, чтобы повторить или поставить в очередь несколько разных тестов.
shuffle_miner, monte_carlo, monte_carlo_seed - дополнительные режимы оптимизатора, описаны в разделе "Оптимизатор".

файл: config_tester.json/report Настройка содержания отчета:
enable_html_report - создавать HTML отчёт (true/false). Если выкл — HTML не генерируется, в reports_history.csv добавляется только строка со сводными метриками. Сильно ускоряет массовый перебор параметров и экономит место на диске.
chart_ohlc_height - высота графика OHLC в пикселях
chart_balance_height - высота графика баланса в пикселях
chart_position_height - высота графика размера открытых позиций в пикселях
include_chart_ohlc - включение графика OHLC в отчет (true/false)
include_chart_balance - включение графика баланса в отчет (true/false)
include_chart_position - включение графика размера открытых позиций в отчет (true/false)
include_settings - включение настроек стратегий и параметров тестера в отчет (true/false)
include_trades_table - включение таблиц со списком сделок по каждой стратегии (true/false)
include_summary_table - включение сводной таблицы по всем стратегиям: объём торгов, комиссия и т.д. (true/false)
include_monthly_returns_heatmap - включение тепловой карты доходности по месяцам (true/false)
include_position_stats - включение статистики по открытым позициям: средний и максимальный размер открытых позиций в % от Margin баланса (true/false)
include_analytics - включение вкладки Analytics (true/false, по умолчанию true)
analytics_monte_carlo - число итераций Монте-Карло по сделкам на вкладке Analytics (0 = выкл, рекомендуется 1000). Не путать с monte_carlo оптимизатора — тот ограничивает число прогонов перебора. Время расчёта растёт пропорционально итерациям × числу сделок и тратится в каждом прогоне, в том числе при переборе: 1000 итераций на 100 сделок — доли секунды, 10000 итераций на тысячи сделок — заметно дольше
analytics_monte_carlo_seed - начальное значение генератора случайных чисел для Монте-Карло отчёта (по умолчанию 42). С одним и тем же seed результат повторяется
enable_timing_logs - вывод в консоль времени генерации каждого этапа отчета. Нужно для диагностики, если отчёты строятся долго (true/false)

файл: config_tester.json/reports_history Дополнительные столбцы reports_history.csv:
Основные столбцы пишутся всегда. Дополнительные выключены по умолчанию и включаются по одному (true/false). Включённые столбцы можно использовать в z_parameters оптимизатора, например чтобы искать параметры, устойчивые к выбросам.
pnl_without_top5 - столбец PnLWithoutTop5: Total PnL без 5 самых прибыльных сделок
pnl_without_best_pair - столбец PnLWithoutBestPair: Total PnL без самой прибыльной пары (пусто при одной паре)
ulcer_index - столбец UlcerIndex: Ulcer Index по часовым значениям Margin баланса, %
mc_max_dd_p95 - столбец MC_MaxDD_p95: 95-й перцентиль максимальной просадки по бутстрэпу, % (нужен report.analytics_monte_carlo > 0, иначе пусто)
mc_loss_probability - столбец MC_LossProbability: вероятность убытка по бутстрэпу, % (нужен report.analytics_monte_carlo > 0, иначе пусто)
Пример:
"reports_history": { "pnl_without_top5": true, "ulcer_index": true }

Проверка устойчивости и публикация отчёта

Walk-forward. В config_tester.json задайте walk_forward.oos_percent (например 30) — последняя часть периода не участвует в подборе. Перебор идёт на первой части, лучшие top_n комбинаций по метрике metric (по умолчанию TotalPnLPercent) сами прогоняются на отложенной части в папке {name_comment}_WF_OOS. Итог — отчёт walk_forward_*.html: результат на подборе и на проверке, доходность за 30 дней, WFE и вердикт. oos_percent = 0 выключает режим.

Плато параметров. В report_optimizer_*.html появился раздел устойчивости: для лучших комбинаций показано среднее по соседним значениям параметров и худший сосед. Если лучший результат — одиночный пик, а соседи заметно хуже, отчёт помечает его как хрупкий: такие настройки скорее всего подогнаны.

Стресс-тест. Кнопка Стресс-тест в мастере тестера (или --run-stress-test из консоли) прогоняет отмеченные стратегии с конфигом из редактора в нескольких сценариях: комиссии x2, проскальзывание x3, фандинг x3, задержка маркет ордеров, стопы по худшей цене, строгое исполнение лимиток и всё вместе. Отчёт stress_test_*.html лежит в папке {name_comment}_STRESS и показывает, сколько стратегия теряет в каждом сценарии.

Сравнение прогонов. На вкладке "Результаты (файлы)" отметьте два или больше HTML-отчётов и нажмите Сравнить отмеченные: кривые доходности на одном графике (каждую можно скрыть в легенде) и ключевые метрики рядом, с разницей относительно первого прогона и подсветкой лучшего значения. Отчёты можно отмечать в разных папках: отметки сохраняются при переходе по папкам, счётчик показывает, сколько отмечено, Снять отметки сбрасывает выбор. У каждого прогона на странице сравнения видны время создания отчёта и комментарий comment. Работает для отчётов, созданных этой версией бота и новее.

Режимы рынка. На вкладке Analytics результат разбит на рост, падение, флэт и высокую/низкую волатильность, с итоговой строкой, где стратегия зарабатывает и где теряет.

Уведомление в Telegram. Когда долгий запуск из веб-интерфейса заканчивается (перебор, снимок, стресс-тест), бот пишет в свой Telegram-чат: длительность, число прогонов, лучший результат и созданные сводные отчёты. Выключается параметром notify_telegram = false.

Публикация отчёта. На вкладке "Результаты (файлы)" у папки отчёта есть кнопка Опубликовать. В форме по желанию описание стратегии и контакт, нужно только подтвердить согласие; можно отметить, какие файлы папки отправить. Архив собирается и отправляется в фоне, окно сразу закрывается, а о результате придёт уведомление. Бот отправляет архив в Telegram-чат отчётов тестера hamster-bot: reports_history.csv, снимок настроек, сводные отчёты и HTML лучших прогонов. Ключи API, токены и лицензия вырезаются перед отправкой.

Оптимизатор (перебор параметров)

Оптимизатор автоматически прогоняет тест много раз, каждый раз с новой комбинацией значений выбранных параметров. Результат каждого прогона записывается отдельной строкой в сводную таблицу tester/report/{name_comment}/reports_history.csv: метрики теста плюс колонки со значениями перебираемых параметров. По ней удобно сортировкой найти лучшие комбинации.

файл: config_tester.json/parameter_mining Настройка оптимизатора (переборщика параметров):
По умолчанию это пустой список [] — обычный одиночный тест. Список наполняется объектами вида {"name": "имя_параметра", "start": 1, "end": 10, "step": 0.5, "values": []}. Каждый объект — это один перебираемый параметр.

Мастер перебора. Вручную писать путь не обязательно: в веб-интерфейсе над редактором config_tester.json есть кнопка + Параметр перебора. Мастер по шагам спрашивает, что перебирать (настройки стратегии или самого тестера), к каким стратегиям применять (* — ко всем), даёт найти параметр в дереве поиском (например take_profit) и задать диапазон start/end/step или список значений. Сразу видно, сколько получится значений и сколько всего комбинаций. Если такой параметр уже есть в parameter_mining, мастер предложит его заменить. После добавления не забудьте сохранить конфиг.

name - путь к параметру для перебора. Можно указать любую настройку бота. Путь начинается с одного из 4 видов конфигов:
1) settings — настройки стратегий (.json файлы в папке tester/settings_strategy). Тут мы настраиваем: торговую пару, таймфрейм, работу с депозитом и то какая стратегия и на каких настройках будет работать.
Пример: settings[*].mrs2.ma_long.type - перебор параметра type у открывающего ордера стратегии mrs2
2) account — аккаунт тестера (раздел accounts в config_tester.json). Тут мы настраиваем общий на весь аккаунт тейк профит по балансу маржи либо ограничитель числа одновременно открытых позиций.
Пример: account[*].close_by_margin.profit - перебор параметра profit опции close_by_margin
3) settings_program — общие настройки программы бота (файл settings_program.json). Тут мы настраиваем общий множитель лота risk_multiplier.
Пример: settings_program.risk_multiplier
4) config_tester — настройки самого тестера (файл config_tester.json). Например можно прогнать тесты с разными уровнями комиссии или проскальзывания.
Пример: config_tester.MakerFee

Выбор конкретной стратегии/аккаунта. В квадратных скобках указывается, к каким файлам применять параметр:
settings[*] — ко всем файлам настроек сразу
settings[0] — только к первому файлу (нумерация с 0, по порядку загрузки)
settings[my_set_btc] — только к файлу, у которого поле name равно my_set_btc
Так же работает для account[...] и для вложенных списков внутри настроек (например [*], [0] у списка ордеров).

start - начальное значение параметра
end - конечное значение параметра (включительно). Можно перебирать и по убыванию, если start > end
step - шаг изменения параметра
values - явный список значений для перебора. Если список не пустой, то start/end/step игнорируются. Значения записываются строками и автоматически приводятся к типу параметра: текст, числа ("5", "10", "25"), true/false (["true", "false"]) и списки вариантов (enum).
Например, для типа скользящей средней доступны значения:
["SMA", "EMA", "GMA", "HARMONIC", "TEMA", "DEMA", "ZLEMA", "WMA", "VWMA", "RMA", "EHMA", "THMA", "HMA", "DMA", "ATR", "H", "L", "SMA_KALMAN", "EMA_KALMAN", "GMA_KALMAN", "HARMONIC_KALMAN", "TEMA_KALMAN", "DEMA_KALMAN", "ZLEMA_KALMAN", "WMA_KALMAN", "VWMA_KALMAN", "RMA_KALMAN", "EHMA_KALMAN", "THMA_KALMAN", "HMA_KALMAN", "DMA_KALMAN", "ATR_KALMAN", "H_KALMAN", "L_KALMAN"]
Для источника цены:
["open", "high", "low", "close", "hl2", "hlc3", "ohlc4", "hlcc4", "oc2"].
Перебор списка торговых пар - смотрите Пример 1.

Проверка имён. Перед запуском тестер проверяет каждый name. Если параметр с таким путём не найден (опечатка, нет такой стратегии и т.п.), в консоль выводится предупреждение [MINER] Обнаружены невалидные parameter_mining.name, и этот параметр не применяется — тесты пройдут с исходным значением. Обязательно смотрите консоль при первом запуске перебора.


Количество прогонов — это произведение количества значений всех параметров. Если вы укажете для перебора два параметра например от 1 до 10 с шагом 1, то будет проведено 100! прогонов (10 вариантов первого параметра × 10 вариантов второго параметра). Результаты всех тестов сохраняются в виде отдельных html отчетов и в сводной таблице reports_history.csv.
Советы для большого перебора:
— выключите HTML отчёты (report.enable_html_report = false) и логгер (use_logger = false) — это сильно ускоряет прогоны и экономит место на диске;
— увеличьте max_parallel_runs под количество ядер процессора;
— если комбинаций слишком много, используйте monte_carlo (см. ниже).

Дополнительные режимы перебора (файл: config_tester.json):
single_mode - каждый файл настроек из tester/settings_strategy тестируется отдельно, и весь перебор parameter_mining выполняется для каждого из них. Например 5 файлов настроек × 20 комбинаций = 100 прогонов. Удобно, когда нужно подобрать параметры для каждой пары независимо, а не для портфеля.
shuffle_miner - перебор торговых пар без повторов между стратегиями (true/false). Работает когда в папке tester/settings_strategy несколько файлов настроек и в parameter_mining есть параметр вида settings[*].... (например settings[*].basic.symbol). Вместо того чтобы давать всем стратегиям одно и то же значение, тестер раздаёт им разные значения из списка и перебирает все уникальные сочетания. Пример: 3 файла настроек и 10 пар в values → C(10,3) = 120 прогонов, в каждом из которых стратегии торгуют разными парами. Позволяет подобрать лучший набор пар для портфеля на общем балансе.
monte_carlo - ограничение числа прогонов случайной выборкой (0 = выкл). Если общее число комбинаций перебора больше этого значения, тестер выбирает случайные monte_carlo комбинаций вместо полного перебора. Полезно, когда комбинаций миллионы: можно быстро "прощупать" пространство параметров, а затем сузить диапазоны вокруг лучших результатов.
monte_carlo_seed - начальное значение генератора случайных чисел для Monte Carlo (по умолчанию 42). С одним и тем же seed выборка повторяется, поменяйте его чтобы получить другую выборку.

файл: config_tester.json/report_optimizer Сводный отчёт оптимизатора:
После параллельного перебора (max_parallel_runs > 1) тестер автоматически строит по reports_history.csv отчёт report_optimizer_*.html. Его можно построить и вручную — например после последовательного перебора или чтобы перестроить с другими z_parameters: команда manage_tester.bat optimizer (флаг --run-report-optimizer) берёт папку tester/report/{name_comment}, либо папку, переданную первым аргументом.
— если перебирались 2 и более числовых параметра — тепловые карты и 3D surface графики. По осям X и Y откладываются два числовых параметра с наибольшим количеством значений, по оси Z — выбранные метрики;
— если перебирался 1 числовой параметр — линейные графики зависимости метрик от этого параметра;
— если одновременно перебирались торговые пары — графики строятся отдельно для каждой пары;
— если построить графики не из чего — в отчёт выводится таблица всех результатов.
chart_height - высота графиков оптимизатора в пикселях (550)
z_parameters - список метрик для оси Z. По умолчанию ["TotalPnLPercent", "MaxDrawdownPercent", "ProfitFactor"]. Можно использовать любые числовые колонки из reports_history.csv: TotalPnL, TotalPnLPercent, FinalBalance, TotalTrades, WinRate, Fills, MaxDrawdown, MaxDrawdownPercent, TotalFees, PositionAvgPercent, PositionMaxPercent, ProfitFactor, а также дополнительные столбцы, если они включены в разделе reports_history: PnLWithoutTop5, PnLWithoutBestPair, UlcerIndex, MC_MaxDD_p95, MC_LossProbability.
В reports_history.csv MaxDrawdown - максимальная просадка в USDT, а MaxDrawdownPercent - худшая в % из трёх просадок отчёта: Max Drawdown, %, % от пика у Max Drawdown, USDT и Max Unrealized Drawdown, %.


Пример 1: перебор торговых пар
parameter_mining — это список ([]), в который через запятую добавляются объекты перебора ([{}, {}]).
Для перебора торговых пар используется строковый параметр values, а числовые поля start/end/step выставляются в 1.0 (они игнорируются когда values не пустой).
Параметр settings[*].basic.symbol будет применён ко всем файлам настроек из папки tester/settings_strategy:

"parameter_mining": [
    {
        "name": "settings[*].basic.symbol",
        "start": 1.0,
        "end": 1.0,
        "step": 1.0,
        "values": [
            "1000BONKUSDT", "1000FLOKIUSDT", "1000LUNCUSDT",
            "1000NEIROCTOUSDT", "1000PEPEUSDT", "1000TAGUSDT",
            "4USDT", "AAVEUSDT", "ACHUSDT", "ADAUSDT"
        ]
    }
]

Результат: тестер прогонит тест поочерёдно для каждой из 10 пар.

Пример 2: перебор нескольких параметров одновременно
Добавим к перебору пар ещё перебор значения % тейк-профита — от 0% до 10% с шагом 0.5 (итого 21 значение). Число комбинаций: 10 пар × 21 значение = 210 прогонов.

"parameter_mining": [
    {
        "name": "settings[*].basic.symbol",
        "start": 1.0,
        "end": 1.0,
        "step": 1.0,
        "values": [
            "1000BONKUSDT", "1000FLOKIUSDT", "1000LUNCUSDT",
            "1000NEIROCTOUSDT", "1000PEPEUSDT", "1000TAGUSDT",
            "4USDT", "AAVEUSDT", "ACHUSDT", "ADAUSDT"
        ]
    },
    {
        "name": "settings[*].options.take_profit_long",
        "start": 0,
        "end": 10.0,
        "step": 0.5,
        "values": []
    }
]

Пример 3: Настройка перебора
video Видеодемонстрация

Также все стратегии бота доступны в формате PineScript для проведения тестирования на TradingView.