Перейти к содержанию

Оптимизация сиБота

Команда optimize перебирает значения параметров сиБота, чтобы найти сочетания с наилучшими результатами по выбранным критериям. Она выполняет тот же генетический поиск или перебор комбинаций по сетке, что и настольное приложение cTrader, но из терминала с использованием JSON-файла параметров. Это аналог команды бэктестинга, предназначенный для оптимизации.

Область применения

Команда optimize предназначена для оптимизации параметров сиБотов. У индикаторов и плагинов есть собственные команды (indicator calculate, indicator history, create, build). Они не входят в область применения оптимизации.

Предварительные требования

  • cTrader CLI уже установлен, и вы можете войти в систему.
  • СиБот должен быть экспортирован в файл .algo и скомпилирован для .NET 8.
  • Файл параметров, определяющий, какие параметры будут перебираться.

Примечание

Команда optimize доступна только в локальной версии cTrader CLI. Во внутренней и облачной версиях она отсутствует.

Команда optimize

ctrader-cli optimize <path-to-algo-file> --params=<path-to-params-file> [options]

Первым аргументом указывается путь к файлу .algo. Параметр --params обязателен. Базовый таймфрейм необходимо задать через --timeframe или в файле параметров. Если базовый таймфрейм не указан ни одним из этих способов, команда завершится с ошибкой.

Параметры оптимизации

Обязателен только --params. В примерах ниже используются распространенные необязательные параметры --timeframe, --method, --criteria, --optres и --passes-dir.

Перед началом полезно знать о нескольких параметрах:

  • --method — genetic (по умолчанию) или grid. Выбирайте grid, если сочетаний параметров немного и нужно проверить их все. Если вариантов много и направленный поиск быстрее, используйте genetic.
  • --cores — количество параллельных рабочих процессов, которые выполняют бэктестинг в рамках каждого прохода оптимизации. Каждый рабочий процесс использует один поток процессора, поэтому при оптимизации задействуется примерно столько потоков, сколько указано в этом параметре. Допустимые значения — целые числа от 1. По умолчанию значение равно половине числа процессоров плюс один. На небольшом VPS уменьшите значение, чтобы сохранить ресурсы для других задач. На выделенном компьютере его можно увеличить и распределить генетический поиск по большему числу потоков.
  • --auto-select-best — автоматически выбирает лучший проход после завершения оптимизации, чтобы файл .cbotset с наиболее эффективными настройками можно было использовать без дополнительных действий.

Примечание

Команда optimize использует --timeframe, а не --period. Команды run и backtest по-прежнему используют --period. При передаче --period команда optimize выдаст ошибку неизвестного параметра.

Файл параметров

Файл, указанный через --params, представляет собой объект JSON с массивом parameters. Его структура совпадает со структурой файла, экспортированного из интерфейса оптимизации настольного приложения cTrader. Поэтому такой файл можно использовать без изменений.

{
  "parameters": [
    { "Name": "SlowPeriods",  "Optimize": true, "Min": "5",  "Max": "50", "Step": "5" },
    { "Name": "StopLossPips", "Optimize": true, "Min": "10", "Max": "60", "Step": "5" },
    { "Name": "MAType",       "Optimize": true, "Values": ["0", "1", "2"] },
    { "Name": "MySymbol",     "Optimize": true, "Values": ["EURUSD", "GBPUSD"] }
  ]
}

Правила для полей

  • Поле Name обязательно. Его значение должно совпадать с именем свойства сиБота. Выполните ctrader-cli metadata <path-to-algo>, чтобы посмотреть доступные имена свойств. Если имя отсутствует в метаданных сиБота, это фиксируется в журнале, а параметр пропускается. Оптимизация остальных параметров продолжается.
  • Значение true поля Optimize включает параметр в перебор. Значение false оставляет его фиксированным.
  • Для перебора диапазонных параметров, например целых чисел или чисел с плавающей точкой, нужны поля Min, Max и Step.
  • Для перебора параметров с дискретными значениями, например перечислений или инструментов, нужен непустой массив Values.
  • Поле ParameterType необязательно. Если оно не указано, тип определяется по метаданным сиБота через сопоставление с Name.

Фиксация параметра на одном значении

Чтобы зафиксировать значение параметра, добавьте его в файл с Optimize: false и нужным Value:

{ "Name": "MAType",      "Value": "1", "Optimize": false },
{ "Name": "FastPeriods", "Value": "5", "Optimize": false }

Предупреждение

Приоритет имеет файл параметров. Перед применением файла cTrader CLI сбрасывает настройки всех параметров, поэтому перебираются только те из них, для которых явно указано Optimize: true. Параметр, полностью отсутствующий в файле, сохраняет значение по умолчанию, даже если в самом сиБоте для него по умолчанию включена оптимизация. Чтобы включить параметр в оптимизацию, добавьте его с Optimize: true.

Оптимизация основного таймфрейма

Помимо параметров сиБота, команда optimize позволяет перебирать основные таймфреймы. Основной таймфрейм можно задать двумя способами, причем --timeframe имеет приоритет.

  • --timeframe <tf> — одно значение фиксирует основной таймфрейм, а несколько значений через запятую позволяют перебирать таймфреймы.
  • Файл параметров — в файле, экспортированном из настольного приложения, уже содержится специальный синтетический параметр таймфрейма.

Базовый таймфрейм данных соответствует единственному указанному значению, фиксированному значению или наименьшему из перебираемых.

Совместимость таймфреймов и режимов данных

Все фиксированные и перебираемые основные таймфреймы должны быть совместимы с выбранным --data-mode.

Режим данных Допустимые основные таймфреймы
open Таймфреймы одного типа, кратные наименьшему выбранному таймфрейму без остатка.
m1 или m1-csv Любой таймфрейм, основанный на времени. Таймфреймы, не основанные на времени, например Renko и Range, не поддерживаются.
ticks Любой таймфрейм, кроме пользовательского.

Примечание

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

Критерии

Каждый элемент --criteria задает показатель эффективности и направление max или min, например NetProfit:max. В таблице ниже перечислены все поддерживаемые показатели и объясняется, что они измеряют.

Показатель Что измеряет
NetProfit Итоговая прибыль или убыток в валюте счета
ProfitFactor Валовая прибыль, деленная на валовый убыток
MaxEquityDrawdownPercentages Максимальная процентная просадка средств от пика до минимума
MaxBalanceDrawdownPercentages Максимальная процентная просадка баланса от пика до минимума
MaxEquityDrawdown Максимальное абсолютное снижение средств в валюте счета
MaxBalanceDrawdown Максимальное абсолютное снижение баланса в валюте счета
WinningTrades Количество закрытых сделок с прибылью
LosingTrades Количество закрытых сделок с убытком
TotalTrades Общее количество закрытых сделок
AverageTrade Чистая прибыль, деленная на количество закрытых сделок

Чтобы максимизировать чистую прибыль и одновременно минимизировать максимальную просадку средств:

--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min"

Если нужна собственная система оценки, используйте вместо этого --fitness. Метод сиБота GetFitness возвращает оценку, а оптимизация сохраняет проходы с наибольшими значениями. Параметры --fitness и --criteria несовместимы. Укажите только один из них.

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

Команда optimize использует те же параметры среды тестирования, что и backtest. В таблице ниже указаны параметры, которые поддерживает текущая версия CLI, их назначение и, где необходимо, различия между двумя командами.

Параметр Назначение Доступность
--account Номер торгового счета. Обе команды
--symbol Инструмент для тестирования. Обе команды
--start Дата и время начала периода тестирования. Обе команды
--end Дата и время окончания периода тестирования. Обе команды
--balance Начальный баланс при моделировании. Обе команды
--data-mode open, m1, m1-csv, tick-csv или ticks. Обе команды
--data-file Путь к CSV-файлу для m1-csv или tick-csv. Обе команды
--commission Размер комиссии за сделку. Обе команды
--spread Спред в пунктах (пипсах). Обе команды
--precise-conversion Использование точной конвертации между разными валютными парами. Обе команды
--timeframe Базовый таймфрейм для перебора параметров. Только optimize
--period Базовый таймфрейм для выполнения теста. Только backtest
--report Путь для сохранения отчета в HTML. Только backtest
--report-json Путь для сохранения отчета в JSON. Только backtest

Примечание

Параметры создания отчетов не действуют для optimize. Для сохранения результатов используйте --optres и --passes-dir.

Пример

ctrader-cli optimize "C:/test/Sample Trend cBot.algo" \
  --params=C:/test/optimize-params.json \
  --account=1234567 --symbol=EURUSD --timeframe=h1,h2 \
  --start="01/01/2025" --end="01/02/2025" \
  --balance=100000 --data-mode=open --commission=30 --spread=2 \
  --method=grid \
  --criteria="NetProfit:max,MaxEquityDrawdownPercentages:min" \
  --auto-select-best \
  --optres=C:/test/result.optres \
  --passes-dir=C:/test/result-passes \
  --ctid=letstrade --pwd-file=C:/test/password.pwd

Вывод

Во время работы optimize постоянно показывает ход выполнения в терминале:

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • Сводка — после завершения cTrader CLI выводит в терминале общее число проходов, затраченное время и результаты лучшего прохода со статистикой.
  • Файл результатов — при указании --optres cTrader CLI сохраняет все результаты оптимизации в JSON-файл .optres, содержащий сведения о каждом проходе. Формат этого файла совпадает с форматом результатов оптимизации в настольном приложении. Его можно открыть или импортировать через интерфейс оптимизации приложения.
  • Отчеты по проходам — при указании --passes-dir cTrader CLI сохраняет в этом каталоге отчеты по каждому проходу: для каждого создается отдельная папка с файлами .html, .txt, .json и .cbotset. Файл .cbotset содержит точные значения параметров, использованных в этом проходе.

Если не указаны ни --optres, ни --passes-dir, после завершения оптимизации выводится только сводка.

Примечание

Команда optimize не создает общий отчет в HTML. При этом HTML-файлы отдельных проходов сохраняются в --passes-dir, если этот параметр указан.

Проверка правильности оптимизации

После выполнения убедитесь, что перебирались именно те параметры, которые вы планировали.

  1. Откройте файл .cbotset одного из проходов в --passes-dir и убедитесь, что оптимизируемые параметры меняются между проходами, а фиксированные и пропущенные остаются неизменными.
  2. Если вы перебирали таймфреймы, проверьте значение Chart.Period в файле .cbotset каждого прохода. Оно должно соответствовать выбранным таймфреймам.
  3. Откройте файл .optres или импортируйте его в интерфейс оптимизации настольного приложения, чтобы проверить настройки и результаты всех проходов вместе.

Проверка параметров и распространенные ошибки

В каждой строке таблицы ниже указаны признак ошибки, вероятная причина, код завершения, который возвращает cTrader CLI, и рекомендуемые действия. При любой ошибке проверки параметров cTrader CLI возвращает ненулевой код завершения. Поэтому скрипт может остановиться при первой ошибке без анализа текста сообщения.

В таблице код завершения — это значение, которое cTrader CLI возвращает оболочке. Конкретные числовые коды не опубликованы. Поэтому non-zero обозначает сбой без отдельного опубликованного кода, а unknown — внутреннюю ошибку, при которой нужно сменить сборку или обратиться в поддержку.

Признак Вероятная причина Код завершения Что делать
Ошибка проверки: отсутствует --params Не указан JSON-файл параметров. non-zero Укажите --params=<path>.
Ошибка проверки: неизвестный таймфрейм Значение --timeframe не совпадает ни с одним известным идентификатором. non-zero Выполните ctrader-cli periods и используйте один из идентификаторов в списке.
Ошибка проверки: недопустимый основной таймфрейм Таймфрейм несовместим с выбранным --data-mode. non-zero Выберите другой таймфрейм или другое значение --data-mode.
Ошибка проверки: неверный формат пары критериев Неверно указано имя показателя либо направление не равно max или min. non-zero Используйте поддерживаемый показатель с max или min.
Ошибка проверки: неизвестный показатель критерия Имя, указанное в --criteria, отсутствует в списке поддерживаемых показателей. non-zero Выберите показатель из списка в разделе Criteria.
Ошибка проверки: неизвестное значение --method Значение --method не равно genetic или grid. non-zero Используйте --method=genetic (по умолчанию) или --method=grid.
Одновременно указаны --fitness и --criteria Эти параметры несовместимы. non-zero Укажите только --fitness или --criteria.
Команда optimize недоступна Используется внутренняя или облачная версия CLI. unknown Перейдите на локальную версию для пользователей.