# Настройки и конфигурация [Документация](README.md) · [Установка](installation.md) · [Эксплуатация](maintenance.md) ## Выбор файла `python run.py --config-file config.local.json` выбирает файл настроек менеджера. Без аргумента используется `config.json` из рабочего каталога. Параметры запуска сети: `--host` (по умолчанию `0.0.0.0`) и `--port` (8000). Менеджер читает JSON при запуске. Изменения через веб-интерфейс сохраняются атомарной заменой файла и сразу применяются к конфигурации в памяти. Изменения JSON вручную требуют перезапуска менеджера. Не редактируйте файл одновременно с сохранением через интерфейс. Начальный документ без счетов находится в [config.example.json](../config.example.json). При подготовке личного файла замените `USERNAME` в `database` на путь текущего пользователя, как показано в [быстром старте](../README.md). ## Общие параметры JSON | Поле | Обязательность / значение по умолчанию | Назначение | |---|---|---| | `terminals` | Обязательное; для начала `{}` | Словарь управляемых экземпляров | | `mt5_folder` | Обязательное | Базовая папка всех существующих и новых экземпляров | | `mt5_exe` | Обязательное; указывайте `terminal64.exe` | Имя исполняемого файла; создание поддерживает именно это имя | | `database` | Обязательное | Полный путь к общей SQLite в `Common/Files` пользователя Windows | | `terminal_template` | `terminal-template` | Папка-образец для загружаемых файлов | | `mt5_installation` | Пустая строка | Установка MT5, из которой берутся недостающие файлы и MetaEditor | | `service_ex5` | Пустая строка | Явный путь к готовому сервису, если нужен | | `startup_timeout_sec` | 180 | Ожидание состояния на каждом этапе запуска, от 10 до 900 секунд | | `disk_warning_mb` | 1024 | Минимальный желаемый запас после копирования, в МиБ; допускается 0 | Относительные пути разрешаются от папки выбранного JSON, а не от папки скрипта. При сохранении менеджер записывает разрешённые пути. Переменные окружения внутри строк JSON, например `%APPDATA%`, не раскрываются: подставляйте готовый путь. На странице «Настройки» меняются папки, `service_ex5`, время ожидания и порог свободного места. `database` и `mt5_exe` задаются в JSON. Веб-интерфейс не переносит базу или папки терминалов. После изменения `mt5_folder` все экземпляры ищутся относительно нового значения. ## Порядок выбора файлов Для каждого из `terminal64.exe`, `MetaEditor64.exe` и `config/servers.dat` сначала проверяется соответствующий файл в `terminal_template`. Если его нет, используется файл из `mt5_installation`. Если установка явно не задана, она определяется автоматически только при расположении проекта в `MQL5/Shared Projects`. Для отдельно клонированного проекта укажите `mt5_installation` либо загрузите нужные файлы через интерфейс. Произвольные родительские папки не просматриваются. Таким образом, загрузка одного файла не требует загружать остальные заново. Сервис выбирается в таком порядке: 1. Непустой `service_ex5`: используем этот путь. Ошибка пути не переключает поиск на другой EX5. 2. `ServiceStateWriter.ex5` в `terminal_template`, если он существует. 3. Сборка из исходника текущего проекта через MetaEditor: сначала из `terminal_template`, затем из выбранной или автоматически определённой установки. Уже существующий EX5 не компилируется повторно, если его время изменения не меньше времени изменения `ServiceStateWriter.mq5`. Проверка свежести сравнивает MQ5 и EX5; это не полная проверка зависимостей сборки. Готовый загруженный сервис и явно заданный EX5 не перекомпилируются. При отдельном размещении проекта результат сборки находится рядом с исходником: `ServiceStateWriter.ex5` исключён из Git. Для проекта в `MQL5/Shared Projects` MetaEditor переносит результат в соответствующую подпапку `MQL5/Services`. В обоих случаях при развёртывании сервис копируется в экземпляры по прежнему пути `MQL5/Services/Shared Projects/mt5-manager/ServiceStateWriter.ex5`. На странице настроек показываются сведения о найденных файлах, в том числе из установки MT5; наличие файла в списке не обязательно означает его загрузку. Загрузка заменяет файл-образец для будущих экземпляров. Работающие терминалы при этом не получают новый EXE, `servers.dat` или сервис. Импорт `servers.dat` не объединяет каталоги брокеров: загружается целый файл. ## Запись экземпляра Ключ `terminals` — имя папки, по которому сервис регистрируется в SQLite: ```json { "MetaTrader5.5": { "name": "Демо-терминал", "login": "", "server": "", "password": "" } } ``` Это фрагмент содержимого `terminals`, а не полная конфигурация. При создании имя предлагается автоматически, но его можно изменить. Для новых имён проверяется допустимость одного компонента пути Windows и отсутствие занятого имени без учёта регистра. Имена папок разных экземпляров должны быть уникальны, поскольку база использует имя папки как ключ. Имя экземпляра — один компонент пути Windows, без вложенных каталогов. `name` — отображаемое название; оно не переименовывает папку. Расположение всегда вычисляется как `mt5_folder / имя экземпляра`. Поле `path` из старых конфигураций игнорируется и удаляется при следующем сохранении. Само чтение конфигурации не переписывает файл. После изменения базовой папки поиск процессов, запуск и распространение сервиса сразу используют новые пути. Менеджер не переносит файлы и не останавливает процессы в прежнем каталоге. Если новой папки ещё нет или она указана неверно, экземпляр не будет найден, пока вы не исправите базу или не разместите терминал по нужному пути. Несколько терминалов могут использовать один торговый счёт. ## Реквизиты счёта Пустые `login`, `server` и `password` означают использование сохранённых настроек самого терминала. Если их у терминала нет, он запускается без подключения. Для нового экземпляра с заданным счётом нужен полный набор из трёх значений. Номер счёта должен быть положительным целым; его можно передать числом или строкой. В интерфейсе пустое поле пароля сохраняет прежний пароль менеджера. Флажок «Убрать реквизиты из менеджера» очищает три поля менеджера, но не сохранённый счёт внутри терминала. После применения терминал использует собственные настройки. Старые записи с логином и сервером без пароля допустимы, если терминал уже умеет подключаться к этому счёту; при необходимости перенастройки потребуется пароль. Пароль хранится в JSON открытым текстом. API не выдаёт его обратно: возвращается `password_set`. Параметры первого входа передаются временным INI в UTF-16, который удаляется после настройки. В `config/common.ini` менеджер сохраняет `Login`, `Server` и `KeepPrivate=1` для последующего обычного запуска. ## База и параметры MQL5-сервиса Python читает `database`, а сервис открывает `InpDatabase` с флагом `DATABASE_OPEN_COMMON`. Они должны указывать на один файл в `%APPDATA%/MetaQuotes/Terminal/Common/Files` одного пользователя Windows. Менеджер открывает базу только для чтения и не создаёт файл при ошибке пути. Сервис при открытии создаёт отсутствующий файл и таблицы `terminals` и `states`, в том числе когда файл SQLite уже существует, но пуст. Ошибки создания таблиц попадают в журнал сервиса, после чего открытие повторяется на следующей итерации. Полный путь базы выводится при запуске сервиса и в сообщениях об ошибках чтения Python. При создании экземпляра менеджер берёт только имя файла из `database` и подставляет его в `services.ini`. Размещение Python-базы в другой папке приведёт к расхождению. | Параметр сервиса | Значение в образце | Назначение | |---|---|---| | `InpDatabase` | `mt5-manager.sqlite` | Имя базы внутри `Common/Files` | | `InpIntervalSec` | 2 | Основной интервал записи в секундах | | `InpJitterMs` | 1000 | Случайная добавка к паузе в миллисекундах | | `InpBusyTimeout` | 3000 | Ожидание блокировки SQLite в миллисекундах | Последнее состояние хранится с Unix-временем в секундах. Миллисекунды в параметрах паузы и ожидания SQLite остаются единицами этих параметров. Для уже установленных копий команда «Собрать и разложить сервис» проверяет запись ServiceStateWriter в `config/services.ini` и восстанавливает её автозапуск. При необходимости изменения конфигурации сначала остановите терминал. Остальные сервисы и заданные интервалы сохраняются.