Оптимизация сиБота¶
Команда 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 выводит в терминале общее число проходов, затраченное время и результаты лучшего прохода со статистикой.
- Файл результатов — при указании
--optrescTrader CLI сохраняет все результаты оптимизации в JSON-файл.optres, содержащий сведения о каждом проходе. Формат этого файла совпадает с форматом результатов оптимизации в настольном приложении. Его можно открыть или импортировать через интерфейс оптимизации приложения. - Отчеты по проходам — при указании
--passes-dircTrader CLI сохраняет в этом каталоге отчеты по каждому проходу: для каждого создается отдельная папка с файлами.html,.txt,.jsonи.cbotset. Файл.cbotsetсодержит точные значения параметров, использованных в этом проходе.
Если не указаны ни --optres, ни --passes-dir, после завершения оптимизации выводится только сводка.
Примечание
Команда optimize не создает общий отчет в HTML. При этом HTML-файлы отдельных проходов сохраняются в --passes-dir, если этот параметр указан.
Проверка правильности оптимизации ¶
После выполнения убедитесь, что перебирались именно те параметры, которые вы планировали.
- Откройте файл
.cbotsetодного из проходов в--passes-dirи убедитесь, что оптимизируемые параметры меняются между проходами, а фиксированные и пропущенные остаются неизменными. - Если вы перебирали таймфреймы, проверьте значение
Chart.Periodв файле.cbotsetкаждого прохода. Оно должно соответствовать выбранным таймфреймам. - Откройте файл
.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 | Перейдите на локальную версию для пользователей. |