Как MCP работает в hamster-bot
Бот торгует на VPS сам, по ключам и настройкам, которые дал человек. MCP открывает у бота второй вход: через него ИИ-агент на том же сервере управляет ботом. Человек разговаривает с агентом с телефона.
87 инструментов
Кто за что отвечает#
Бот
Круглосуточно торгует по настройкам и хранит ключи биржи. Для работы ему не нужен ни агент, ни телефон.
Агент
Исследует настройки в тестере, запускает и правит стратегии, следит за ботами и ведёт журнал. Торговые команды он отдаёт через инструменты бота.
Телефон
Окно в сессию агента. Сама сессия, её файлы и подключение к MCP остаются на VPS.
Путь одной команды: «закрой позицию по BTC»#
- 1Человек пишет сообщение в приложении Claude. Оно уходит в облако Anthropic по HTTPS.
- 2Claude Code на VPS сам опрашивает облако и забирает сообщение. Модель решает, какой инструмент вызвать.
- 3Агент вызывает
close_positionна/mcpс токеномapi_token. Бот проверяет токен. - 4MCP-сервер превращает вызов в обычный запрос к
/api/*этого же бота и передаёт тот же токен. Поэтому логика и проверки у MCP и API одни. - 5API передаёт команду ядру бота. Ядро берёт ключ этого аккаунта.
- 6Коннектор подписывает запрос и отправляет его на биржу. Результат идёт обратно по той же цепочке и появляется на телефоне.
Что будет, если одна из частей отключится#
| Что случилось | Бот | Агент |
|---|---|---|
| Телефон выключен | Торгует | Сессия продолжает работать на VPS |
| Закрылся SSH | Торгует | Работает, если запущен в tmux |
| VPS без сети дольше 10 минут | Не может обращаться к бирже, пока сеть не вернётся | Процесс claude remote-control завершается, его нужно запустить заново |
| Агент остановился | Торгует по текущим настройкам, но за ним никто не следит | Не работает |
use_mcp выключен | Торгует | Не может управлять ботом: /mcp отвечает 404 |
Что агент может делать через MCP#
| Группа | Инструментов | Примеры |
|---|---|---|
| Тестер | 42 | tester_run_mining, tester_run_batch, tester_portfolio_analysisещё 39
|
| Боты | 10 | list_bots, get_balances, pause_bot, play_botещё 6
|
| Позиции и ордера | 9 | list_positions, market_order, close_positionещё 6
|
| Аккаунты | 8 | list_accounts, save_account, get_balance_historyещё 5
|
| Стратегии | 7 | save_strategy, create_strategy_from_tester, delete_strategyещё 4
|
| Система и логи | 7 | get_errors, read_log_file, update_programещё 4
|
| Настройки | 4 | get_config, update_config, get_field_hintsещё 1
|
Из 87 инструментов 42 только читают данные (readOnlyHint), а 25 помечены как опасные (destructiveHint): они торгуют, запускают ботов или необратимо меняют данные. Это рыночные ордера, закрытие позиций, отмена ордеров, запуск ботов, сохранение и удаление стратегий и ключей, изменение конфига, выключение и обновление программы. Тестер работает на истории и с биржей не торгует.
Границы доступа#
- Токен даёт права владельца. С
api_tokenдоступны все 87 инструментов, включая торговлю, удаление аккаунтов и выключение программы. Режима только для чтения нет. - Подтверждение зависит от клиента. Опасные инструменты только помечены, а спрашивать человека должен MCP-клиент. В автономном режиме разрешения выдаются заранее, и агент действует без вопросов.
- CLAUDE.md задаёт правила, но не защищает. Лимиты риска и запрет выходить за пределы папки агент соблюдает как инструкцию. Если у него есть shell под тем же пользователем, что и у бота, он технически может читать файлы бота.
- Токен не всегда нужен. Когда вход через Telegram выключен, запросы к
/mcpс этой же машины проходят без токена. Это касается любого локального процесса. - Веб-интерфейс, API и MCP работают на одном порту. Агенту на том же VPS хватает адреса
127.0.0.1. С другой машины токен идёт открытым текстом, поэтому через интернет нужен HTTPS-прокси или SSH-туннель.
Как это запускается на VPS#
В
settings_program.jsonбота, перезапуск не нужен:"use_mcp": true
Сессия, которая переживёт закрытие SSH:
tmux new -s agent
Подключить агента к боту:
claude mcp add --transport http hamster-bot http://127.0.0.1:<порт>/mcp --header "Authorization: Bearer <api_token>"
Открыть сессию для телефона:
claude remote-control --name "hamster-bot"
В чате сессии: автономная работа по расписанию:
/loop 6h Продолжай работу по CLAUDE.md
Подключение: подробности#
По умолчанию MCP выключен. Вместо правки файла его можно включить через API: POST /api/settings/config с телом { "use_mcp": true }.
Адрес: http://127.0.0.1:<порт>/mcp, транспорт Streamable HTTP. С другой машины вместо 127.0.0.1 укажите адрес сервера.
Вместо claude mcp add подключение можно описать в файле .mcp.json проекта:
{
"mcpServers": {
"hamster-bot": {
"type": "http",
"url": "http://127.0.0.1:5000/mcp",
"headers": { "Authorization": "Bearer <api_token>" }
}
}
}Другие клиенты подключаются по тому же адресу, если поддерживают Streamable HTTP и свои заголовки запроса.
Правила доступа те же, что у API (см. Доступ). Кроме токена подходит cookie hamster-bot-token при включённом входе. Запрос без них получает 401.
Имена аргументов#
Во всех инструментах одни и те же имена: strategy — имя стратегии бота, account — имя аккаунта, folder — папка настроек тестера. Прежние имена принимаются как синонимы: name вместо strategy в get_strategy, copy_strategy, delete_strategy, name вместо account в get_account, get_account_symbols, delete_account, get_account_info, get_balance_history, compact_balance_history, path вместо folder в set_tester_settings_folder, create_tester_settings_folder, delete_tester_settings_folder. Если нет ни основного имени, ни синонима, ошибка называет ожидаемое поле. strategy в draft_strategy, draft_tester_settings и get_settings_schema — код стратегии (zigzag, mrs2), а не имя. Для настроек тестера name — имя набора настроек.
Ошибка API возвращается агенту как ошибка инструмента с кодом и текстом, например HTTP 404: {"success":false,"error":"Strategy not found"}. Очень длинные ответы обрезаются до 200 000 символов. read_tester_file отдаёт текстовые файлы целыми строками: длинный ответ заканчивается подсказкой ... [lines A-B of N; continue with offset=B]. Для длинных CSV есть параметры offset и limit (страница строк), tail_lines (последние N строк), contains (только строки с текстом) и columns (только нужные столбцы); заголовок CSV сохраняется всегда. list_tester_files принимает contains, offset и limit. HTML-отчёты большие, поэтому для сравнения прогонов лучше tester_report_summaries, а для подробностей одного прогона — read_tester_report.
Исследования в тестере#
Агент может сам вести исследование стратегии. Типичный порядок:
get_field_hints— узнать смысл полей настроек стратегии и конфига тестера, в том числе синтаксисparameter_mining;get_settings_schema— какие поля стратегия действительно читает: перебор недействующего поля даёт одинаковые строки.create_tester_settings_folder— завести свою папку для эксперимента;copy_tester_settings_to_folder— скопировать в неё нужные настройки. Дальше передаватьfolderво все инструменты тестера.draft_tester_settingsиsave_tester_settings— создать новые настройки для нужной биржи, пары и таймфрейма. Варианты существующих настроек сохранять не нужно: их задаётoverridesпри запуске.save_tester_config— задать период, комиссии,parameter_miningи новыйname_commentдля эксперимента; включитьreport.enable_json_report. Начало периода (StartDate) для сверки с живым ботом ставить на границуtime_frameстратегии и не раньше запуска бота: стратегия работает с первой свечи своего таймфрейма, открытие которой не раньшеStartDate, поэтому старт в середине 4h-свечи сдвигает первые ордера на следующую свечу.WarmupDays(по умолчанию 30) только прогревает индикаторы историей доStartDate: на этих днях стратегия не торгует и состояние не накапливает, позиция и ордера живого бота из истории не восстанавливаются. Если данных у пары меньшеWarmupDays, торговля начнётся позже (предупреждение в ответе).tester_download_data— загрузить свечи и дождаться окончания вtester_status. Период можно задать параметрамиstartиend, по умолчанию: старт конфига с прогревом .. сейчас (конфиг менять не нужно). Вdownload.resultвидно, по какой день данные реально есть у каждой пары.tester_run_single— проверить одну комбинацию;tester_wait(илиwait_secondsпри запуске) дожидается прогона и возвращает метрики, предупреждения и пути к отчётам.tester_run_batch— сравнить несколько вариантов и проверить их на нескольких периодах одним вызовом. Илиtester_run_mining— перебрать все комбинации: результаты в<name_comment>/reports_history.csv(read_tester_file);queue=trueставит перебор в очередь за текущим.read_tester_report— разобрать прогон: разделsummaryдля сравнения, итоги по парам, месяцы, сделки. Для набора стратегий —tester_portfolio_analysis: группы T/CT, корреляция, худшие дни, вклад каждой стратегии в просадку.tester_report_summaries,tester_run_stressиwalk_forwardв конфиге — сравнить лучшие варианты и проверить их устойчивость.send_tester_report_to_telegram— прислать итоговый отчёт пользователю в Telegram, если он просит.
Одна стратегия на пару#
На одном счёте на одной паре (basic.symbol) может быть только одна стратегия, и в живой торговле, и в тестере. Пар на счёте может быть сколько угодно (хоть 200), стратегии на них могут быть разными или одинаковыми, но символ среди стратегий счёта должен быть уникальным. Стратегия на занятой паре сохраняется, но не запускается (в логе DUBLICATE SUMBOL ON API); проверьте list_strategies по счёту и паре до save_strategy, copy_strategy (копируйте на другую пару) и create_strategy_from_tester. Настройки тестера, которые идут в одном прогоне, тоже должны быть на разных парах; чтобы сравнить несколько настроек на одной паре, запускайте каждую отдельно (элементы tester_run_batch или перебор с single_mode).
Реинвестирование и сравнение вариантов#
Размер позиции по basic.balance_percentage_long/_short считается от текущего баланса, поэтому прибыль реинвестируется и годовой PnL % завышается. Чтобы варианты и периоды сравнивались честно, отключите рост размера одним из способов:
basic.use_fix = trueиbasic.my_fix_balance = 50: каждый ордер считается от 50 единиц котируемой валюты (обычно USDT), независимо от баланса.basic.max_balance = 2000: пока баланс меньше, бот работает с реальным балансом; при балансе 2350 размер считается от 2000, выше порога реинвестирование прекращается.basic.lot_long/basic.lot_short: постоянный размер ордера, который уходит на биржу.
Некоторые стратегии могут изменить этот базовый размер по своей логике. Параметры можно задать через overrides запуска (set) или перебирать в parameter_mining.
Ответы на сохранение и запуск содержат warnings: поля, которые настройки не читают. check_tester_settings проверяет так всю папку.
Перевод в торговлю и контроль#
Проверенную настройку переносит в бота create_strategy_from_tester — стратегия создаётся на паузе, запуск — play_bot после проверки. Работу живого бота агент оценивает так: после закрытия дня, когда свечи можно скачать, прогоняет тестер на тех же настройках и за тот же период (стратегию в папку тестера копирует import_tester_settings) и получает полную статистику — в нормальном случае она совпадает с живой торговлей. Фактический результат — история баланса get_balance_history (пишется при включённом monitoring.enabled).
Инструкции сервера и описания инструментов объясняют агенту главное правило живой торговли: позиция и ордера не должны оставаться без контроля. Стратегия на паузе их не ведёт, поэтому отключение — только в порядке пауза → снять ордера → закрыть позицию → удалить (delete_strategy с full=true делает это сам).
Логи#
У каждого бота (стратегии на паре) свой лог: log_<дата>_<Биржа> <аккаунт> <пара> <таймфрейм> <стратегия> <имя>.log — уровни, сигналы, выставленные и снятые ордера, исполнения, изменения позиции и ошибки стратегии; по нему видно, почему бот торговал или не торговал. У каждого аккаунта — log_<аккаунт>_<дата>.log: балансы и позиции с биржи, ответы и ошибки API биржи, лимитер позиций, close_by_margin. Общий лог программы — log_<дата>.log (get_log), логи тестера — TESTER_*.log. Формат даты в именах разный, поэтому файл ищут по имени стратегии или аккаунта: list_log_files с contains, затем read_log_file.
Примеры использования#
Ниже — запросы к агенту и вызовы инструментов, которые он делает. Аргументы показаны в JSON, как их передаёт MCP-клиент. Папка lut_now, имена настроек и даты — для примера.
Проверить вариант набора без тестовых копий#
«Что будет, если удвоить трендовые стратегии, но не больше 10% на пару, и выключить шорт у C_MU? Проверь на двух периодах».
tester_run_single {
"settings": ["*"], "folder": "lut_now", "wait_seconds": 240,
"overrides": [
{ "match": "T_*", "mul": { "basic.balance_percentage_long": 2, "basic.balance_percentage_short": 2 }, "cap_pct": 10 },
{ "match": "C_MU", "set": { "basic.use_short": false } }
],
"periods": [["2026-05-01", "2026-08-01"], ["2026-08-01", "2026-10-26"]]
}Файлы настроек не меняются. В ответе по каждому периоду — summary (PnL, просадки, Ulcer, profit factor, сделки, месяцы), пути к отчётам, applied (что изменено) и warnings. Вместо маски можно выбрать настройки по тегу: { "tag": "hedge", "mul": { ... } }.
Сравнить несколько вариантов одним вызовом#
tester_run_batch {
"folder": "lut_now", "parallel": 2, "wait_seconds": 240,
"periods": [["2026-05-01", "2026-08-01"], ["2026-08-01", "2026-10-26"]],
"runs": [
{ "name": "base", "settings": ["*"] },
{ "name": "T x2", "settings": ["*"], "overrides": [{ "match": "T_*", "mul": { "basic.balance_percentage_long": 2 } }] },
{ "name": "без L_X", "settings": ["*"], "overrides": [{ "match": "L_X", "exclude": true }] },
{ "name": "только лонг", "settings": ["*"], "sides": "long" }
]
}Каждый вариант идёт на каждом периоде; ответ — таблица результатов. Без wait_seconds агент ждёт пакет через tester_wait_batch.
Подобрать параметр, устойчивый на нескольких периодах#
«Подбери depth для T_BTC, но не под один период».
get_settings_schema { "strategy": "zz" }—zz.depthдействует только приzz.type = ZZ2; перебор поля, которое настройка не читает, даёт одинаковые строки.Перебор на трёх периодах (каждый — отдельный полный прогон через очередь):
tester_run_mining { "settings": ["T_BTC"], "folder": "lut_now", "config": { "name_comment": "MCP_depth", "parameter_mining": [{ "name": "settings[*].zz.depth", "start": 4, "end": 20, "step": 2 }], "...": "остальное как в get_tester_config" }, "periods": [["2026-02-01", "2026-05-01"], ["2026-05-01", "2026-08-01"], ["2026-08-01", "2026-10-26"]] }Ответ содержит
report_foldersкаждого периода иwarnings(несуществующие и недействующие параметры).- Дождаться окончания в
tester_status, затемtester_mining_robustness { "folders": [...], "base": { "settings[*].zz.depth": 12 } }— рейтинг по плато всех периодов, место лучшей точки каждого периода в общем рейтинге и точки, которые не хуже исходной ни на одном периоде.
Оценить хедж трендовых стратегий в портфеле#
«Помогают ли T-стратегии CT-стратегиям в просадке?»
- Прогон набора с
report.enable_json_report: true(разделdailyвключён по умолчанию). tester_portfolio_analysis { "path": "<report_json_path>", "groups": { "T": "T_*", "CT": "C_*" } }— корреляция групп, худшая неделя, PnL группы T в худшие дни CT (offset_percent) иleave_one_out: насколько выросла бы просадка портфеля без каждой стратегии. Это заменяет отдельный прогон без каждой стратегии.- Подобрать размер T на фоне остального набора — портфельный перебор без
single_mode: параметрsettings[T_*].basic.balance_percentage_long, строки сравниваются поMaxDrawdownPercentиUlcerIndexпортфеля.
Проверить папку настроек#
check_tester_settings { "folder": "lut_now" } — настройки с изменёнными полями, которые ни на что не влияют (секция другой стратегии, поле другого zz.type, выключенный use_*, basic.leverage в тестере). Те же предупреждения приходят при сохранении настроек.
Повторить прогон с правкой и отдать вариант пользователю#
Каждый прогон сохраняет run_snapshot_*.json с точными настройками и конфигом. Агент читает его (read_tester_file), правит и запускает tester_run_snapshot с изменённым snapshot — файл не меняется. Чтобы пользователь запустил вариант сам, агент сохраняет его в runs через save_tester_file: в веб-интерфейсе (Тестер, вкладка «Результаты (файлы)») у файла есть кнопки «Запустить» и «Изменить».
Перевести настройку в торговлю и вести бота#
«Запусти T_BTC на демо-счёте и следи за ним».
list_accounts— найти аккаунт.create_strategy_from_tester { "name": "T_BTC", "folder": "lut_now", "account": "demo_bybit" }— стратегия создаётся на паузе; агент проверяет её (get_strategy,warnings) и запускаетplay_bot.- Контроль в течение дня:
list_bots,list_positions,list_orders; лог стратегии —list_log_files { "contains": "T_BTC" }иread_log_file; ошибки —get_errors. - После закрытия дня:
import_tester_settings(стратегия изget_strategyв папку тестера),tester_download_data, прогон тестера за прошедший период — полная статистика, которая в нормальном случае совпадает с живой торговлей. Фактический результат —get_balance_history(приmonitoring.enabled). Расхождение — повод разобрать лог стратегии. - Корректировка: проверить изменение в тестере, затем
save_strategy— изменения сразу применяются к работающему боту.
Отключить стратегию#
delete_strategy { "name": "T_BTC", "full": true } — пауза, снятие ордеров, закрытие позиции, удаление. Если ордера или позиция не снялись, стратегия остаётся на паузе и не удаляется: агент проверяет list_orders и list_positions и доделывает вручную в том же порядке, не пропуская паузу.
Прислать отчёт#
«Пришли итоговый отчёт в Telegram» — send_tester_report_to_telegram { "path": "<report_path>", "caption": "лучший вариант по просадке" }. Отправляются только файлы отчётов тестера в чат уведомлений тестера.
Примеры запросов к агенту:
- «Подбери длину зигзага для BTCUSDT 1h на Bybit за последние три месяца, проверь лучшую точку на двух других периодах и стресс-тестом».
- «Синхронизируй папку lut_now с mrs-bybit и сравни набор с удвоенными T-стратегиями и без них по просадке и Ulcer».
- «Какие стратегии lut_now добавляют просадку портфелю, а какие её снижают?»
- «Перенеси лучший вариант на демо-счёт, запусти и каждый день сверяй живую торговлю с тестером».
Примеры: что можно попросить у агента
Агенту пишут обычным языком: он сам выбирает инструменты, вызывает их по очереди и объясняет результат.
Исследования в тестере
«Подбери параметры MRS2 для BTC за последний год и проверь лучшие стресс-тестом»
Настроит перебор, запустит его, найдёт плато, а не одиночный пик, прогонит tester_run_stress и расскажет, что выжило.
«Прогони e2e_zz за сентябрь и объясни, почему стратегия в минусе. Разбери сделки: лонги против шортов, длительность, MAE/MFE. Предложи одно изменение и проверь его»
Возьмёт сделки из read_tester_report и сам найдёт закономерности: например, что шорты убыточны или что сделки закрываются раньше пика MFE. Затем поменяет параметр, перезапустит прогон и покажет цифры до и после.
«Найди лучшую длину зигзага перебором, а потом докажи, что это не подгонка: walk-forward и стресс-тест»
Перебор находит «идеальный» вариант, walk_forward проверяет его на периоде, который оптимизатор не видел, а tester_run_stress — в ухудшенных условиях исполнения. Обычно лучший вариант перебора на новых данных заметно проседает, и агент это покажет.
«Подбери параметры zigzag для BTCUSDT 1h на Bybit за последние 3 месяца и дай итоговую рекомендацию»
Весь цикл одной фразой: подсказки к полям, настройки, загрузка данных, прогоны, чтение результатов и вывод.
«Проверь стратегию на топ-10 пар Bybit и оставь пары, где она стабильно работает»
tester_exchange_symbols, настройки на несколько пар, раздел by_symbol и доходность по месяцам из JSON-отчёта.
«Покажи, как результат зависит от комиссии и проскальзывания»
Перебор по TakerFee и SlippagePercent в конфиге тестера. Наглядно показывает, почему стратегия с отличным бэктестом теряет деньги в реальной торговле.
«Сравни два последних прогона: где новая версия лучше, а где хуже?»
Прочитает JSON-отчёты и разложит разницу по парам, месяцам и просадке.
«Скопируй стратегию с BTC на SOL и прогони её в тестере за полгода»
Скопирует настройки на другую пару, скачает историю, запустит бэктест и скажет, стоит ли переносить её на реальный счёт.
«Синхронизируй папку lut_now с mrs-bybit и сравни набор с удвоенными T-стратегиями и без них по просадке и Ulcer»
copy_tester_settings_to_folder, затем tester_run_batch с overrides — без тестовых копий настроек, все варианты одним вызовом.
«Какие стратегии lut_now добавляют просадку портфелю, а какие её снижают?»
tester_portfolio_analysis: корреляция групп, худшие дни и leave_one_out — просадка портфеля без каждой стратегии, без отдельных прогонов.
«Подбери длину зигзага, проверь лучшую точку на двух других периодах и стресс-тестом»
Перебор с periods, затем tester_mining_robustness покажет, держится ли точка на всех периодах или подогнана под один.
Рабочий бот: чтение и анализ
«Утренняя сводка: баланс, открытые позиции, ошибки за ночь»
Балансы, позиции, ордера, история баланса и ошибки в логах — одна фраза вместо пяти вкладок. В Claude Code сводку можно поставить на расписание командой /loop.
«Почему бот на ETH ночью не открыл сделку?»
Посмотрит лог и ошибки за ночь, состояние бота и фильтры стратегии и объяснит причину.
«Разберись с ошибками за сутки»
Через get_errors и get_account_info найдёт причину — например, истёкший ключ или отсутствие прав на фьючерсы — и объяснит её по-человечески.
«Проверь мои стратегии на рискованные настройки»
Сверит все стратегии с подсказками полей и укажет на риски.
«Пришли в Telegram график и позицию по каждому боту в просадке»
Найдёт таких ботов и отправит их график и позицию в Telegram.
Управление: с подтверждением
Перед реальными действиями агент показывает, что собирается сделать, а клиент запрашивает подтверждение на каждый опасный инструмент, если разрешения не выданы заранее (см. Границы доступа).
«Создай рабочую стратегию с найденными параметрами, но на паузе»
После исследования: create_strategy_from_tester переносит проверенную настройку тестера в бота на паузе. Вы проверяете настройки и запускаете бота сами.
«Перенеси лучший вариант на демо-счёт, запусти и каждый день сверяй живую торговлю с тестером»
После закрытия дня прогонит тестер на тех же настройках за тот же период и сравнит с историей баланса; расхождение разберёт по логу стратегии.
«Отключи стратегию T_BTC»
delete_strategy с full=true: пауза, снятие ордеров, закрытие позиции, удаление — позиция не останется без управления.
«Объясни, что делает параметр block_adds, и включи его там, где есть фильтр по тренду»
Прочитает подсказки к полям, найдёт нужные стратегии и поправит их.
«Поставь на паузу всех ботов на альтах и отмени их ордера»
Пауза и отмена ордеров — всё на словах.
«Сократи все позиции на аккаунте наполовину и поставь ботов на паузу»
reduce_positions и pause_all_bots.