preview
Нейросети в трейдинге: Адаптивное масштабирование представлений (ADS)

Нейросети в трейдинге: Адаптивное масштабирование представлений (ADS)

MetaTrader 5Торговые системы |
89 0
Dmitriy Gizlyk
Dmitriy Gizlyk

Введение

Финансовые рынки дают огромное количество данных, но не формулируют задачи. Цель всегда задается извне — трейдером или аналитиком, который решает задачу извлечения прибыли при контролируемом риске. Прогноз цены сам по себе не имеет ценности, важен результат — финансовый эффект.

На практике один и тот же фрагмент рыночной истории может требовать разных действий: следовать тренду, искать контртрендовые входы, закрываться быстро в целях скальпинга или сглаживать риск при всплесках волатильности. Классические нейросетевые пайплайны внимания с фиксированными проекциями запросов и ключей видят рынок через одну оптику, усредняют сигналы разных сценариев и теряют специфичность. Особенно это заметно при асимметрии паттернов лонг/шорт.

Прикладной вопрос для разработчика очевиден. Необходимо сделать так, чтобы внимание вместе с весами меняло и само пространство представлений. Это позволит генерировать матрицы проекции запросов и ключей в зависимости от текущего контекста и предполагаемого сценария.

Один из вариантов решения данной задачи представлен в работе "Adaptive Domain Scaling for Personalized Sequential Modeling in Recommenders". Хотя авторы разрабатывали фреймворк для рекомендательных систем, предложенные идеи переносимы на финансовые данные. Авторы фреймворка предлагают рассматривать сценарии как домены и сделать параметры преобразований функцией от контекста.

Сегодня мы формализуем проблему, задаём контракт реализации и показываем практический путь — от генератора адаптивных весов к интеграции с персонализированными преобразованиями и адаптивными запросами — так, чтобы обеспечить управляемую, проверяемую и расширяемую реализацию в торговой системе.



Архитектура ADS

В условиях, где одна и та же рыночная история может интерпретироваться по-разному в зависимости от выбранного сценария, модель должна учитывать не только саму последовательность наблюдений, но и контекст ее использования. Это требует сохранения явного разделения между объектом анализа и способом его интерпретации.

В работе "Adaptive Domain Scaling for Personalized Sequential Modeling in Recommenders" данная идея реализуется через декомпозицию исходных данных на три компоненты: пользовательскую сторону, объект и контекст. При переносе этой структуры в задачи алгоритмической торговли соответствие между ними сохраняется, однако наполняется иным содержанием.

Компонента 𝐼, соответствующая объекту, естественным образом соотносится с рыночной историей. В отличие от рекомендательных систем, где объектом выступает отдельный элемент, здесь в качестве объекта анализа рассматривается последовательность наблюдений, включающая динамику цен, объемов и производных признаков. Именно эта последовательность содержит структуру рынка и формирует основу для извлечения сигналов.

Компонента 𝑈, отражающая пользовательскую сторону, интерпретируется как сценарий или стратегия. Она задает способ взаимодействия с рынком, включая риск-профиль и стиль торговли. Аналогично тому, как в рекомендательных системах пользователь определяет предпочтения, в трейдинге сценарий определяет, какие аспекты рыночной истории являются значимыми.

Контекстная составляющая 𝑂 объединяет дополнительные факторы, влияющие на процесс принятия решения, включая целевые установки.

Таким образом, задача может быть представлена в виде оценки функции

𝑦̂ = 𝑓(𝐸𝑈, 𝐸𝐼, 𝐸𝑂),

где E(⋅) обозначает функцию эмбеддинга, преобразующую исходные признаки в плотные векторные представления, а 𝑓 — нелинейное отображение, реализуемое как правило в виде MLP.

Модель решает задачу оценки функции 𝑓, сопоставляющей сценарий 𝑈, рыночную историю 𝐼 и контекст 𝑂 с вероятностью 𝑦̂, отражающей ожидаемую эффективность выбранного действия. В этом смысле задача может быть интерпретирована как ранжирование сценариев по степени их соответствия текущим условиям.

Ключевым свойством является зависимость представления рыночной истории от сценария. Одна и та же последовательность 𝐼 может быть интерпретирована по-разному в зависимости от 𝑈, что требует от модели способности адаптировать параметры преобразования на этапе формирования признаков. Это напрямую приводит к необходимости использования механизмов, в которых представления не являются фиксированными, а формируются с учетом контекста.

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

Авторы рассматриваемого фреймворка расширяют данную схему и вводят механизм адаптивного масштабирования доменов (Adaptive Domain Scaling — ADS), при котором параметры преобразования становятся функцией контекста. В частности, матрицы, используемые для формирования запросов и ключей, модифицируются в зависимости от сценария 𝑈 и дополнительного контекста 𝑂. Это позволяет изменять не только распределение внимания, но и саму метрику сходства между элементами последовательности.

С архитектурной точки зрения модель сохраняет базовую структуру последовательного энкодера, в основе которого лежит механизм Cross-Attention. Рыночная история 𝐼 преобразуется в последовательность эмбеддингов, после чего обрабатывается слоями внимания, извлекающими временные зависимости. Однако, в отличие от стандартных реализаций, на этапе формирования запросов и ключей используются не фиксированные матрицы, а их адаптивные версии, зависящие от сценария.

Это позволяет рассматривать различные сценарии как отдельные домены, в рамках которых одна и та же последовательность анализируется по-разному. В результате модель получает возможность гибко изменять способ обработки данных, не прибегая к жесткому переключению между режимами. Адаптация происходит непрерывно, что особенно важно в условиях плавной смены рыночных состояний.

Структура ADS строится вокруг идеи контекстно-зависимого формирования представлений и включает два взаимосвязанных уровня адаптации. Первый уровень отвечает за преобразование самой последовательности, второй — за формирование механизма ее интерпретации. В совокупности они образуют целостную систему, в которой не только перераспределяется внимание, но и изменяется способ представления данных.

На первом этапе выполняется адаптивное преобразование последовательности, реализуемое в рамках блока формирования персонализированного представления (Personalized Sequence Representation Generation — PSRG). Его задача — модифицировать эмбеддинг рыночной истории таким образом, чтобы он отражал специфику текущего сценария. В основе лежит принцип совместного использования общих и индивидуальных параметров. Базовые закономерности, характерные для рынка в целом, сохраняются через общую компоненту, тогда как особенности конкретного сценария вносятся через адаптивную часть, зависящую от контекста. Формально это реализуется через механизм динамической генерации параметров преобразования последовательности.

Пусть ESRT×ds — эмбеддинг рыночной истории, где T — длина последовательности, а dS — размерность признаков. Дополнительно вводится вектор доменных признаков EDRT×dD, агрегирующий информацию о сценарии U. Именно этот вектор определяет, каким образом должна быть интерпретирована последовательность.

Адаптация начинается с генерации частной матрицы преобразования. Для этого используется двухслойная нейронная сеть

Wprivate = σ(ReLU(ED W1T + b1), W2T + b2),

где W1RdD×dh, W2Rdh×(dS•dS), b1Rdh, b2R(dS•dS), а dhdS².

Выход этой сети представляет собой вектор, который после применения сигмоиды ограничен диапазоном [0,1] и кодирует индивидуальные особенности сценария.

Параллельно вводится глобальная матрица WsharedR(dS•dS), которая является обучаемым параметром модели и отражает устойчивые закономерности, общие для всех сценариев.

Итоговая матрица формируется как поэлементная комбинация этих двух компонент

Wgenerated = η • (WsharedReshape(Wprivate))

где ⊙ — поэлементное произведение, а оператор Reshape преобразует вектор в матрицу размерности dS×dS. Коэффициент η используется для масштабирования и расширения диапазона значений.

Аналогичным образом генерируется вектор смещения bgenerated.

После этого выполняется ключевой шаг — адаптивное преобразование последовательности.

ES(personalized) = ESWgeneratedT + bgenerated

Данная операция применяется ко всем элементам последовательности и фактически задает новое признаковое пространство, в котором далее будет работать механизм внимания.

С вычислительной точки зрения этот процесс можно интерпретировать как динамическое масштабирование глобального линейного преобразования. Матрица Wshared задает базовую геометрию пространства, тогда как Wprivate выступает в роли контекстно-зависимого фильтра, усиливающего или подавляющего отдельные направления в этом пространстве. В результате каждая компонента признакового вектора получает индивидуальный вес, зависящий от сценария.

Это приводит к важному следствию: одна и та же рыночная история ES может быть преобразована в различные представления без изменения исходных данных. В одном сценарии модель может усиливать признаки, связанные с направленным движением, в другом — акцентировать внимание на локальных отклонениях или признаках истощения. Таким образом, различие между сценариями реализуется не на уровне последующей обработки, а непосредственно в структуре входного пространства.

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

Однако одного лишь изменения представления последовательности недостаточно. Даже адаптированное пространство признаков не гарантирует, что модель сможет корректно выделить релевантные зависимости, если сам механизм внимания остается универсальным. Поэтому второй уровень архитектуры направлен на формирование персонализированных представлений запросов, через которые осуществляется взаимодействие с последовательностью.

На этом этапе вводится механизм генерации адаптивных кандидатов (Personalized Candidate Representation Generation — PCRG), который можно интерпретировать как построение множества различных точек зрения на одну и ту же последовательность. Вместо использования фиксированного набора запросов формируется несколько контекстно-зависимых представлений, каждое из которых акцентирует внимание на определенном аспекте данных. Источником этой адаптации, как и на предыдущем этапе, выступает вектор доменных признаков, объединяющий информацию о сценарии и состоянии рынка. Он выступает не просто как дополнительный вход, а как управляющий сигнал, определяющий, каким образом должна быть организована работа механизма внимания.

Формально это означает, что матрица, используемая для формирования запросов, перестает быть фиксированным параметром и становится функцией от контекста. На практике это реализуется через генерацию набора преобразований, каждое из которых применяется к персонализированному представлению последовательности. В результате из одной и той же последовательности формируется несколько различных наборов запросов, каждый из которых смотрит на данные под своим углом. Одни из них могут усиливать признаки направленного движения, другие — акцентировать внимание на локальных отклонениях, а третьи — выявлять признаки переходных состояний.

После формирования персонализированных представлений последовательности и адаптивных запросов, модель переходит к завершающему этапу, на котором происходит их согласование и извлечение итогового сигнала. На этом уровне внимание перестает быть абстрактным механизмом и приобретает четкую целевую направленность. Запросы, сформированные с учетом сценария, начинают напрямую управлять тем, какие элементы рыночной истории будут участвовать в формировании решения.

В отличие от классической схемы, где запросы и ключи формируются из одного и того же пространства, здесь они уже несут в себе контекстную специфику, заложенную на предыдущих этапах. Это означает, что механизм внимания изначально смещен в сторону текущего сценария.

Для вычисления внимания обе компоненты проецируются в общее пространство. На этом этапе сохраняется стандартная линейная проекция, однако ее вход уже содержит адаптированные представления, что принципиально меняет поведение всей конструкции.

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

Полученные значения нормализуются с помощью функции SoftMax, что позволяет интерпретировать их как распределение внимания по последовательности. На этом этапе происходит отбор релевантных элементов. Одни участки рыночной истории усиливаются. Другие — подавляются. Причем выбор определяется не только данными, но и текущим сценарием.

Агрегация выполняется стандартным образом. Полученный на выходе вектор s представляет собой итоговое описание последовательности, уже отфильтрованное и взвешенное с учетом целевой установки. Фактически это концентрированное представление той части рыночной истории, которая наиболее релевантна рассматриваемому сценарию.

Далее полученное представление объединяется с дополнительными признаками путем конкатенации. Это позволяет сохранить агрегированную информацию о последовательности и исходные контекстные характеристики. Итоговый вектор подается на вход MLP, которая выполняет финальное преобразование и выдает оценку целевой величины.

В процессе обучения используется стандартная функция потерь бинарной кросс-энтропии, что соответствует интерпретации задачи как оценки вероятности успешности выбранного сценария. Однако принципиальное отличие от классических моделей заключается не в функции потерь, а в способе формирования входного представления. Здесь итоговое решение строится на основе последовательности, которая уже прошла два уровня адаптации. Сначала была трансформирована в контекстно-зависимое пространство, а затем проанализирована через набор сценарно-ориентированных запросов.

В результате механизм внимания перестает быть универсальным инструментом и становится целевым. Он не просто ищет зависимости, а делает это в контексте конкретной задачи. Именно это позволяет модели различать ситуации, которые на уровне исходных данных могут выглядеть схожими, но приводят к разным решениям в зависимости от сценария.



Реализация средствами MQL5

После детального разбора теоретических аспектов фреймворка ADS мы переходим к практической части нашей работы. В ней мы рассмотрим, каким образом описанные механизмы могут быть интегрированы в торговые модели. На этом этапе важно сместить акцент от абстрактных формул к инженерной логике построения системы, где каждая идея получает конкретное воплощение в коде и вычислительном графе.

Сразу следует отметить, что рассматриваемый фреймворк представляет собой достаточно сложную архитектурную конструкцию. Он объединяет несколько уровней адаптации, динамическую генерацию параметров и контекстно-зависимое внимание. Попытка реализовать такую систему целиком в один проход почти неизбежно приведет к перегрузке — как с точки зрения вычислений, так и в плане отладки и верификации. В условиях прикладной разработки, особенно в трейдинге, такой подход редко оправдан. Здесь ценится не только мощность модели, но и ее управляемость, прозрачность и устойчивость.

Поэтому дальнейшая работа будет выстроена иначе. Вместо монолитной реализации мы разобьем архитектуру на последовательность функциональных блоков и будем вводить их поэтапно. Такой подход позволяет сохранить контроль над поведением модели на каждом шаге, изолировать влияние отдельных компонентов и оценивать их вклад в итоговый результат. Фактически речь идет о постепенной сборке системы. Сложная архитектура формируется как композиция более простых, но хорошо понятных элементов.

Свою практическую реализацию мы начнем с небольшого, но принципиально важного модуля. На первый взгляд его выбор может показаться неочевидным, поскольку он не выполняет ни прямого анализа последовательности, ни вычисления внимания. Однако именно этот блок лежит в основе сразу двух ключевых компонентов фреймворка: механизма формирования персонализированных представлений и генерации адаптивных запросов. Речь идет о модуле динамической генерации весов на основе представления сценария и контекста.

С инженерной точки зрения это точка входа всей адаптивности модели. До тех пор, пока параметры преобразования остаются фиксированными, модель, по сути, работает в одном и том же режиме, независимо от того, что происходит на рынке. Введение же данного блока позволяет перевести архитектуру в принципиально иной класс — где сами параметры становятся функцией входных данных.

Объект CNeuronWeightGenerator инкапсулирует логику генерации адаптивных параметров и служит связующим звеном между теоретической моделью ADS и ее практическим воплощением средствами MQL5.

class CNeuronWeightGenerator :  public CNeuronConvOCL
  {
protected:
   CNeuronConvOCL    cInputProjection;
   //---
   virtual bool      feedForward(CNeuronBaseOCL *NeuronOCL) override;
   virtual bool      updateInputWeights(CNeuronBaseOCL *NeuronOCL) override;
   virtual bool      calcInputGradients(CNeuronBaseOCL *NeuronOCL) override;

public:
                     CNeuronWeightGenerator(void) {};
                    ~CNeuronWeightGenerator(void) {};
   //---
   virtual bool      Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                          uint window, uint window_out, uint scenarios,
                          ENUM_OPTIMIZATION optimization_type, uint batch);
   //---
   virtual bool      Save(const int file_handle) override;
   virtual bool      Load(const int file_handle) override;
   //---
   virtual int       Type(void) override const  {  return defNeuronWeightGenerator; }
   virtual void      SetOpenCL(COpenCLMy *obj) override;
   virtual void      TrainMode(bool flag) override;
   //---
   virtual bool      WeightsUpdate(CNeuronBaseOCL *source, float tau) override;
  };

Архитектурно класс наследуется от CNeuronConvOCL, что на первый взгляд может выглядеть неожиданно. Однако здесь используется проверенный прием: родительский класс уже содержит инфраструктуру для работы с тензорами, буферами OpenCL и управлением памятью. Таким образом, вместо создания отдельной иерархии под генерацию весов, мы повторно используем существующий вычислительный каркас, адаптируя его под задачу динамической генерации параметров. Это решение выглядит консервативным, но на практике оно значительно упрощает интеграцию и снижает вероятность ошибок на уровне низкоуровневых операций.

Внутри класса объявлен объект cInputProjection. По сути, это встроенный подмодуль, реализующий первичное преобразование входного вектора доменных признаков ED. Если провести параллель с формулами, именно здесь начинается реализация первой линейной проекции EDReLU(W1T + b1). Такой подход позволяет разбить генерацию весов на последовательность более простых операций, каждая из которых уже реализована и протестирована в рамках родительского класса.

Метод инициализации в данном случае фактически определяет двухступенчатую схему генерации весов. И каждый компонент выполняет свою роль в общей архитектуре.

bool CNeuronWeightGenerator::Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                                  uint window, uint window_out, uint scenarios,
                                  ENUM_OPTIMIZATION optimization_type, uint batch)
  {
   if(!CNeuronConvOCL::Init(numOutputs, myIndex, open_cl, (window + 3) / 4, (window + 3) / 4,
                                         window_out, 1, scenarios, optimization_type, batch))
      ReturnFalse;

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

Особое внимание привлекает преобразование входного окна (window + 3)/4. Это не вопрос выравнивания или чисто вычислительной оптимизации. Здесь происходит осознанное сжатие признакового пространства. Фактически, исходный эмбеддинг контекста ED может быть достаточно избыточным и шумным. И на первом этапе он проецируется в более компактное представление.

Смысл этого шага хорошо понятен в контексте трейдинга. Контекст, включающий сценарий, волатильность, режим рынка и производные признаки, часто содержит множество коррелированных и частично дублирующих сигналов. Прямое использование такого пространства для генерации матрицы весов приводит к переобучению и нестабильности. Сжатие же выполняет роль фильтра. Модель вынуждена выделить наиболее значимые факторы, отбрасывая второстепенные.

К этому важно добавить еще один ключевой момент. При вызове метода родительского класса мы специально задаем длину последовательности равной единице. А число сценариев переносим в параметр количества независимых последовательностей. Такая конфигурация сообщает объекту, что каждый сценарий должен иметь собственные независимые параметры и обучаться отдельно. Фактически, это создает механизм параллельной работы независимых экспертов. Каждый из них отвечает за генерацию весов под свой конкретный сценарий, не вмешиваясь в параметры других.

В сочетании с двухступенчатой схемой генерации это означает, что компактное представление, сформированное на этапе сжатия, разворачивается в высокоразмерное пространство для каждого сценария отдельно. Таким образом, модель сохраняет общую структуру и принципы генерации, но при этом приобретает способность адаптироваться к разным сценариям одновременно, обеспечивая гибкость и персонализацию при обучении на рыночных данных.

Далее инициализируется внутренний модуль cInputProjection. В отличие от базового класса, он работает с исходной размерностью window и реализует первую стадию преобразования.

   if(!cInputProjection.Init(0, 0, OpenCL, window, window, iWindow, GetUnits(), iVariables, optimization, iBatch))
      ReturnFalse;
//---
   return true;
  }

Именно здесь происходит первичное извлечение признаков из контекста. Этот блок можно интерпретировать как слой, который переводит сырое описание сценария в более структурированное скрытое представление.

Такая конструкция полностью повторяет идею из статьи. Использование двухслойной MLP повышает выразительность и контролирует размерность задачи, не позволяя ей взрываться до dS×dS напрямую.

Если один из этапов инициализации завершается ошибкой, выполнение немедленно прерывается. Это критично, поскольку несогласованность размерностей между этими двумя слоями приведет к некорректной генерации весов и, как следствие, к деградации всей модели.

Метод feedForward реализует прямой проход генератора весов и, несмотря на кажущуюся простоту, отражает основную логику адаптивной трансформации.

bool CNeuronWeightGenerator::feedForward(CNeuronBaseOCL *NeuronOCL)
  {
   if(!cInputProjection.FeedForward(NeuronOCL))
      ReturnFalse;

На первом шаге анализируемый тензор сценариев и контекста проходит через внутренний модуль cInputProjection, который выполняет первичное извлечение признаков и формирует компактное скрытое представление. Здесь происходит проекция контекста в пространство, где модель выделяет наиболее значимые факторы для генерации параметров, отбрасывая второстепенные детали.

Затем результат передается в родительский класс, который отвечает за вторую стадию трансформации.

   if(!CNeuronConvOCL::feedForward(cInputProjection.AsObject()))
      ReturnFalse;
//---
   return true;
  }

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

Таким образом, весь метод прямого прохода реализует линейный, но функционально двухступенчатый алгоритм. Сначала адаптивная фильтрация и сжатие. Затем развертка в матрицу весов, готовую к использованию. Несмотря на компактность кода, именно эта конструкция позволяет объекту CNeuronWeightGenerator эффективно создавать независимые наборы параметров для каждого сценария и формировать основу для дальнейшей персонализированной работы модели на рыночных данных.



Заключение

Мы переосмыслили проблему и сделали её прикладной. Фиксированное Attention приводит к усреднению стратегий и потере чувствительности к асимметричным лонг/шорт сигналам. Наша задача состоит в том, чтобы параметры Q/K стали функциями сценария и контекста, а не константами графа.

Практическая часть статьи реализует минимально полезный контур (MVP). Модуль CNeuronWeightGenerator на MQL5/OpenCL, который по вектору доменных признаков генерирует независимые наборы параметров для каждого сценария (механизм параллельных экспертов). Архитектурные решения — двухступенчатая схема сжатиеразвёртка и выделение отдельных параметров на сценарий — дают контролируемую выразительность и снижают риск переобучения.

Тем не менее это лишь первый шаг на большом пути интеграции подходов фреймворка ADS в торговые модели. В следующей статье мы продолжим начатую работу, переходя к реализации персонализированных последовательностей и применению механизмов целевого внимания.


Ссылки


Программы, используемые в статье

#ИмяТипОписание
1Study.mq5СоветникСоветник офлайн-обучения моделей
2StudyOnline.mq5 Советник Советник онлайн-обучения моделей
3Test.mq5СоветникСоветник для тестирования модели
4Trajectory.mqhБиблиотека классаСтруктура описания состояния системы и архитектуры моделей
5NeuroNet.mqhБиблиотека классаБиблиотека классов для создания нейронной сети
6NeuroNet.clБиблиотекаБиблиотека кода OpenCL-программы

Проект представлен по ссылке.

Прикрепленные файлы |
MQL5.zip (3777.16 KB)
Особенности написания Пользовательских Индикаторов Особенности написания Пользовательских Индикаторов
Написание пользовательских индикаторов в торговой системе MetaTrader 4
Возможности Мастера MQL5, которые вам нужно знать (Часть 74): Использование паттернов Ишимоку и ADX-Wilder с обучением с учителем Возможности Мастера MQL5, которые вам нужно знать (Часть 74): Использование паттернов Ишимоку и ADX-Wilder с обучением с учителем
В продолжение нашей предыдущей статьи, где мы представили пару индикаторов Ишимоку и ADX, рассмотрим, как эту пару можно улучшить с помощью обучения с учителем. Ишимоку и ADX представляют собой взаимодополняющую пару уровней поддержки/сопротивления и тренда. Наш подход обучения с учителем использует нейронную сеть, которая задействует ядро глубокого спектрального смешения (Deep Spectral Mixture Kernel) для точной настройки прогнозов этой пары индикаторов. Как обычно, это делается в пользовательском файле класса сигналов (signal class), который взаимодействует с Мастером MQL5 для сборки советника.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Как реализовать конкуренцию LLM-агентов в MetaTrader 5 Как реализовать конкуренцию LLM-агентов в MetaTrader 5
Статья описывает конкурентную архитектуру для MetaTrader 5, в которой десять LLM-агентов с разными торговыми правилами управляют собственным капиталом и открывают независимые позиции через уникальные magic numbers. Системный промпт и агрессивность агента адаптируются по результатам PnL и серии сделок. Представлен воспроизводимый каркас с режимами эксплуатации и контролируемыми метриками, пригодный для тестирования и дальнейшей оптимизации.