XTester 0.0.75: от модели к реальному запуску

XTester 0.0.75: от модели к реальному запуску

Есть большая разница между стратегией, которая убедительно выглядит в редакторе, и системой, которой можно доверить реальный запуск. Особенно если внутри стратегии появляется модель машинного обучения или обращение к AI-провайдеру.

В простом демонстрационном сценарии всё выглядит легко: загрузить ONNX-файл, вызвать модель, получить число, отправить ордер. Настоящие вопросы начинаются позже. Какая именно версия модели участвовала в тесте? В том ли порядке ей передали признаки? Не обучалась ли она на данных из будущего? Почему стратегия в Launcher принимает другие решения, чем в бэктесте? Что попало в пакет запуска вместе с ключами и сетевыми настройками? И можно ли повторить результат без повторного обращения к внешнему сервису?

Версия XTester 0.0.75 посвящена именно этому переходу — от работающего прототипа к воспроизводимому, проверяемому контуру. В релиз вошли безопасная работа с ONNX-моделями, управляемый доступ стратегий к локальным и облачным AI-провайдерам, новый жизненный цикл стратегии и общая логика исполнения для тестера, Research Lab, headless-проверки и Launcher.

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

Модель становится частью проекта

Раньше подключение модели к торговой стратегии почти неизбежно начиналось с локального пути к файлу. Это удобно на машине разработчика и плохо переносится куда-либо ещё. Файл можно заменить, переместить или случайно перепутать. На другом компьютере путь будет другим. В отчёте останется результат, но не всегда останется доказательство, какая именно модель его получила.

В XTester 0.0.75 модель стала управляемым артефактом проекта.

Можно импортировать обычный .onnx или переносимый .xtmodel формата schema v2, посмотреть контракт входных признаков и выходов, экспортировать артефакт обратно или установить встроенную синтетическую демонстрационную модель. Стратегия обращается к модели через безопасный API XTester.Models, а не открывает произвольный файл на диске.

Вместе с весами XTester хранит то, без чего результат модели трудно воспроизвести:

  • точный порядок входных признаков;
  • правила нормализации;
  • формы выходных данных;
  • дату окончания обучающей выборки TrainingDataEndUtc;
  • контрольную сумму SHA-256.

Эти данные проверяются до OnInit. Если артефакт изменён, повреждён или обучен на периоде, который для данного запуска находится в будущем, тест не начинается. Ошибка проявляется до торговли, а не после красивого отчёта.

Это важная граница. XTester не пытается угадать, совместимы ли стратегия и модель. Совместимость описана контрактом и проверяется явно.

Один и тот же ONNX-путь в тесте и Launcher

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

Поэтому в версии 0.0.75 закреплён единый CPU-путь исполнения для Tester, bundle/headless-проверки, Paper и Live:

  • CPUExecutionProvider;
  • последовательное выполнение;
  • один intra-op и один inter-op поток;
  • расширенная оптимизация графа.

Launcher получает тот же модельный артефакт и тот же контракт, которые прошли проверку в проекте. Отпечаток модели сохраняется в версиях стратегии, отчётах, операциях синхронизации и восстановления. Если артефакт не совпадает, система не делает вид, что это тот же запуск.

При этом границы первой версии Model SDK сформулированы честно. Релиз выполняет inference. Он не обучает модель, не выбирает GPU или NPU и не меняет активные веса на ходу. Обучение и калибровка остаются отдельным процессом. Это позволяет сначала добиться воспроизводимости, а уже потом расширять вычислительный контур.

AI-провайдер без ключей внутри стратегии

Второй большой блок релиза касается стратегий, которым нужен не только локальный ONNX, но и запрос к языковой или другой AI-модели.

Напрямую передавать стратегии URL, токен и сетевой клиент удобно лишь до первого переноса проекта. Затем секрет оказывается в коде, пакете или журнале. Кроме того, становится трудно ограничить стоимость и частоту вызовов, отключить сеть для проверочного прогона или доказать, на каком ответе было принято решение.

XTester 0.0.75 вводит Strategy AI Provider SDK. Стратегия работает с логическим слотом через XTester.AiProviders. В профиле запуска пользователь связывает этот слот с локальным Ollama, LM Studio или настроенным облачным провайдером. Код стратегии не получает реальное имя провайдера, endpoint, ключи и транспортные объекты.

Для каждого слота задаются:

  • режим доступа;
  • тайм-аут и ограничения частоты;
  • бюджет вызовов и токенов на прогон;
  • явное согласие на обращение к конкретному удалённому endpoint.

Доступны три режима:

  • ReplayOnly — использовать только ранее записанные ответы;
  • RecordMissing — брать отсутствующие ответы у провайдера и сохранять их для воспроизведения;
  • LiveNoRecord — выполнять живые обращения без записи содержимого.

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

Почему AI-вызов не блокирует торговый callback

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

В новом API вызовы AI-провайдера неблокирующие. Ответ становится доступен стратегии только после того, как продвинулось моделируемое время. Перед использованием он проходит локальную проверку JSON и схемы. Система не выполняет скрытые перенаправления, не перебирает запасные endpoint, не делает транспортные повторы по собственному усмотрению и отклоняет слишком большие ответы.

Это намеренно строгая модель. Торговая стратегия должна понимать, получила ли она допустимый ответ, и явно решить, как действовать при отказе. Сетевой слой не подменяет торговую логику.

Запись и повтор: внешний AI становится проверяемым

Один и тот же prompt не гарантирует один и тот же ответ внешней модели. Без записи результата два прогона стратегии могут разойтись, даже если рыночные данные и код не менялись.

Для этого в XTester появился ограниченный record/replay-контур. Записи шифруются через DPAPI и имеют лимиты по размеру. В режиме ReplayOnly стратегия получает тот же сохранённый результат без сетевого запроса. Это позволяет повторить исследование, проверить bundle или сравнить поведение сред исполнения.

За границей безопасности следят отдельно. Bundle и headless-проверка не обращаются к провайдеру по сети. В пакет запуска не попадают ключи, endpoint, prompts, входные данные, ответы или содержимое replay. Схема bundle v3 переносит только устойчивые идентификаторы стратегии и профиля, а также безопасный снимок привязок.

На другой машине рабочий AI-режим требует локально создать привязку заново, проверить её и подтвердить обращение к выбранному endpoint. Согласие не переносится вместе с проектом как формальная галочка.

Новый жизненный цикл стратегии

Модели и провайдеры мало значат, если тестер и реальный Launcher по-разному вызывают стратегию. Поэтому третья линия версии 0.0.75 — единый lifecycle.

Современный контракт включает:

  • OnInit(StrategyContext) для инициализации и объявления зависимостей;
  • OnBar(ISymbolKey, IKline) с точным указанием источника события;
  • OnFinish(StrategyFinishContext), который вызывается для конкретного запуска не более одного раза и содержит причину завершения.

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

Старые стратегии продолжают работать через compatibility bridge. Новый API не заставляет немедленно переписывать весь существующий код, но даёт более точный контракт для новых проектов.

Несколько инструментов и никаких данных из будущего

Основной инструмент подписывается автоматически. Дополнительные потоки баров стратегия подключает через SubscribeOnBar. Если история нужна только для расчёта и не должна создавать callback, используется DeclareDataDependency с требуемой глубиной закрытых баров.

Разница между подпиской и зависимостью принципиальна. Стратегия явно сообщает, какие события она хочет получать, а какие данные ей нужны только для чтения.

В Live-режиме общий watermark продвигается по самому медленному обязательному потоку. Catch-up после паузы или перезапуска идёт в хронологическом порядке и по реальным границам закрытия баров. Более быстрый таймфрейм не может протащить стратегию вперёд, пока нужный старший бар ещё не закрыт.

Тот же dispatcher теперь используется в GUI-бэктесте, bundle/headless, Research Lab, Paper и Live. Это уменьшает пространство для неприятной ситуации, когда стратегия прошла проверку в одном режиме, но получила другую последовательность событий после запуска.

Что изменилось в Launcher

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

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

Для MCP и Copilot добавлены метаданные list_strategy_models и list_strategy_ai_slots. Они помогают агенту понять, какие модели и логические слоты доступны проекту, но не дают доступ к ключам или содержимому вызовов.

Платформенные изменения и завершение поддержки BitMEX

Версия 0.0.75 требует Windows 10 версии 2004 (build 19041) или новее и 64-битный процесс. XTester, Launcher и MCP Host перешли на .NET 10 с целевой платформой net10.0-windows10.0.26100.0. Windows 7 и 32-битные сборки больше не поддерживаются.

Поддержка BitMEX завершена. Биржа удалена из выбора, операций с историей, символами, комиссиями и счетами, а также из Launcher bundles и настроек Research Lab. При нормализации старых настроек связанные аккаунты и символы удаляются, а сохранённые профили и раскладки сбрасываются там, где они ссылались на BitMEX.

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

Справочник SDK вместо разрозненных подсказок

Крупный публичный контракт бесполезен, если его приходится восстанавливать по сигнатурам методов. Вместе с релизом подготовлен двуязычный Strategy SDK Handbook. Он охватывает быстрый старт, lifecycle, работу с несколькими таймфреймами, сигналы, ордера, риск, сервисы, ONNX, AI-провайдеры, тестирование, Launcher и практические рецепты.

К тому же контракту приведены IntelliSense, подсказки компилятора, Copilot knowledge, sandbox-проверки, MCP-документация и спецификации платформы. Это важно не только людям: агент, который пишет стратегию, должен получать те же правила, что и компилятор и runtime.

Небольшие изменения, которые видны каждый день

Не все улучшения версии требуют отдельной архитектурной главы.

Метка последней цены на графике теперь показывает моделируемое время до закрытия текущего бара, остаётся внутри области графика и рисуется поверх плотных подписей ордеров и индикаторов. Долгие проверки готовности и компиляция вынесены с UI-потока, поэтому интерфейс реже замирает во время подготовки запуска. Диалог согласия на телеметрию корректно помещает локализованный текст при повышенном DPI.

Как проверяли релиз

Для 0.0.75 расширили автоматические проверки реальным ONNX inference, подменой и повреждением артефактов, причинностью данных, транспортом и replay AI-провайдеров, приватностью, lifecycle, совместимостью bundle, платформенными ограничениями и миграцией удалённой биржи.

Дополнительно выполнены два сквозных golden-прогона в Release-конфигурации.

Первый использует детерминированную синтетическую стратегию с моделью. Второй — заранее подготовленный DPAPI-зашифрованный AI replay в режиме ReplayOnly. Оба сценария прошли через обычный SimulationRunner, прямой BundleBacktestRunner и настоящий процесс XTester.Launcher.exe --worker.

Решения стратегии, fills, статистика, отпечатки модели и AI, а также закреплённые SHA-256 трасс ордеров совпали между тремя путями.

Это доказывает согласованность платформенного контура на контрольных сценариях. Но это не обещание, что любая модель автоматически станет корректной торговой системой. Каждая реальная стратегия, набор признаков и ONNX-граф всё равно требуют собственной калибровки, проверки на новых данных и приёмочного прогона.

Что даёт версия 0.0.75 на практике

Новый релиз сокращает число скрытых переменных между исследованием и запуском.

Модель больше не является случайным файлом на конкретном компьютере. AI-провайдер не передаёт стратегии свои ключи и сетевые детали. Проверочный прогон можно повторить через replay. Несколько потоков данных движутся в причинном порядке. Завершение стратегии имеет явную причину. Tester и Launcher используют общий runtime-контур.

Это не отменяет риск и не превращает AI в источник гарантированной доходности. Зато делает результат лучше объяснимым: какая модель работала, какие данные она могла видеть, к какому провайдеру разрешено обращаться, какой ответ использовался и совпало ли поведение между тестом и запуском.

XTester 0.0.75 уже опубликован. Установленная версия получает обновление через штатный механизм XTester. Для новой установки доступны Setup, Installer и Portable-сборка на странице релиза.

Скачать XTester 0.0.75

Материал носит информационный характер. Бэктест, AI-модель и автоматизация не гарантируют будущую доходность. Перед реальной торговлей стратегию необходимо отдельно проверить на новых данных и с подходящими ограничениями риска.