Скрипты в торговых терминалах: архитектура, типовые задачи и руководство по установке
Содержание
- Что такое торговый скрипт: фундаментальные отличия
- 5 практических задач трейдера, которые закрывают микропрограммы
- Математика риск-менеджмента: алгоритмический расчет размера позиции
- Обзор платформ: поддерживаемые языки и архитектура
- Пошаговая установка и запуск скриптов в терминалах
- Развертывание в MetaTrader 4 / MetaTrader 5
- Настройка и запуск скрипта QLua в терминале QUIK
- Архитектурные риски и защита от сбоев
- Архитектурный каркас безопасного скрипта на QLua
- Поэтапный регламент внедрения алгоритма в торговлю
- Чек-лист проверки скрипта перед боевым запуском
- Вопросы и ответы (FAQ)
Что такое торговый скрипт: фундаментальные отличия
Скрипт в торговом терминале — это микропрограмма разового запуска, которая решает конкретную торговую или расчетную задачу за миллисекунды и сразу завершает выполнение.
Если индикатор пассивно рассчитывает и отображает показатели на графике, а торговый робот непрерывно сканирует поток котировок в бесконечном цикле, то скрипт активируется строго по требованию трейдера: рассчитывает допустимый рабочий объем, сбрасывает сетку ордеров или накладывает уровни стоп-приказов.
| Критерий | Торговый скрипт | Индикатор | Торговый советник (Робот) |
|---|---|---|---|
| Ключевое назначение | Однократное выполнение прикладной рутинной манипуляции | Расчет и графическое отображение производных данных | Полностью автономный торговый цикл по заложенному алгоритму |
| Жизненный цикл | Стартует, выполняет логику и выгружается из оперативной памяти | Активен непрерывно, пересчитывает формулы на каждом входящем тике | Работает постоянно, обрабатывая поток котировок и события сервера |
| Торговые права | Отправляет разовые биржевые транзакции и снимает заявки | Не имеет прямого доступа к отправке торговых приказов на биржу | Обладает полным доступом к открытию, модификации и закрытию ордеров |
| Механизм активации | Команда пользователя: перетаскивание на чарт или нажатие хоткея | Размещение на рабочей области конкретного графика котировок | Включение глобальной кнопки автоматической торговли в терминале |
5 практических задач трейдера, которые закрывают микропрограммы
Ручной ввод параметров через стандартное диалоговое окно занимает от 2 до 5 секунд, тогда как скомпилированный алгоритм направляет команду в торговый шлюз за 5–15 миллисекунд.
- Аварийная ликвидация (Panic Close): мгновенно отправляет пакетные транзакции на встречное закрытие всех открытых позиций и удаление отложенных заявок по всем инструментам при внезапных новостях.
- Калькуляция объема входа по лимиту риска: считывает текущий депозит, оценивает дистанцию до стоп-лосса и вычисляет разрешенный размер позиции, защищая счет от случайного завышения плеча.
- Связки взаимной отмены (OCO — One-Cancels-the-Other): одновременно выставляет стоп-лосс и тейк-профит, отслеживая их состояние и снимая второй ордер при срабатывании первого.
- Сопровождение открытой сделки и безубыток: автоматически переносит уровень фиксации риска на точку входа, как только цена проходит заданное число пунктов прибыли.
- Пакетная очистка чарта: удаляет отработанные графические метки, горизонтальные уровни, фибо-сетки и текстовые объекты без сброса настроек индикаторов.
В зависимости от рыночной ситуации скрипты оперируют рыночными (Market) или лимитными (Limit) приказами. Для экстренной ликвидации позиций используются маркет-ордера, а плановый набор объема осуществляется лимитными заявками для защиты от расширения спреда.
Математика риск-менеджмента: алгоритмический расчет размера позиции
Ошибки ручного расчета рабочего объема приводят к неконтролируемым просадкам при высокой волатильности. Торговый скрипт определяет размер входа по жесткой математической зависимости:
Размер позиции лоты = (Депозит × Риск % / 100) / (|Цена входа - Цена Stop Loss| × Стоимость шага цены × Размер лота)
Пример расчета для акций на Московской бирже (MOEX)
- Депозит: 100 000 руб.
- Допустимый риск на сделку: 1% (1 000 руб.)
- Точка входа: 250 руб., Stop Loss: 245 руб. (удельный ценовой риск = 5 руб. на акцию).
- Спецификация инструмента: 1 лот = 10 акций (стоимость шага = 1 руб.).
- Расчет: 100 000 × 0,01 / (|250 - 245| × 1 × 10) = 1 000 / 50 = 20 лотов (суммарно 200 акций)
ЕСЛИ пользователь кликнул по уровню входа (250) и уровню стопа (245)
ТО Вычислить ценовую дистанцию риска: 250 - 245 = 5 рублей
Вычислить допустимый денежный риск: 100 000 * 0.01 = 1 000 рублей
Рассчитать итоговый объем: 1 000 / (5 * 10) = 20 лотов
Отправить в брокерский шлюз транзакцию на 20 лотов со Stop Loss = 245
Ремарка по управлению рисками: при получении дробного значения объема (например, 14.6 лота) надежный скрипт всегда выполняет округление строго в меньшую сторону (до 14 лотов). Округление вверх по стандартным математическим правилам неизбежно приведет к превышению заложенного риск-профиля при срабатывании стоп-приказа.
Обзор платформ: поддерживаемые языки и архитектура
Выбор терминала определяет стек доступных технологий и типы биржевых активов.
| Платформа | Язык / Архитектура | Сегмент рынка | Сильные стороны | Барьеры для трейдера |
|---|---|---|---|---|
| MetaTrader 4 / 5 | MQL4 / MQL5 (компилируемый C-подобный) | Форекс, CFD, сырьевые контракты | Встроенная среда разработки MetaEditor, расширенный тестер, магазин решений | Закрытая экосистема, сложная интеграция со спот-рынком акций РФ |
| QUIK (ARQA Technologies) | QLua (Lua 5.3) / QuikPy | Акции, облигации, фьючерсы MOEX | Прямое подключение ко всем российским брокерам, нативная работа со стаканом Level 2 | Однопоточный UI, отсутствие встроенного бэктестера, строгие требования к кодировкам |
| TradingView | Pine Script (облачный декларативный) | Криптовалюты, акции США, мировые индексы | Работа в облаке, компактный синтаксис, наглядный бэктест на графике | Для прямой отправки сделок требуются сторонние вебхуки (Webhooks) |
| TSLab | Визуальные блок-схемы / C# | Алготрейдинг, фьючерсные и опционные сетки | Проектирование без кода, детальный модуль риск-менеджмента | Платная лицензия, повышенные требования к ресурсам ПК |
Пошаговая установка и запуск скриптов в терминалах
Развертывание в MetaTrader 4 / MetaTrader 5
- Переход к системным файлам: откройте в меню терминала раздел «Файл» и выберите «Открыть каталог данных».
- Копирование кода: перейдите в папку /MQL4/Scripts (для MT5 — /MQL5/Scripts) и поместите туда файл с расширением .mq4/.mq5 либо скомпилированный .ex4/.ex5.
- Обновление реестра: в окне «Навигатор» (Ctrl + N) нажмите правой кнопкой мыши на ветку «Скрипты» и кликните «Обновить».
- Запуск: перетащите скрипт левой кнопкой мыши из списка «Навигатора» на график нужного торгового инструмента.
- Привязка горячих клавиш: кликните правой кнопкой мыши по названию программы в окне «Навигатор», выберите пункт «Назначить горячую клавишу» и задайте комбинацию (например, Alt + C для команды экстренного закрытия).
Настройка и запуск скрипта QLua в терминале QUIK
- Подготовка каталога: в корневой директории QUIK (где расположен файл info.exe) создайте папку LuaScripts и сохраните в нее рабочий файл .lua.
- Вызов менеджера: в верхнем меню перейдите по цепочке «Сервисы» → «Lua скрипты...».
- Добавление программы: нажмите кнопку «Добавить», выберите файл в папке LuaScripts и подтвердите действие.
- Инициализация: выделите появившуюся строку в списке и нажмите кнопку «Запустить».
- Проверка статуса: индикатор состояния слева от имени скрипта должен смениться на активный зеленый значок.
Архитектурные риски и защита от сбоев
Ошибки в коде способны заблокировать работу терминала или привести к финансовым потерям при сетевых разрывах.
| Внештатная ситуация / Ошибка | Что происходит под капотом | Последствия для счета и терминала | Инженерное решение |
|---|---|---|---|
| Отсутствие паузы sleep() в цикле | Однопоточный графический интерфейс QUIK нагружает процессорное ядро на 100% | Терминал намертво зависает, блокируя ручную отмену заявок | Вызов функции sleep(20) или sleep(100) внутри каждой итерации цикла |
| Неверная кодировка (UTF-8) | Интерпретатор ожидает однобайтовую кодировку Windows-1251 | Кириллический текст в системном окне message() превращается в нечитаемые символы | Принудительная конвертация файла через Notepad++ в формат ANSI / Windows-1251 |
| Исполнение при обрыве связи | Скрипт шлет ордера при неактивном подключении к брокерскому серверу | Накопление очереди транзакций и их хаотичный сброс на биржу при реконнекте | Проверка системного флага isConnected() == 1 перед каждым вызовом sendTransaction() |
| Рыночный ордер на утреннем гэпе | Заявка забирает встречные объемы в разреженном стакане | Проскальзывание (Slippage), многократно превышающее расчетный стоп-лосс | Использование лимитных заявок (Type="L") или предварительный парсинг стакана Level 2 |
| Отправка пачки ордеров без ожидания | Скрипт циклично генерирует новые приказы до подтверждения предыдущих сервером | Задвоение или затроение набранной торговой позиции | Асинхронная фиксация статуса заявки через колбэк-функцию OnTransReply() |
Архитектурный каркас безопасного скрипта на QLua
Структура надежного скрипта делится на три изолированных этапа: инициализацию начальных параметров (OnInit), выполнение рабочего тела программы (main) и перехват сигнала на безопасную выгрузку (OnStop).
-- Инициализация глобального флага жизнедеятельности процесса
local is_run = true
function OnInit(script_path)
-- Этап 1: Проверяем наличие связи с брокерским сервером
if isConnected() ~= 1 then
message("Внимание: соединение с сервером брокера отсутствует!", 3)
else
message("Скрипт успешно запущен и готов к работе.", 1)
end
end
function main()
-- Этап 2: Исполнение контролируемого цикла
while is_run do
-- Изоляция: отправка транзакций только при активном шлюзе
if isConnected() == 1 then
-- Место для целевой логики: расчет объема, проверка условий
end
-- Разгрузка UI-потока: обязательная пауза в 50 миллисекунд
sleep(50)
end
end
function OnStop(stop_flag)
-- Этап 3: Корректная остановка и освобождение памяти
is_run = false
message("Скрипт остановлен пользователем. Память очищена.", 2)
return 1
end
Поэтапный регламент внедрения алгоритма в торговлю
- Локальная изоляция: запустите алгоритм в режиме отладочного вывода через функцию message() без реальной отправки ордеров, чтобы проверить математическую точность расчета переменных.
- Валидация на демо-счете: разверните программу на учебном сервере брокера; проведите от 15 тестовых операций в условиях реальных тиковых скачков и сетевых задержек.
- Боевой деплой: перенесите файл в рабочий терминал реального счета; выполните контрольный запуск минимальным объемом (1 лот) и проверьте срабатывание назначенной горячей клавиши.
Чек-лист проверки скрипта перед боевым запуском
- [ ] Кодировка документа: файл сохранен в кодировке ANSI / Windows-1251 (для QUIK).
- [ ] Защита графического интерфейса: внутри каждого рабочего цикла прописана задержка sleep() не менее 20 мс.
- [ ] Валидация соединения: блок вызова sendTransaction() экранирован системной проверкой isConnected() == 1.
- [ ] Безопасная выгрузка: функция OnStop() гарантированно переводит рабочий флаг в значение false.
- [ ] Калибровка расчета объема: формула протестирована на сценариях со сверхкороткими и широкими стоп-лоссами.
- [ ] Тестовый прогон: скрипт отработал не менее 10 циклов без сбоев на демонстрационном счете.
- [ ] Назначение горячей клавиши: комбинация хоткея исключает случайное нажатие при вводе текста.
ЕСЛИ Терминал зависает сразу после старта → ТО Завершите процесс в диспетчере задач и добавьте sleep() в цикл
ЕСЛИ В окне сообщений появляются нечитаемые символы → ТО Перекодируйте файл в ANSI через Notepad++
ЕСЛИ Брокер отклоняет транзакцию → ТО Проверьте заполнение полей ACCOUNT и CLIENT_CODE в структуре ордера
Вопросы и ответы (FAQ)
Можно ли запускать скрипты на смартфонах и планшетах?
Мобильные клиенты MetaTrader и QUIK не поддерживают запуск пользовательских микропрограмм из-за ограничений мобильных ОС. Для удаленного управления торговые алгоритмы разворачивают на виртуальном сервере (VPS), передавая команды через Telegram-ботов или внешние вебхуки.
Чем отличаются скрипты на QLua от внешних скриптов на Python для QUIK?
QLua исполняется внутри процесса терминала, обеспечивая минимальные задержки при обработке стакана котировок. Python подключается извне через вспомогательные библиотеки (QuikPy, сокеты, IPC), что дает доступ к машинному обучению, но создает дополнительную сетевую задержку.
Нужен ли выделенный VPS-сервер для работы скрипта?
Для скриптов разового действия (расчет риска, закрытие всех позиций, очистка разметки) сервер не требуется — они исполняются на локальном ПК. VPS с аптаймом 99.9% необходим для скриптов с непрерывными циклами трейлинг-стопа или сетками отложенных ордеров.
Разрешен ли запуск нескольких скриптов одновременно?
В MetaTrader на одном графике одновременно может выполняться только одна программа (новый запуск выгружает предыдущий). В терминале QUIK допускается параллельное выполнение десятков независимых скриптов QLua.
Как принудительно остановить зависший скрипт?
В MetaTrader нажмите правой кнопкой мыши по графику и выберите «Удалить скрипт». В терминале QUIK откройте меню «Сервисы → Lua скрипты...», выделите проблемную строку в таблице и нажмите кнопку «Остановить».
