Создание и использование Скиллов для создания артефактов MQL
Что такое Скиллы и что они могут дать разработчику
Вероятно, сейчас уже не осталось ни одного человека, который бы ничего не знал о нейросетях. И вероятно, не осталось ни одного разработчика, который бы ничего не слышал о Скиллах — наборах инструкций, с помощью которых AI Assistants выполняют специализированные задачи по заданным схемам.
В этой статье мы поговорим о том, как концепция Cкиллов работает внутри MetaTrader 5. В билде 6060 платформа получила встроенный AI Assistant (далее — Ассистент) с нативной поддержкой Model Context Protocol (далее — МСП) и агентного ИИ. Это значит, что ассистент — тот самый, что открывается по кнопке на панели инструментов терминала и в MetaEditor, — умеет не просто вести диалог, а выполнять действия в среде: читать и создавать файлы, работать с шаблонами, подготавливать артефакты MQL5, обращаться к рыночным данным и торговому окружению — в рамках настроенных вами разрешений.
Skill (далее — Скилл) — это осмысленная компетенция AI Assistant, обогащённая специализированными знаниями и оформленная как повторяемый, оцениваемый блок поведения. Такую компетенцию Ассистент может вызвать для выполнения конкретной задачи.
Ассистент хорошо пишет код, но без внешнего контекста и инструментов его работа остаётся «одноразовой». Результат приходится вручную сохранять в файл, проверять, форматировать и дополнять. Каждый новый артефакт — это заново пройденный путь: вставить шаблон, вспомнить обязательные поля, проверить параметры, соблюсти стиль, не забыть про иконку и директивы. Добавление Скилла задаёт повторяемые правила, а МСП даёт Ассистенту доступ к файловой системе, шаблонам и операциям над проектом. В полной связке это превращает Ассистента в инженерный инструмент подготовки MQL-артефактов. Что конкретно это даёт разработчику:
Зачем это разработчику- Воспроизводимость. Одна и та же задача выполняется по одним и тем же правилам, независимо от того, кто и когда её ставит.
- Единый стиль. Все артефакты получаются в одном формате: одинаковые шапки, директивы, соглашения об именах, структура кода.
- Контроль. Скилл проверяет техническое задание и не позволяет создать артефакт с ошибками.
- Доступ к среде. Через МСП Ассистент реально работает с файлами: читает шаблоны, копирует их, создаёт каталоги, сохраняет результат.
- Снижение рутины. Разработчик формулирует задачу, а не занимается механическим переносом текста в файлы и проверкой формата.
Каждый Скилл обладает важными свойствами:
- Целью: чего он должен достичь.
- Условиями: когда требуется его применение.
- Постусловиями: как изменится состояние после применения Скилла.
- Границами: где Скилл работает хорошо, а где от его применения следует отказаться.
Если говорить проще, Скилл — это набор инструкций, которые учат Ассистента выполнять задачи по заданным схемам. Физически Скилл — это файл с именем SKILL.md: заголовок в формате YAML с именем и описанием (плюс опциональные метаданные — автор, версия, используемые инструменты) и текст инструкций в формате Markdown.
Ассистент MetaTrader 5 умеет работать с такими инструкциями, а МСП делает их исполняемыми, что позволяет Ассистенту реально создавать артефакты MQL5.
Роли компонентов: Ассистент, Скилл, МСПДля понимания процесса генерации артефактов важно явно развести три роли упомянутых компонентов:
- Ассистент — оркестратор. Принимает задачу от пользователя, ведёт диалог, уточняет недостающие параметры, решает, какой Скилл применить, и контролирует последовательность действий.
- Скилл — правила. Задаёт, когда применяется / не применяется компетенция, что проверять в техническом задании, что делать при ошибках и т.д.
- МСП — исполнитель действий во внешней среде. Читает и копирует файлы, создаёт папки, сохраняет итоговый файл .mq5, может запускать проверки и компиляцию, обращаться к данным терминала.
Без Скилла Ассистент действует "как получится"; без МСП Ассистент не сможет выйти за пределы чата; без Ассистента Скилл - просто текстовый файл. Только вместе все три образуют управляемый процесс создания артефакта.
В контексте MetaTrader 5 это особенно эффективно: Скилл руководит, Ассистент принимает решения, МСП выполняет операции в реальной среде разработчика.
Поток выполненияСоберём сказанное в единую последовательность. Вот как выглядит работа связки всех трех компонентов при генерации:
- Пользователь пишет техническое задание во встроенном Ассистенте.
- Ассистент определяет, подходит ли для работы компетенция Скилла.
- Ассистент читает правила, которые хранит Скилл.
- Ассистент выполняет правила, используя МСП при необходимости.
- МСП сохраняет итоговый файл .mq5 и сопутствующие файлы.
- Ассистент выдаёт пользователю отчёт о созданных файлах и сделанных допущениях.
Начнем создавать Скилл
Какую задачу мы станем решать? Нам нужна единичная конкретная цель, повторяемый блок поведения. Может быть сеточный советник? Или сложный индикатор? Нет! Скилл плохо подходит для генерации полностью готового артефакта с уникальной бизнес-логикой, но хорошо подходит для создания повторяемого каркаса, шаблонов и проверяемых шагов подготовки проекта. По сути, это то, что делает стандартный мастер редактора MetaTrader. Тогда зачем нужен Скилл, если стандартный мастер вполне справляется с работой?
Мы можем дополнить стандартный мастер: добавить собственный стиль, комментарии, секции кода, директивы #define и другие элементы. Нужно быть готовым к тому, что решение такой задачи будет весьма объемным. Например, файлы Скилла для создания индикаторов, которым пользуюсь я, занимают почти 5400 строк текста и "весят" 480 Кбайт. Поэтому мы наметим более легкую цель. Решение, которое будет получено, любой желающий сможет легко масштабировать, дополнить и изменить под свои цели.
Мы займемся очень простым, на первый взгляд, делом. Напишем Скилл для создания одного типа артефактов: скриптов. Вот такого крохотного блока кода, который делает стандартный мастер:
//+------------------------------------------------------------------+ //| etalon.mq5 | //| Copyright 2026, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs //--- input parameters input int Input1 = 1; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- } //+------------------------------------------------------------------+
но со своими дополнениями.
В дальнейшем будет приведено множество Prompts (далее просто промпт). Часто промпты нуждаются в отладке, видоизменяются в процессе работы с целью получить нужный результат. Этот процесс (он может быть длительным) здесь воспроизведен не будет.
Скиллы предназначены для чтения и исполнения Ассистентом, но должны оставаться понятными человеку, который их проектирует и поддерживает. Поэтому вполне оправданным и логичным с нашей стороны будет использовать Ассистента MetaTrader для помощи в написании, но не только его. Пусть ему помогают и другие нейросети. Это послужит унификации, не будем забывать, что Скиллы не должны быть зависимы от конкретного вендора.
В процессе работы мы будем обязательно контролировать формат файла, о котором писали выше. Пишем первичный промпт и отдаем его для генерации:
Напиши файл скилла для работы в терминале MetaTrader на языке mql5. Имя скилла: MQL-TUTOR. Рабочая папка: .\MQL5\Files\SKILLS\MQL-TUTOR\ Описание: Создание обычных/стандартных MQL скриптов. Все файлы создавай на английском. Помни, что в mql есть три вида артефактов: индикаторы, советник, скрипты. Наш скилл предназначен для создания только одного вида артефактов: скриптов.
Ждем и получаем длинный файл, сохраненный в доступную папку в "песочнице". Посмотрим на начало файла:
--- name: MQL-TUTOR description: | Tutorial skill for writing MQL5 Scripts in MetaTrader 5. Use when the user asks to write, explain, or modify a single-run `.mq5` script (executed once via `OnStart()`). Walks a learner from a "Hello, MQL5" print to a script that places / modifies / closes trades and logs to a file. Do NOT use this skill for Expert Advisors (EA), Indicators, Libraries, Services, Pine Script, NinjaScript, or MQL4 — this skill covers scripts only. ---
Название — правильное. А вот поле description (описание) слишком длинное и неверное. Исправим его вручную: description: Creating standard/regular MQL scripts.
Это важный момент, по полю "Описание" Ассистент определяет, нужно ли ему использовать данный Скилл для текущей работы. Дополнительно, мы еще попросим модель добавить некую информацию в заголовок, но можем сделать это самостоятельно, вручную. В результате в заголовке появятся необязательные поля и он приобретет следующий вид:
name: MQL-TUTOR description: Creating standard/regular MQL scripts metadata: author: FxStill version: "1.0" tools: - Read - WriteДобавилась информация об авторе, важное поле о номере версии и об используемых инструментах. Мы отредактировали описание и сможем отредактировать его снова, если Ассистент не сможет правильно пользоваться Скиллом. Кроме того, когда файл Скилла будет полностью готов, мы сможем отдать его на ревью другому Ассистенту, который не принимал участия в разработке. В конце работы мы обязательно это сделаем.
А сейчас давайте сформулируем, что именно требуется для успешной работы, что именно подать на вход для успешной генерации скрипта? Давайте перечислим:
- Название артефакта: Simple Script MQL5. Обязательный параметр, по нему Ассистент должен понять, что должен использовать инструкции Скилла.
- Имя скрипта. Это обязательный параметр, без него невозможно создать файл <Имя>.mq5.
- Короткое имя. Этого нет в стандартном шаблоне. Это наше первое дополнение, короткое имя удобно использовать, как префикс. И пусть это будет также обязательным параметром.
- Входные параметры необязательны. В случае их наличия, или отсутствия, стандартные шаблоны имеют несколько разный вид.
- Чем заполнять #property link, #property icon, #property description. Это необязательные свойства. Кроме того, заполнение этих свойств имеет смысл только в том случае, если есть входные параметры.
Для начала работы пользователь должен составить ТЗ. В нём должны быть обязательные параметры; при необходимости — необязательные. Затем отдать написанное Ассистенту в виде промпта. Ассистент читает задание и начинает выполнять инструкции Скилла. И первое, что он должен будет сделать, это проверить валидность технического задания. В первую очередь обязательных параметров. Если они отсутствуют или содержат ошибки, то Ассистент прекращает работу.
Кроме того, нам нужно обязательно понимать самим и указать модели:
- При каких условиях Скилл не должен использоваться — нужно перечислить такие ситуации.
- Что мы хотим получить в результате работы — файл .mq5 с кодом скрипта.
Создадим и отправим Ассистенту, пишущему файл Скилла, такой промпт:
Создай три вводных раздела: Goal, When to Use This Skill, When NOT to Use This Skill. Goal: - скилл генерирует простые автономные MQL5-скрипты. When to Use This Skill: единственное условие применения - промпт содержит тег Artifact: Simple Script MQL5. When NOT to Use This Skill: явно перечисли, что скилл НЕ применяется, если: тег Artifact: Simple Script MQL5 отсутствует — при этом запрети самому агенту делать вывод о применимости скилла по смыслу задачи, даже если она явно похожа на простой скрипт; в задаче просят индикатор или советник (EA);
Давайте сразу посмотрим, что изменилось в файле Скилла. В процессе работы нам нужно постоянно контролировать содержимое этого файла и при необходимости корректировать его вручную, или промптами. Если правки делаются вручную, то следует сообщить об этом Ассистенту, чтобы он не пытался отменить изменения. Итак, в файле для нас добавились секции:
## Goal Generate simple, standalone MQL5 **scripts** — one-time-execution programs implementing `OnStart()`. ## When to Use This Skill - The prompt contains the exact tag `Artifact: Simple Script MQL5` ## When NOT to Use This Skill - The prompt does not contain the exact tag `Artifact: Simple Script MQL5` — do not infer that this skill applies from the task description alone, even if it clearly sounds like a simple script - The task asks for an Indicator or an Expert Advisor
Это прямые инструкции Ассистенту — что нужно получить, когда использовать Скилл и когда этого делать не нужно.
Итак, Ассистент начинает проверять техническое задание. Поэтому нам следует добавить в Скилл правила проверки:
- Наличие поля Artifact и его значение: Simple Script MQL5.
- Наличие "длинного имени".
- Наличие "короткого" имени.
Это три обязательных поля, если их нет, то дальнейшая работа невозможна. Если нет первого, то данный Скилл нельзя использовать. И это правило уже имеется в секции ## When to Use This Skill. Если нет второго, или третьего, то нельзя создать файл скрипта. Далее в технических параметрах могут быть входные параметры. В этом случае в скрипте могут быть поля #property description и #property icon. Эти правила проверки технического описания необходимо добавить в файл Скилла вместе с правилами реагирования:
- Если обязательные поля содержат ошибки, или отсутствуют, то работа прекращается.
- Если проблемы с необязательными параметрами, то продолжается.
В обоих случаях нужно направить пользователю сообщения о случившемся.
Для того, чтобы логика сработала, надо сообщить набор этих правил Ассистенту. Он создаст нужные разделы в файле Скилла и поместит туда правила, о которых мы сейчас говорили. Пишем вот такой промпт и отдаем его Ассистенту:
Добавь в скилл раздел проверки технического задания со следующими правилами: Наличие поля Artifact и его значение Simple Script MQL5. Если поля нет - этот скилл нельзя применять. Наличие "длинного имени" - имени файла .mq5. Наличие "короткого имени" - внутреннего идентификатора, который используется внутри самого скрипта. Пункты 2 и 3 - обязательные поля. Без них нельзя создать файл скрипта. Также в техническом задании могут быть входные параметры, это необязательные поля. Если они есть, в скрипте могут присутствовать поля #property description, #property icon и #property copyright - но и они необязательные. Правило реагирования: если обязательные поля (длинное имя, короткое имя) отсутствуют или содержат ошибку - работа прекращается, агент сообщает пользователю, чего не хватает. Если проблема только с необязательными полями (copyright, icon, description) - работа продолжается, агент сообщает об этом отдельным замечанием, но не останавливается. Оформи эти правила как отдельный раздел скилла и сошлись на него там, где уже описаны обязательные и необязательные поля метаданных, чтобы не дублировать текст.
Смотрим, как изменился файл Скилла. У нас добавились разделы:
- Input Requirements (Task Prompt) - в каком месте будет создан скрипт, режим работы (создание нового скрипта / модификация созданного), обязательные / необязательные параметры.
- Technical Task Validation - как производить проверку и как реагировать.
- Workflow - последовательность выполнения всей задачи.
Обращает на себя внимание подраздел Working Directory в разделе Input Requirements. Это действительно важное дополнение и в промпте об этом не сказано ни слова. Здесь речь идет о том, где именно создавать скрипт:
### 2. Working Directory (Optional) The folder where the script file will be written. - If specified: use the provided path - If omitted: use the current working directory
Мало того, что Ассистент добавил эту важную информацию от себя, но он еще и добавил, какое значение данный параметр будет иметь по умолчанию. Случившееся еще раз говорит о необходимости все время контролировать содержимое файла скрипта. Отметим, что в том случае, когда для генерации будет использован встроенный Ассистент MetaTrader, данная инструкция не имеет смысла, этот Ассистент знает куда сохранить артефакт. Но мы стремимся к независимости от вендора, поэтому данное добавление важно и полезно. Но всегда ли Ассистент будет добавлять только полезные инструкции?
Продолжим проверять техническое описание. У нас указано, что в скрипте могут быть (или не быть) входные параметры. Если они есть, то нужно сказать Ассистенту, как должно выглядеть их описание, какой минимальной объем информации должно содержать. Нам такая информация известна. Минимально это тип переменной и её имя. Это два обязательных параметра. Максимально это два обязательных параметра, а также значение переменной по умолчанию и комментарий. Так как наличие входных параметров необязательно, то и ошибка в них не должна приводить к прекращению работы, а просто к сообщению пользователю и продолжению генерации. Пишем следующий промпт и отдаем его Ассистенту:
Добавь в скилл разделы с проверкой входных параметров. Минимум там должны быть тип и имя параметра. Максимум тип, имя, значение по умолчанию и комментарий. Если находим ошибку, то параметр не добавляем и сообщаем пользователю. Сводка по правилам: обязательно: тип + имя; максимум: тип, имя, значение по умолчанию, комментарий; типы struct/class/union — отклоняются всегда, без исключений; любой другой тип валиден, только если это стандартный тип MQL5, либо enum, описанный в ТЗ (Create/Edit) или уже объявленный в скрипте (только Edit); при ошибке — параметр не добавляется, пользователю сообщается, задача продолжает выполнение.
Смотрим в файл Скилла. В нем добавился большой подраздел Input Parameters (Optional) в разделе Input Requirements (Task Prompt). Агент и в этот раз добавил полезную информацию, которую мы ему не давали в промпте:
If provided, valid parameters replace/extend the `Input1` placeholder in the etalon template. Formatting/naming conventions to follow are TBD until the skill's own style file is created.
Для точности генерации и уменьшения вероятности появления неоднозначности инструкций, добавим в Скилл несколько примеров. Это полезное средство подсказки правильного создания того, или иного фрагмента кода. Это обязательно стоит делать, несмотря на то, что Ассистент имеет доступ к технической документации MQL:
Добавь в раздел про валидацию входных параметров 5. Input Parameters (Optional) примеры использования. input string InpLoadedSymbol = "NZDUSD"; // Symbol to be load input ENUM_TIMEFRAMES InpLoadedPeriod = PERIOD_H1; // Period to be loaded input datetime InpStartDate = D'2006.01.01'; // Start date - Это примеры входных параметров с максимальным объемом информации о входных параметрах. input bool show_F; input int FontSize; - Это примеры с минимальным объемом информации о входных параметрах
Смотрим в файл Скилла, на этот раз Ассистент ничего не добавил от себя, но добавил то, что просили в нужную секцию.
На этом мы закончили предварительные проверки и можем приступать к собственно генерации артефакта.
Пишем Скилл от простого к сложному
Посмотрим на файл Скилла в очередной раз, на то, как он был создан в самом начале работы. Ассистент написал обычный скрипт, в который осталось осталось добавить бизнес-логику, и он вставил его в середину файла Скилла в качестве примера генерации. Устраивает ли это нас? Нет! Первое - это сильно раздувает текст Скилла. Если файл длинный, Ассистенту в нем сложно ориентироваться, не стоит создавать файлы Скиллов длиннее 500 строк (см. раздел "Почему не стоит создавать Скиллы длиннее 500 строк" в конце статьи). Второе, Ассистент может и не использовать этот пример для генерации, по причине того, что это именно пример, а не образец. Третье. Ассистент в любом случае будет тратить токены на работу с этим кодом. Из этого делаем вывод, что необходимости помещать код скрипта целиком в файл Скилла нет.
Попросим редактор MQL создать два пустых скрипта: один без входных параметров и один с входным параметром. Используем их как образцы. Для начала создадим папку assets в папке MQL-TUTOR с файлом Скилла. Переместим файлы пустых скриптов в эту папку, заодно переименовав их: Скрипт без входных параметров назовем etalon_no_input.mq5, со входными параметрами etalon_with_input.mq5. В эту же папку скопируем файл —иконку tutor_script.ico. Немного изменим файлы скриптов:
- В каждый из них добавим строку: #define NAME "EWI". Будем иметь в виду, что в результате здесь будет "короткое имя скрипта".
- Изменим Copyright. Сейчас он выглядит так: Copyright 2026. Мы его изменим на: Copyright 2026 May, т.е. теперь он содержит месяц. Какой именно сейчас — неважно, но в результате здесь будет правильная дата.
Если техническое описание прошло проверку, то мы начинаем создание скрипта:
- Создаем, если это нужно, папку, в которую поместим скрипт.
- Скопируем в эту папку один из пустых скриптов, в зависимости от того, были ли в описании входные параметры, или нет.
- Отредактируем скрипт. Изменим его имя на заданное "длинное имя", заменим дату в Copyright, добавим #define и входные параметры. Если у нас есть входные параметры и задано значение #property icon, то копируем файл с иконкой в ту же папку.
Готовим серию промптов для копирования и редактирования шаблонов. В результате получается один большой промпт, учитывающий промежуточные правки:
# Задача: дополнить SKILL.md (MQL-TUTOR) логикой выбора/копирования шаблона и иконки Файл: `SKILL.md` скилла MQL-TUTOR. Нужно добавить/уточнить шаги рабочего процесса (Workflow), которые описывают, как скилл выбирает и копирует эталонный шаблон скрипта, а также иконку, и как их затем редактирует. ## Контекст В папке `assets/` лежат три файла: - `etalon_no_input.mq5` — эталонный шаблон скрипта **без** входных параметров - `etalon_with_input.mq5` — эталонный шаблон скрипта **с** входными параметрами (содержит один placeholder-параметр `input int Input1 = 1;` и строку `#property icon "tutor_script.ico"`) - `tutor_script.ico` — иконка, на которую ссылается `etalon_with_input.mq5` ## Что нужно описать в SKILL.md ### 1. Выбор и копирование шаблона - Выбор между `etalon_no_input.mq5` и `etalon_with_input.mq5` делается **по итоговому набору валидных входных параметров** (после прохождения валидации), а не по факту, что в промпте вообще присутствовал раздел Input Parameters. Если все перечисленные параметры не прошли валидацию и были пропущены — считать, что у скрипта нет параметров, и брать `etalon_no_input.mq5`. - Выбранный файл копируется в рабочую директорию (`Working Directory`) под именем `<Long Name>.mq5`. Эта копия — отправная точка для последующего редактирования. ### 2. Копирование иконки - Если выбран `etalon_with_input.mq5`, вместе с ним в рабочую директорию нужно скопировать и `assets/tutor_script.ico` (без изменений, под тем же именем файла) — иначе строка `#property icon "tutor_script.ico"` в сгенерированном скрипте будет ссылаться на несуществующий файл. - Если выбран `etalon_no_input.mq5` — иконка не копируется, она не нужна. ### 3. Редактирование скопированного файла После копирования шаблон редактируется на месте: - **Short Name** прописывается только в одном месте: `#define NAME "<Short Name>"`. Везде дальше по коду используется имя дефайна `NAME`, а не сама строка Short Name. - **Дата копирайта**: месяц и год в `#property copyright` и в строке шапки файла (комментарий) заменяются на текущую дату на момент генерации — независимо от того, какой placeholder-месяц/год был в шаблоне. - **`OnStart()`** остаётся пустым — на этом этапе никакая логика задачи внутрь не добавляется, только базовая структура шаблона. ## Формат результата Внести эти три пункта как отдельные/уточнённые шаги в раздел Workflow файла `SKILL.md`, в том же стиле изложения, что и остальные шаги (короткие пункты списком, ссылки на смежные разделы через `[Text](#anchor)` где уместно).
Смотрим на изменения в файле Скилла. В разделе Workflow у нас появилось четыре подраздела: Select and Copy the Template, Edit the Script, Save и Report. В них описан весь процесс генерации артефакта после прохождения предварительных проверок вплоть до итогового сообщения пользователю о результатах работы.
После этого заключительного шага Скилл готов к тестированию. Подведем некоторые итоги. Мы уложились почти в двести строк текста, что очень хорошо. Скилл состоит из четырех файлов и имеет такую структуру:
\SKILLS\MQL-TUTOR │ SKILL.md └───assets etalon_no_input.mq5 etalon_with_input.mq5 tutor_script.ico
Мы создали основу Скилла, используя различные Ассистенты. Работа заняла примерно 4 сессии, учет количества токенов не велся. Теперь, как и говорилось выше, мы передаем то, что у нас получилось на ревью. Для этого можно использовать любую, достаточно "умную" нейросеть, мы решили использовать Kimi, её мы в работе еще не использовали. К сожалению, у Kimi есть ограничение на тип присоединяемых файлов, поэтому свернуть все файлы Скилла в архив и отправить не получится. По той же причине не получится отправить и файлы .mq5. Поэтому всем файлам, которые нельзя отправить, добавляем расширение .txt, создаем еще один текстовый файл с иерархией (результат выполнения команды tree) и отправляем все вместе на изучение Kimi вместе с промптом:
Ты эксперт в MQL. сделай ревью на прикрепленный скилл. отметь положительные и отрицательные стороны, узкие места.
Получаем замечания, вносим изменения, отправляем снова. Результат:
Ограничение scope Скилл умеет только Create. Edit-режим объявлен out of scope — это сознательное решение, но читатель, захотевший отредактировать существующий скрипт, должен будет либо вручную править файл, либо использовать другой инструмент. Это приемлемо для первой части статьи; автор планирует расширить скилл во второй части.
Дадим несколько пояснений. Мы сознательно сосредоточились на режиме "Create", он лучше подходит к теме написания Скилла. Режим "Edit" более короткий и во многом опирается на режим "Create". Поэтому от режима "Edit" решили пока отказаться, чтобы не нагружать Скилл похожими инструкциями. После понимания работы и создания режима "Create" добавить режим "Edit" весьма простая задача.
Полный текст ревью на русском и английском языках будет прикреплен к статье. Теперь приступим к заключительному этапу — тестирование.
Генерация и тестирование скриптов
Основной сценарий тестирования — использование встроенного Ассистента MetaTrader. Чтобы проверить переносимость подхода, мы дополнительно запускали Скилл в других CLI-средах. Например, в CLI OpenCode мы кладем папку MQL-TUTOR в папку skills, которая находится в папке .opencode. Скилл становится доступен после перезапуска. Должна получиться вот такая структура:
.opencode
skills
MQL-TUTOR
SKILL.md
assets
etalon_no_input.mq5
etalon_with_input.mq5
tutor_script.ico
Это иллюстрация того, что формат Скиллов переносим между платформами. Встроенный же Ассистент остаётся основной точкой входа. Открываем окно Ассистента MetaTrader и пишем ему промпт:
Прочитай скилл в папке MQL-TUTOR и скажи, что понял.
Ассистент легко находит Скилл и отвечает:
Готово, я прочитал скилл MQL-TUTOR и его шаблоны. Вот что я понял: Что это за скилл MQL-TUTOR — скилл для генерации простых скриптов MQL5 (одноразовых программ с функцией OnStart()), созданный автором FxStill (версия 1.0). Ключевые правила 🚦 Жёсткий "гейт" активации Скилл применяется только если в запросе есть точный тег: ...Определяем рабочую папку
Не следует помещать результаты тестов в стандартные папки — Scripts, Experts и другие. Давайте выберем для этого папку с другим названием и предложим Ассистенту сохранять результаты генерации туда. Для этого создаем промпт:
Правило: рабочая папка — это подпапка базовой папки типа артефакта (MQL5\Scripts — скрипты, MQL5\Experts — советники, MQL5\Indicators — индикаторы и т.д.), поэтому голое имя папки в промпте (например MQL_TUTOR) всегда разрешается как MQL5\<БазоваяПапкаТипа>\MQL_TUTOR, а не от корня MQL5. Теперь в промпте мы можем указать рабочую папку. Мы используем название MQL_TUTOR и Ассистент будет сохранять скрипты в папку "MQL5\Scripts\MQL_TUTOR\".
Ассистент готов к использованию. Переходим к тестированию. Пишем короткое техническое описание: "создай скрипт mql5 с длинным именем script1.Рабочая папка MQL_TUTOR". Что мы ожидаем: Генерация невозможна, так как отсутствует "Короткое имя и тэг артефакта". Далее вывод:
Проверяю промпт по правилам скилла MQL-TUTOR: Результат проверки: ❌ Скилл не применяется — STOP Проверка Статус Тег Artifact: Simple Script MQL5 ❌ отсутствует Long Name (script1) ✅ есть Short Name ❌ отсутствует ...
Задача другого типа, со входными параметрами и более сложная: "создай скрипт с именем "second_script" с коротким именем SCR2 и с параметрами: str2, str1 - это обе строки, вторая = "I'm string" по дефолту, а к первой коммент: "1 comment" и еще параметр типа double dbl3 = 0.0 и последний параметр типа bad_type bad_name = 6. Рабочая папка MQL_TUTOR". Что ожидаем: Генерация невозможна, не задан тег Artifact. Вывод:
Результат: ❌ Скилл не применяется — STOP Проверка Статус Тег Artifact: Simple Script MQL5 ❌ отсутствует Long Name (second_script) ✅ есть Short Name (SCR2) ✅ есть
Добавим артефакт промптом:
К предыдущему тесту добавляю артефакт: Artifact: Simple Script MQL5
Теперь тест пройдет и Ассистент генерирует скрипт second_script.mq5 в правильной папке. Обратите внимание, это все еще задача "Create" по созданию нового артефакта:
//+------------------------------------------------------------------+ //| second_script.mq5 | //| Copyright 2026 August, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026 August, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #define NAME "SCR2" #property icon "tutor_script.ico" #property description "Tutor Script" #property script_show_inputs //--- input parameters input string InpStr2 = "I'm string"; input string InpStr1; // 1 comment input double InpDbl3 = 0.0; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- } //+------------------------------------------------------------------+
Генерация прошла верно. Месяц в шапке изменен на правильный, отфильтрован плохой параметр, правильно задано "короткое" имя. Интересно, что Ассистент сам принял решение о расположении комментария у параметра InpStr1. В техническом задании это было указано с некоторой неоднозначностью. Продолжаем тестирование. Отдадим Ассистенту такой промпт:
Добавь к скрипту логику. Выведи строку InpStr2, Затем добавь локальную переменную типа string locStr, присвой ей значение "local" и тоже выведи.
Вывод Ассистента:
Готово. Логика добавлена в OnStart() скрипта second_script.mq5. ... Примечания: Скилл MQL-TUTOR в этом запросе не применялся — в сообщении не было обязательного тега Artifact: Simple Script MQL5, поэтому правка сделана напрямую. Для вывода использован Print() — результат появится во вкладке "Эксперты" (Experts) терминала после запуска скрипта. Если нужен вывод прямо на график (поверх цен), можно заменить на Comment(...) — скажи, и я поменяю.
Очень интересный вывод. Ассистент не применяет наш Скилл, к тому же это задача по изменению уже созданного артефакта — режим "Edit", а мы его не рассматривали. Но в своих выводах Ассистент не доходит до анализа режима задачи, он отказывается сразу от применения Скилла. Далее Ассистент использует собственные знания, чтобы выполнить задачу и не оставить пользователя без помощи. В результате получается такой скрипт:
//+------------------------------------------------------------------+ //| second_script.mq5 | //| Copyright 2026 August, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026 August, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property icon "tutor_script.ico" #property description "Tutor Script" #property script_show_inputs #define NAME "SCR2" //--- input parameters input string InpStr2 = "I'm string"; input string InpStr1; // 1 comment input double InpDbl3 = 0.0; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Print(InpStr2); string locStr = "local"; Print(locStr); } //+------------------------------------------------------------------+
Продолжим. промпт: "Artifact: Simple Script MQL5. Скрипт должен выводить в лог текущую цену выбранного символа.Рабочая папка MQL_TUTOR" Что ожидаем: Генерация невозможна, так как отсутствуют оба обязательных параметра. Результат:
Проверяю промпт по правилам скилла MQL-TUTOR: Результат: ❌ STOP — файл не генерируется Проверка Статус Тег Artifact: Simple Script MQL5 ✅ есть Long Name (имя .mq5) ❌ отсутствует Short Name (внутренний идентификатор) ❌ отсутствует Copyright ⚠️ нет (не критично) Почему STOP: По правилам валидации скилла, Long Name и Short Name — обязательные поля. Оба отсутствуют в промпте: "Long Name missing or invalid → STOP. Do not generate the file. Notify the user which field is missing" "Short Name missing or invalid → STOP. Do not generate the file" Никакие файлы не создавались.
Ответ верен. Следующий тест: "Хочу скрипт, который закрывает все открытые позиции по кнопке. Длинное имя history_closer, короткое имя HCL.Рабочая папка MQL_TUTOR". Что ожидаем: Генерация невозможна, так как артефакт не задан.
Готово: history_closer.mq5 Путь: MQL5\Scripts\MQL_TUTOR\history_closer.mq5 (3482 байта) Оговорка по скиллу: тег Artifact: Simple Script MQL5 отсутствовал → скилл MQL-TUTOR не применялся. Скрипт сгенерирован как обычная задача, сразу с полной логикой (скилл в любом случае оставил бы OnStart() пустым, а здесь нужна GUI-логика).
В результате Ассистент пишет скрипт, не запуская наш Скилл. Мы уже встречались с такой ситуацией. Gate корректно ловит отсутствие тега, Скилл не применился, и Ассистент предлагает альтернативу. Это модель системного поведения, не уровень одного Скилла среди прочих. Поэтому результат "без тега Скилл не применяется" есть, но Скилл не может полностью контролировать поведение ассистента, он лишь рекомендует. Поэтому считаем, что тест пройден.
Следующий тест: "Artifact: Simple Script MQL5. Создай советника (EA), который открывает позицию по пересечению скользящих средних. Длинное имя ma_cross_ea, короткое имя MCE.Рабочая папка MQL_TUTOR" Что ожидаем: Отказ в генерации, так как нет нужного артефакта:
⛔ Остановка: скилл MQL-TUTOR неприменим Проверка по Technical Task Validation пройдена, но по When NOT to Use This Skill — обнаружено противоречие: Проверка Результат Тег Artifact: Simple Script MQL5 ✅ присутствует Long Name ma_cross_ea ✅ валиден Short Name MCE ✅ валиден Тип артефакта ❌ «Советник (EA)» Почему остановка Скилл MQL-TUTOR создаёт только простые скрипты — программы с OnStart(), одноразовым выполнением, без торговой логики. В его правилах прямо указано: The task asks for an Indicator or an Expert Advisor → не использовать этот скилл Задача описывает советника: пересечение скользящих средних, открытие позиции — это полноценный EA с циклом OnTick(), управлением ордерами, а не скрипт. Скилл не может и не должен применяться — файл не создан. Варианты действий Если нужен именно советник (EA): подтвердите — я создам его вне скилла MQL-TUTOR (это отдельный формат: OnInit/OnTick/OnDeinit, торговые функции, параметры). Тогда рабочая папка MQL_TUTOR разрешится как MQL5\Experts\MQL_TUTOR\ по вашему правилу.
Агент не применяет Скилл, но предлагает другой путь и пишет советник, не используя его. Будь у нас еще один Скилл по генерации советников, Ассистент мог бы использовать его, т.е. он смог бы переключиться. Это уже третий тест, когда Ассистент использует собственные знания и обходит Скилл. Считаем тест пройденным.
Последний тест: "Artifact: Simple Script MQL5. Скрипт с длинным именем "test<>name" должен закрывать позиции по времени.Рабочая папка MQL_TUTOR". Что ожидаем: Отказ в генерации по причине отсутствия короткого имени и недопустимых символах в длинном имени. Результат:
Artifact: Simple Script MQL5. Скрипт с длинным именем "test<>name" должен закрывать позиции по времени. Проверяю промпт по правилам скилла MQL-TUTOR: Результат: ❌ STOP — файл не генерируется Проверка Статус Комментарий Тег Artifact: Simple Script MQL5 ✅ есть Long Name test<>name ❌ невалиден Символы < и > запрещены Short Name ❌ отсутствует Обязательное поле Почему STOP: Long Name невалиден. Имя test<>name содержит символы < и >: В Windows эти символы запрещены в именах файлов (наравне с : " / \ | ? *) — файл test<>name.mq5 физически невозможно создать В MQL5 < и > — это операторы сравнения, они недопустимы ни в именах файлов, ни в идентификаторах По правилам валидации: "Long Name missing or invalid → STOP. Do not generate the file"
Ассистент сделал правильные выводы, тест пройден.
И наконец давайте попробуем более экзотический тест пакетную генерацию. Поступим просто, создадим текстовый файл с четырьмя последними заданиями и отправим его Ассистенту. Попросим отчитаться по выполнению: "Выполни тестовые задания в прикрепленном файле. После выполнения напиши отчет о выполнении". Вот результат (пропущены служебные замечания):
📋 Отчёт о выполнении тестовых заданий (MQL-TUTOR) Файл тестов: MQL5\Files\tutor_test.txt (4 задания) Дата: 06.08.2026 Проверяемый компонент: скилл MQL-TUTOR (генерация скриптов по эталону) Сводная таблица результатов Тест Тег Long Name Short Name Решение скилла Файл создан 1. Цена символа ✅ ❌ нет ❌ нет STOP ❌ нет 2. history_closer ❌ нет ✅ ✅ Скилл неприменим → обычная задача ✅ Scripts\MQL_TUTOR\history_closer.mq5 3. ma_cross_ea (EA) ✅ ✅ ✅ Скилл неприменим (это EA) → обычная задача ✅ Experts\MQL_TUTOR\ma_cross_ea.mq5 4. test<>name ✅ ❌ невалиден ❌ нет STOP ❌ нет
На этом мы тестирование заканчиваем. Текстовый файл с тестами будет прикреплен к данной статье.
Общий вывод — тестирование закончилось успешно.
Ограничения и выводы
- Скилл не гарантирует абсолютного соблюдения правил. Это рекомендация Ассистенту, а не принудительный механизм: Ассистент может обойти Скилл и решить задачу "по общим знаниям", как мы видели в тестах.
- Область видимости Скилла должна быть узкой. Чем уже границы, тем предсказуемее результат.
- Версионирование обязательно. При изменении Скилла нужно менять номер версии в метаданных, иначе можно легко начать использовать устаревшую логику.
Это инженерная рекомендация Anthropic: SKILL.md рекомендуется держать в пределах 500 строк. При превышении — разбивать на отдельные файлы с постепенным раскрытием деталей (progressive disclosure). Оценка основана на токен-бюджете: на тело Скилла отводится примерно 5K токенов, что и соответствует примерно 500 строкам (около 10 токенов на строку). Это не результат бенчмарков, а практическая рекомендация архитектурного дизайна — и она работает для любого ассистента, включая встроенный AI Assistant MetaTrader 5.
Заключение
Мы прошли путь от постановки задачи до работающего Скилла. Но главное не то, что генерирует Ассистент с помощью Скилла, а методика: мы декомпозировали повторяющуюся задачу, формализовали её границы, добавили валидацию и получили предсказуемый результат.
Что это даёт нам?
- Стандартизацию. Все артефакты получаются в одном стиле, даже если в команде несколько человек. Это снижает время на "code review" и упрощает поддержку.
- Масштабируемость. MQL-TUTOR — это, разумеется, только начало. Используя аналогичный подход, можно писать Скиллы для индикаторов, советников, всего, что захочет разработчик. Архитектура уже понятна.
- Возможности развития. Наш Скилл еще очень далек от совершенства. Уверен, многие это заметят. Нет множества нужных проверок (например, что делать, если скрипт с таким именем уже существует). Мы ни слова не сказали о безопасности, а это чрезвычайно важно. Нет проверок результата, или они примитивны. И конечно режим "Edit", Скилл должен уметь редактировать уже созданные скрипты.
Наш Скилл MQL-TUTOR не замена знаний MQL, а система их применения, позволяющая меньше думать о рутине и больше — о бизнес-логике. Продолжим начатый путь в следующей части статьи.
Список использованных источников
- Claude Platform Docs — Agent Skills Overview
- Claude/Anthropic Engineering Blog — "Building Agents with Skills: Equipping Agents for Specialized Work"
- GitHub — anthropics/skills
- Открытый формат для расширения возможностей AI-агентов специализированными знаниями (изначально разработан Anthropic, принят OpenAI, Cursor, GitHub Copilot и др.) — https://github.com/agentskills/agentskills
- Model Context Protocol — официальная документация
- MetaTrader 5 Build 6090: General Improvements
Список прикрепленных файлов:
| # | Имя | Тип | Описание |
|---|---|---|---|
| 1 | Review.zip | Архив | Ревью kimi.ai на наш Скилл. |
| 2 | tutor_test.txt | Текстовый файл | Файл с тестами для пакетной генерации |
| 3 | MQL-TUTOR.ZIP | Архив | Файлы Скилла MQL-TUTOR. Архив следует распаковать в папку \MQL5\Files\MQL-TUTOR |
| 4 | etalon_no_input.mq5 | Файл .mq5 | Шаблон скрипта без входных параметров |
| 5 | etalon_with_input.mq5 | Файл .mq5 | Шаблон скрипта с параметрами |
| 6 | ma_cross_ea.mq5 | Файл .mq5 | Сгенерированный советник без использования Скилла |
| 7 | history_closer.mq5 | Файл .mq5 | Сгенерированный скрипт без использования Скилла |
| 8 | etalon.mq5 | Файл .mq5 | Первичный, исходный шаблон |
| 9 | MQL5.zip | Архив | Архив со всеми файлами, который можно распаковать в каталог установки терминала, и все файлы будут расположены в необходимых местах |
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Особенности написания Пользовательских Индикаторов
Моделирование рынка: Position View (XIV)
Нейросети в трейдинге: Долговременная память торговых сценариев (Объект верхнего уровня)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
5 копеек. Зачем вот так писать (и все сопутствующие базовые вещи):
Structs, classes, and unions are always rejected, even if described in the task or already declared in the script — MQL5's input keyword does not support them, so this is a hard rule with no exceptions.
Зачем здесь перечисляются некоторые пользовательские типы, но не все (в частности по каким-то соображениям опущены interface, void, matrix, vector и т.д. - как-будто подтверждая мысль, что формулировки "от противного" обычно неточны)? Зачем в принципе повторять документацию MQL5?
Если уж очень хочется напомнить агенту, что он в среде MQL5, то почему не написать просто, что:
Входные параметры должны быть только типов, разрешенных в MQL5, а их имена соответствовать правилам составления идентификаторов MQL5.
Я обычно первым предложением в промпте указываю, на каком языке программирования решаем задачу - только название - и этого строго задает рамки без лишних токенов и инфошума, который создается упущениями или непропорциональными уподроблениями в формулировках.
5 копеек. Зачем вот так писать (и все сопутствующие базовые вещи):
Зачем здесь перечисляются некоторые пользовательские типы, но не все (в частности по каким-то соображениям опущены interface, void, matrix, vector и т.д. - как-будто подтверждая мысль, что формулировки "от противного" обычно неточны)? Зачем в принципе повторять документацию MQL5?
Если уж очень хочется напомнить агенту, что он в среде MQL5, то почему не написать просто, что:
Я обычно первым предложением в промпте указываю, на каком языке программирования решаем задачу - только название - и этого строго задает рамки без лишних токенов и инфошума, который создается упущениями или непропорциональными уподроблениями в формулировках.