Перейти к основному содержимому

Создание и тестирование cBot

Создавайте, запускайте и тестируйте cBot для cTrader (C# и Python, оба .NET) с помощью встроенного редактора Monaco, выполняя их на официальном образе ghcr.io/spotware/ctrader-console.

Создание​

  • Страница Builder содержит редактор Monaco; CBotBuilder компилирует проект с использованием dotnet build в одноразовом контейнере (AppOptions.BuildImage, рабочий каталог монтируется в /work), чтобы ненадёжные цели MSBuild не могли получить доступ к хосту. Восстановление NuGet кэшируется между сборками через общий том. Веб-хост должен иметь доступ к сокету Docker.
  • Стартовые шаблоны для C# и Python находятся в src/Nodes/Builder/Templates/.

Запуск и тестирование​

  • Instances = иерархия состояний TPH (Run/Backtest × Pending/Scheduled/Starting/Running/Stopping/Stopped/Failed). Переход заменяет сущность (id меняется), id контейнера переносится.
  • NodeScheduler выбирает наименее загруженный подходящий узел; ContainerDispatcherFactory маршрутизирует на удаленный HTTP-агент узла или на локальный диспетчер Docker.
  • Полленты завершения согласовывают вышедшие контейнеры (контейнеры тестирования выходят сами через --exit-on-stop); присутствует отчет → завершено (сохранение ReportJson), отсутствует → не удалось.
  • Логи живого контейнера транслируются в браузер через SignalR; кривые капитала тестирования разбираются из отчета и отображаются на диаграмме.

Данные тестирования кэшируются по счету​

cTrader Console загружает исторические данные тиков/баров в свой --data-dir. Этот каталог — стабильный, постоянный кэш с ключом на торговом счете (его номер) — монтируется из диска узла в его собственный путь контейнера (/mnt/data), отдельный, не вложенный монтаж от каталога работы для каждого экземпляра. Поэтому каждое тестирование на одном счете переиспользует уже загруженные данные вместо того, чтобы заново загружать их каждый раз. (Ранее каталог данных находился под каталогом работы для каждого экземпляра, чей id меняется каждый запуск, что заставляло загружать свежие данные при каждом тестировании.) Эфемерный каталог работы для каждого экземпляра по-прежнему содержит алгоритм, параметры, пароль и отчет; общий кэш данных учитывается в использовании данных тестирования узлом и очищается действием очистки узла.

Параметры тестирования​

Диалог Backtest предоставляет настройки тестирования cTrader Console, настраиваемые пользователем, поэтому вам никогда не нужно трогать командную строку:

  • Symbol / Timeframe — временной фрейм — это выпадающее меню каждого периода cTrader (t1…t1000, m1…m45, h1…h12, D1/D2/D3, W1, Month1 и периоды Renko/Range/Heikin), в каноническом регистре консоли, так что вы всегда выбираете действительный --period.
  • From / To — окно тестирования (--start / --end).
  • Data mode — один из трех режимов cTrader (--data-mode): Данные тиков (tick, точный), m1 бары (m1, быстрый) или Только цены открытия (open, самый быстрый).
  • Starting balance — по умолчанию 10000 (--balance). Нулевой баланс не открывает сделки и заставляет cTrader выдать пустой отчет, который затем падает с ошибкой ("Message expected"), поэтому всегда отправляется ненулевой баланс.
  • Commission — --commission.
  • Spread — --spread, числовое поле в пипсах, которое не может быть ниже 0. Оно скрыто в режиме данных тиков, где cTrader получает спред из данных тиков (не отправляется --spread).

Каталог данных (--data-file / --data-dir) управляется самим приложением (кэш для каждого счета, см. выше), не представлен в диалоге.

:::note cTrader падает с ошибкой при пустом тестировании Если тестирование дает без результатов — нет сделок или нет данных рынка для выбранных дат/символа — собственный модуль записи отчетов cTrader Console выбросит Message expected и выйдет без отчета. Приложение не может исправить эту ошибку в вышестоящем коде, но оно обнаруживает это и помечает экземпляр как Failed с действенной причиной ("no backtest results for the selected range…") вместо необработанной трассировки стека. Выберите более широкий диапазон дат с доступными данными рынка и повторите попытку. :::

Страница деталей экземпляра​

Открытие экземпляра (/instance/{id}) показывает его живой статус, логи и — для тестирования — кривую капитала. Заголовок вкладки браузера отражает конкретный экземпляр (имя cBot · вид · символ, например TrendBot · Backtest · EURUSD), так что вкладка живого запуска и вкладка тестирования легко различаются с первого взгляда. Запуск и тестирование одного cBot отслеживаются как отдельные родословные (стабильный id родословной, переносимый во время переходов состояния), поэтому страница следует ровно одному экземпляру и никогда не смешивает данные запуска с данными тестирования.

Элементы управления жизненным циклом экземпляра​

Каждая строка экземпляра (и его страница деталей) имеет корректные для состояния элементы управления. Активный экземпляр показывает Stop; терминальный (Stopped / Completed / Failed) показывает Start (▶) для его перезапуска с тем же cBot, счетом, символом, временным фреймом, набором параметров и образом (запуск перезапускается как запуск, тестирование как тестирование). Нажатие Stop показывает уведомление "Stopping…" и отключает значок до разрешения, и вновь созданный запуск появляется в списке сразу же — без перезагрузки страницы.

Логи консоли сохраняются при завершении экземпляра — для запуска (при остановке) и для тестирования (при завершении) — поэтому логи последнего запуска остаются доступными для просмотра на странице деталей и, через панель инструментов логов, скопированы в буфер обмена (значок Copy logs) или загружены (значок Download logs) даже после удаления контейнера. Оба действуют на полный лог консоли экземпляра, не только на видимый хвост.

Завершенное тестирование также сохраняет свой отчет cTrader в обоих форматах — необработанное JSON (то же самое, которое читают кривая капитала и анализ AI) и полный отчет HTML. Оба загружаются из строки тестирования и со страницы деталей через выделенные значки. Только отчеты последнего запуска сохраняются, и значки отключены для любого тестирования, которое не было запущено, работает или завершилось с ошибкой (и никогда не показываются для экземпляра запуска) — только завершенное тестирование имеет отчет для загрузки.

Загруженный .algo никогда не был построен здесь, поэтому его столбец Last Build на странице cBots оставляется пустым (показывает время сборки только для cBot, которые вы создали в браузере).

Редактирование и переиспользование остановленного экземпляра​

Остановленный экземпляр (запуск или тестирование) имеет элемент управления Edit — значок в его строке в списке и рядом с Start/Stop на его странице деталей — который открывает диалог предзаполненный его текущей конфигурацией. Вы можете изменить торговый счет, символ, временной фрейм, набор параметров и тег образа (и, для тестирования, окно и все параметры тестирования выше), затем Save & start перезапускает его с новыми параметрами (заменяя остановленный экземпляр). Элемент управления отключен, пока экземпляр активен — только остановленный экземпляр можно редактировать.

Запуск из редактора кода​

Нажатие Run в редакторе кода открывает диалог вместо слепого, жестко закодированного запуска:

  • Trading account (обязательно) — cTrader счет, к которому подключается cBot.
  • Parameter set (опционально) — выберите существующий набор или оставьте его пустым для запуска с значениями параметров cBot по умолчанию. Кнопка + рядом с селектором создает новый набор параметров встроенно (см. ниже) и выбирает его.
  • Symbol / Timeframe по умолчанию EURUSD / h1 и могут быть изменены; Cancel или Run.

На Run редактор сохраняет + создает текущий источник, запускает экземпляр на выбранном счете с выбранными параметрами, затем отслеживает логи живого контейнера. (Поток логов пересылает файл cookie аутентификации вошедшего в систему пользователя на хаб SignalR /hubs/logs, поэтому он подключается вместо отказа с Invalid negotiation response received.)

Наборы параметров​

Parameter set — это названный, многократно используемый набор переопределений параметров cBot, сохраняемый как плоский объект JSON, отображающий каждое имя параметра на скалярное значение, например {"Period": 14, "Label": "trend"}. Во время запуска/тестирования он превращается в файл cTrader params.cbotset ({ "Parameters": { … } }). Вы можете создать/отредактировать набор как необработанный JSON из диалога Parameter sets cBot или встроенно из диалога Run.

Каждый набор параметров принадлежит cBot: диалог New Parameter Set перечисляет все ваши cBot и вы должны выбрать один — создание блокируется, пока cBot не выбран. Имя набора уникально для каждого cBot: создание или переименование набора на имя, которое уже использует другой набор того же cBot, отклоняется (четкая ошибка в диалоге, 409 Conflict в API). То же имя может быть переиспользовано на другом cBot.

JSON проверяется при сохранении: это должен быть единый плоский объект, все значения которого — скаляры (string / number / bool). Не-объектный корень, массив, вложенный объект, значение null или неправильный JSON отклоняются (четкая ошибка в диалоге, 400 Bad Request в API). Пустой объект {} допускается и означает "без переопределений".

Примечания по cTrader Console CLI​

Тестирования нужны --data-mode (по умолчанию m1), даты как dd/MM/yyyy HH:mm и JSON аргумент params.cbotset позиционно; run отклоняет --data-dir (только для тестирования). См. ContainerCommandHelpers.

Узлы и масштабирование​

Емкость выполнения масштабируется путем добавления агентов узлов (самонаходятся + пульсируют). См. обнаружение узла и масштабирование.

Требуется торговый счет​

Запуск или тестирование cBot требует торговый счет cTrader для подключения. До тех пор, пока вы не добавите его в разделе Trading accounts, кнопки Run New cBot / Backtest New cBot отключены (с подсказкой) и страница показывает подсказку со ссылкой на настройку счета — вы больше не получаете необработанную ошибку stream connect failed от бота без счета.