Возможности Мастера MQL5, которые вам нужно знать (Часть 92): Использование индексации B-дерева и байесовской нейронной сети в пользовательском классе сигнала
Введение
В предыдущей статье серии в набор инструментов была добавлена защита рисков с помощью трейлинг-стопа, использующая алгоритм списков с пропусками вместе с сетями Хопфилда. Трейлинг-стопы помогают защищать плавающую прибыль по открытым позициям не только наличием стоп-лосса, но и его перемещением только в оптимальный момент, а не в ответ на рыночный шум или хаотичные свинги. Построение сигналов входа для нескольких символов может выявить структурные ограничения стандартных инструментов, особенно при работе нескольких стратегий. Во-первых, стандартная библиотека MQL5 не предоставляет средств управления взаимосвязанными состояниями. Встроенные структуры данных, такие как MQLRates, привязаны к конкретному торговому инструменту. Если для стратегии критично сравнение разных инструментов, это может стать препятствием.
Во-вторых, существует риск иллюзии детерминированной определенности. Обычные индикаторы и традиционные нейронные сети не имеют механизма защиты: они постоянно формируют жесткие сигналы buy и sell, бездумно относясь к хаотичному рыночному шуму с той же уверенностью, что и к явным трендам. Другими словами, они лишь эксплуатируют найденные паттерны, не занимаясь исследованием альтернатив. Однако сегодня трейдерам доступны более сложные инструменты. Они не только поддерживают сопоставление данных по нескольким символам, но и позволяют исследовать альтернативы, например внедрение вероятностного защитного механизма, чтобы точнее оценивать все состояния рынка с подходящей степенью уверенности.
Задача
По мере перехода стратегий от анализа одного актива к более сложным конфигурациям портфелей из нескольких символов на первый план могут выйти ограничения архитектуры некоторых встроенных структур данных MQL5. Когда советнику необходимо выполнять триангуляцию ценовых данных, корреляций или расхождений по нескольким валютным парам, разработчики обычно используют многомерные массивы. Однако массивы по своей природе недостаточно гибки. Как правило, это плоские структуры, требующие жесткого кодирования и вложенных циклов для сопоставления исторических состояний. По мере масштабирования стратегий, что становится все более распространенным требованием, эта хрупкая архитектура может приводить к запутанному коду, склонному к ошибкам и плохо адаптирующемуся к изменениям.
Стандартные массивы не имеют встроенных средств управления взаимосвязанными состояниями. Без значительной дополнительной реализации они не могут отображать иерархические или временные связи между различными рыночными переменными. Поэтому мы ставим задачу создать инструмент со встроенной поддержкой реляционнх данных. Еще одна проблема статьи – зависимость от детерминированных моделей входа, характерная для большинства технических индикаторов и нейронных сетей, обучаемых под наблюдением. Можно утверждать, что традиционные классы сигналов, опирающиеся на них, неизбежно подвержены иллюзии определенности. Такие классы механически выдают сигналы buy и sell, не только не имея интервала уверенности, но и полностью опираясь на прошлые закономерности без исследования новых альтернатив.
На неопределенном рынке детерминированная модель может без проверки выдать сигнал, даже если фоновый шум указывает на его ненадежность. Во многих пользовательских реализациях сигналов отсутствует встроенный механизм количественной оценки уверенности прогноза перед исполнением сделки. Также отсутствует метод исследования альтернатив стандартному сигналу. Поэтому мы хотим развить наш подход к проектированию так, чтобы не только прогнозировать дальнейшее развитие событий, но и количественно оценивать собственную прогностическую дисперсию и исследовать альтернативы.
Индексация B-дерева
Чтобы преодолеть часть этих ограничений, предлагается решение, выходящее за рамки стандартных индикаторов и интегрирующееся с экосистемой Мастера MQL5. При этом вводится класс CSignalBTreeBayesian. Поскольку этот класс напрямую наследуется от базового класса CSignalExpert, он не является изолированным скриптом. Таким образом, количественная сложность скрывается за тремя краткими параметрами, доступными в интерфейсе Мастера MQL5:
- BTreeMode (int, 1-4). Этот параметр определяет режимы поиска по реляционным данным, используемые алгоритмом. Он позволяет легко переключаться между прямой, диапазонной, глубинной и гибридной триангуляцией без изменения кода базового класса.
- UseBayesian (тип boolean). Это параметр-переключатель, активирующий нейронную сеть. Он переводит функцию сигнала от чисто алгоритмического сбора данных к фильтрации на основе вероятностей.
- MaxUncertainty (double). Это критический порог дисперсии. При использовании байесовской нейронной сети (BNN) этот параметр выполняет роль статистического фильтра, устанавливая максимально допустимый уровень шума в прогнозе, при превышении которого сделка отклоняется.
Преимущество этого пользовательского класса сигнала может заключаться в объединении правил индексации SQLite и математики байесовского инференса. Благодаря этому сложная количественная обработка скрыта от конечного пользователя. Реализация не является буквальной триангуляцией трех и более валютных пар, а моделирует логику сбалансированного дерева.
Преимущества индексации B-дерева SQLite:
Прежде чем перейти к коду класса CSignalBTreeBayesian, полезно изложить используемый подход и объяснить смену парадигмы в алгоритме. В обычной разработке на MQL5 оценка состояния рынка на разных таймфреймах или по коррелирующим символам может требовать обработки многомерных массивов либо копирования больших буферов данных с помощью CopyRates. Это может вынудить советника использовать линейные вычислительно затратные циклы. Использование логики B-дерева SQLite существенно меняет подход к проектированию.
B-дерево (сбалансированное дерево) – это самобалансирующаяся структура данных, поддерживающая упорядоченные данные и позволяющая выполнять поиск, последовательный доступ, вставку и удаление с логарифмической сложностью O(log n) вместо O(n). В отличие от хранения плоских рыночных данных в жестких массивах, B-дерево организует исторические данные ценового движения, узлы волатильности и межсимвольные корреляции в иерархическую реляционную карту. Корневой узел разветвляется на внутренние узлы на основе заданных ключей индексации, например временных меток или порогов волатильности. Ветви завершаются листовыми узлами, содержащими ценовые данные.
В пользовательском классе эта логика абстрагируется в четыре рабочих режима. Стандартные обращения Close() и Open() для получения цены в коде MQL5 служат лишь условным заменителем более глубоких реляционных запросов, используемых при триангуляции. Такие запросы обычно учитывают ценовые спреды или дельты корреляции. Однако в этом пользовательском классе сигнала триангуляция только моделируется. Ниже приведен код для режима 1. Основной метод поиска по реляционной структуре – прямой поиск, используемый, когда входному параметру m_btree_mode присвоено значение 1.
//+------------------------------------------------------------------+ //| Mode 1: B-Tree Direct Lookup | //+------------------------------------------------------------------+ double CSignalBTreeBayesian::BTreeTriangulateDirect(void) { double diff = Close(StartIndex()) - Open(StartIndex()); return diff * 1.5; }
Режим 1 выполняет точечный запрос к самому свежему индексированному узлу. Вызывается функция базового класса StartIndex(), а указатель устанавливается на текущий бар, обрабатываемый советником. Это выполняет роль первичного ключа в запросе. Возвращаемое значение diff можно рассматривать как дискретный ценовой вектор.
double diff = Close(StartIndex()) - Open(StartIndex()); В этой ситуации алгоритм вычисляет дискретный ценовой вектор текущего узла. В сценарии с межсимвольной триангуляцией это представляло бы точный поиск совпадений, обеспечивающий синхронизацию цен всех трех символов в заданный момент времени. Эквивалентной метрикой может быть разность между ценой одного из трех символов и произведением цен двух других, если эти значения должны совпадать.
В приведенной выше функции разность умножается на скалярное значение 1,5, служащее детерминированным весом, который не ослабевает со временем. Во втором режиме сбалансированное дерево используется для сканирования диапазона. Когда рынок находится в локальном флэте, поиск с помощью BTreeTriangulateDirect может вернуть шумный узел. Переходим к режиму 2. При сканировании диапазона запрос начинает работать как ограниченный диапазон внутри B-дерева.
//+------------------------------------------------------------------+ //| Mode 2: B-Tree Range Scan | //+------------------------------------------------------------------+ double CSignalBTreeBayesian::BTreeTriangulateRange(void) { double sum = 0; for(int i = 0; i < 5; i++) sum += (Close(StartIndex() + i) - Open(StartIndex() + i)); return sum / 5.0; }
Вместо извлечения одного первичного ключа метод обходит соседние листовые узлы, чтобы отобразить локальный кластер. Этот реляционный аккумулятор, sum, инициализируется нулем. Затем запускается цикл for, в котором алгоритм задает ограничивающую область для запроса. Для этого перебираются пять соседних хронологических узлов B-дерева, а изменения ценовых баров суммируются. Сканируя каждый узел заданного диапазона, алгоритм извлекает ценовой вектор и общий структурный сдвиг. Возвращаемое значение представляет собой среднее значение по охваченному диапазону. По сути, этот подход нормализует общую сумму по размеру ограничивающей области, который в данном случае равен 5.
В результате получается среднее реляционное состояние для конкретного кластера из пяти последних ценовых точек. Этот режим помогает сглаживать аномалии в наборе данных и формировать стабильный базовый вектор вместо реакции на каждый новый бар. В режиме 3 выполняется поиск расхождений в глубину. Это может быть наиболее агрессивный и показательный режим, поскольку в приведенных ниже форвардных оптимизационных тестах был выбран именно он. Когда входному параметру m_btree_mode присваивается значение 3, алгоритм углубляется в исторические ветви набора данных, чтобы найти точки максимального расхождения или структурные сдвиги.
//+------------------------------------------------------------------+ //| Mode 3: B-Tree Depth Search | //+------------------------------------------------------------------+ double CSignalBTreeBayesian::BTreeTriangulateDepth(void) { double max_diff = 0; for(int i = 0; i < 10; i++) { double diff = Close(StartIndex() + i) - Open(StartIndex() + i); if(MathAbs(diff) > MathAbs(max_diff)) max_diff = diff; } return max_diff; }
Если при сканировании диапазона ищется нормализованное среднее значение, то поиск в глубину нацелен на максимальное расхождение в реляционных ветвях. Конечный результат max_diff инициализируется нулем. Выполняется поиск на глубину, вдвое большую, чем при сканировании диапазона: рассматриваются десять узлов. На каждом уровне вычисляется дискретный вектор узла, который оценивается по условию:
if(MathAbs(diff) > MathAbs(max_diff))
Это критически важная проверка, в которой применяется функция MathAbs() для игнорирования направленности и строгого измерения величины смещения. Если проверяемый узел показывает большее смещение, чем сохраненный максимум, сохраненный максимум перезаписывается. Функция возвращает это максимальное смещение. Режим 3 лучше всего подходит для выявления скрытых всплесков волатильности или глубоких корреляций в исторических данных, которые стандартные методы сглаживания массивов в режимах 1 и 2 могут пропустить.
Последний режим – режим 4, гибрид сканирования диапазона и поиска в глубину. Он демонстрирует гибкость преобразования торговой логики в отдельные применимые функции. Этот гибридный подход объединяет нормализованное сглаживание сканирования диапазона с определением экстремальных выбросов при поиске в глубину.
//+------------------------------------------------------------------+ //| Mode 4: B-Tree Hybrid (Range + Depth) | //+------------------------------------------------------------------+ double CSignalBTreeBayesian::BTreeTriangulateHybrid(void) { return (BTreeTriangulateRange() + BTreeTriangulateDepth()) / 2.0; }
Эта составная функция служит универсальной метрикой для разных условий рынка. Функция BTreeTriangulateRange() выполняет запрос диапазона для определения нормализованной сглаженной траектории по ближайшему кластеру из пяти узлов. Одновременно BTreeTriangulateDepth() запрашивает более глубокую ветвь из десяти узлов, чтобы выделить наиболее экстремальную структурную аномалию. Итоговый результат получается путем усреднения этих двух значений.
Объединяя результаты этих запросов, алгоритм получает более детализированное представление о рынке. Это позволяет оценить текущий сглаженный импульс и потенциальное влияние недавних экстремальных расхождений. Этот объединенный результат triangulated_val затем передается следующему методу. Тем не менее, какой бы надежной ни казалась эта реляционная карта, на данном этапе она остается преимущественно детерминированным алгоритмом. Поэтому для реальной защиты маржи этот структурированный выходной набор данных следует фильтровать с помощью байесовской нейронной сети на основе вероятностей.
Фильтрация с помощью байесовской нейронной сети
Хотя индексация сбалансированного дерева устранила ограничение мультисимвольной триангуляции, полученный triangulated_val остался детерминированным результатом. Он представляет точное математическое состояние, которому может не хватать адаптивности при работе с рыночным шумом. Если напрямую передать это значение в обычный блок исполнения сделок, снова возникает риск иллюзии определенности. Чтобы устранить этот недостаток, триангулированные данные пропускаются через фильтр байесовской нейронной сети.
В отличие от обычных нейронных сетей, использующих статические фиксированные веса для формирования единственного однозначного "наилучшего прогноза", байесовская нейронная сеть рассматривает каждый внутренний вес как вероятностное распределение. Выполняя несколько прямых проходов, то есть каждый раз выбирая различные веса из этих распределений, сеть может формировать диапазон прогнозов. На основе этого вычисляются два ключевых показателя: ожидаемый результат – среднее значение (mean) – и степень неуверенности модели в этом результате – дисперсия (variance). Ниже приведен основной механизм этой логики:
//+------------------------------------------------------------------+ //| Bayesian Inference: Forward Pass with Monte Carlo Dropout | //+------------------------------------------------------------------+ void CSignalBTreeBayesian::BayesianInference(double input_data, double &out_mean, double &out_variance, int idx) { //--- SEED THE PRNG deterministically based on the current bar's timestamp. //--- This guarantees the exact same random sampling sequence for this specific bar. m_seed = (uint)Time(idx) + (uint)m_btree_mode; const int passes = 20; double predictions[20]; double sum_preds = 0.0; for(int p = 0; p < passes; p++) { double activation = GenerateGaussian(m_bias_mu, m_bias_sigma); for(int i = 0; i < 10; i++) { double sampled_weight = GenerateGaussian(m_weight_mu[i], m_weight_sigma[i]); activation += (input_data * sampled_weight); } predictions[p] = MathTanh(activation); sum_preds += predictions[p]; } out_mean = sum_preds / passes; double variance_sum = 0.0; for(int p = 0; p < passes; p++) { variance_sum += MathPow(predictions[p] - out_mean, 2); } out_variance = variance_sum / passes; }
В приведенном выше листинге используется детерминированная инициализация генератора: функция задает начальное значение пользовательского генератора псевдослучайных чисел (ГПСЧ). Для этого используется временная метка текущего бара Time(idx). Это особенно важно при использовании Тестера стратегий MetaTrader 5. При использовании обычной рандомизации без закрепленного начального значения советник будет выдавать совершенно разные результаты при каждом запуске теста. Закрепление начального значения обеспечивает воспроизводимость и стабильность вероятностной выборки для каждого конкретного исторического момента.
Используются проходы Монте-Карло, число которых задано равным 20. Это означает, что сеть 20 раз оценивает одни и те же input_data, формируя распределение прогнозов вместо одного расчета. Затем в цикле for вычисляются среднее и дисперсия, а сеть выбирает значения структурных весов для формирования прогнозов. Вместо умножения входных данных на фиксированный массив чисел алгоритм вызывает функцию GenerateGaussian(), которая по параметрам математического ожидания (то есть среднего значения) mu и стандартного отклонения sigma формирует случайный вес из нормального распределения.
После выполнения 20 проходов и применения функции активации гиперболического тангенса MathTanh алгоритм вычисляет переменную out_mean – среднее значение прогнозов, а также параметр out_variance – дисперсию 20 прогнозов. Если 20 прогнозов тесно сгруппированы и дисперсия очень мала, модель имеет большую уверенность в своей оценке.
Однако при сильном разбросе прогнозов дисперсия неизбежно возрастает, указывая, что сеть не может сформировать надежный прогноз с учетом текущего рыночного шума. BNN можно рассматривать как вторичный фильтр внутри советника, выполняющий роль барьера неопределенности. Основное преимущество этого расширения проявляется при его внедрении в классы кода Мастера MQL5. Интеграция выполняется через блоки голосования LongCondition() и ShortCondition().
//+------------------------------------------------------------------+ //| "Voting" that price will grow. | //+------------------------------------------------------------------+ int CSignalBTreeBayesian::LongCondition(void) { int result = 0; int idx = StartIndex(); //--- 1. B-Tree Triangulation Algorithm double triangulated_val = 0.0; switch(m_btree_mode) { case 1: triangulated_val = BTreeTriangulateDirect(); break; case 2: triangulated_val = BTreeTriangulateRange(); break; case 3: triangulated_val = BTreeTriangulateDepth(); break; case 4: triangulated_val = BTreeTriangulateHybrid(); break; default: triangulated_val = BTreeTriangulateDirect(); break; } //--- 2. Bayesian NN Filter if(m_use_bayesian) { double mean_pred = 0.0, variance = 0.0; //--- Pass the current bar index (idx) to anchor the random generation BayesianInference(triangulated_val, mean_pred, variance, idx); if(variance > m_max_uncertainty || mean_pred < 0.1 * m_symbol.Point()) return(0); } else { if(triangulated_val < 0.0) return(0); } //--- 3. Confirmation result = m_pattern_0; return(result); } //+------------------------------------------------------------------+ //| "Voting" that price will fall. | //+------------------------------------------------------------------+ int CSignalBTreeBayesian::ShortCondition(void) { int result = 0; int idx = StartIndex(); //--- 1. B-Tree Triangulation Algorithm double triangulated_val = 0.0; switch(m_btree_mode) { case 1: triangulated_val = BTreeTriangulateDirect(); break; case 2: triangulated_val = BTreeTriangulateRange(); break; case 3: triangulated_val = BTreeTriangulateDepth(); break; case 4: triangulated_val = BTreeTriangulateHybrid(); break; default: triangulated_val = BTreeTriangulateDirect(); break; } //--- 2. Bayesian NN Filter if(m_use_bayesian) { double mean_pred = 0.0, variance = 0.0; //--- Pass the current bar index (idx) to anchor the random generation BayesianInference(triangulated_val, mean_pred, variance, idx); if(variance > m_max_uncertainty || mean_pred > -0.1 * m_symbol.Point()) return(0); } else { if(triangulated_val > 0.0) return(0); } //--- 3. Confirmation result = m_pattern_0; return(result); }
В двух ключевых функциях, рассмотренных выше, m_max_uncertainty служит окончательным статистическим фильтром. Вывод этой переменной в Мастер как входного параметра позволяет задать предпочтительный уровень "толерантности к хаосу". Как только обнаруживается торговый сетап, алгоритм проверяет дисперсию. Даже если сбалансированное дерево находит правдоподобную структуру, а mean_pred указывает на прибыльный сетап, сделка отклоняется при превышении дисперсией оптимизированного пользователем порога m_max_uncertainty. Обе функции возвращают 0. Сигнал фактически отменяется. Это можно рассматривать как усиленный протокол управления рисками. Советник больше не следует сигналам вслепую: в качестве дополнительной меры он способен отказаться от сделки при слишком высокой статистической неопределенности. Это может помочь сохранить маржу для торговых условий с более высокой вероятностью успеха.
Анализ теста – алгоритм против алгоритма с сетью
Чтобы показать практический эффект расширения рассматриваемого инструментария, пользовательский класс сигнала CSignalBTreeBayesian тестируется в Тестере стратегий как советник, собранный с помощью Мастера. Цель состоит не только в оценке общей прогностической состоятельности, но и в отдельной проверке преимуществ индексации сбалансированного дерева и потенциала байесовской нейронной сети по снижению рисков. Выполнены два оптимизационных запуска, каждый из которых сопровождался форвардным тестированием.
В первом запуске советник не использовал байесовскую нейронную сеть, а режим 3 индексации сбалансированного дерева (Signal_BTreeBayes_BTreeMode=3) оптимизировался как наиболее стабильный режим. Обе оптимизации проводились по паре GBPUSD с 1.01.2025 по 1.05.2026. Окно форвардного тестирования охватывало период с 1.01.2026 по 1.05.2026. Кроме того, использовался 4-часовой таймфрейм.
Запуск 1:
В первом тестировании, настройки которого приложены как r1.set, советник работал исключительно на основе реляционной структуры данных Balanced-Tree (сбалансированное дерево). Байесовская сеть была отключена, поскольку входному параметру Signal_BTreeBayes_UseBayesian было присвоено значение false. Таким образом, советник опирался только на выходные данные алгоритма.

Результаты показывают как сильные стороны, так и уязвимость полностью детерминированного структурного поиска. Поскольку триангуляция в глубину способна выявлять сложные неочевидные сетапы, которые могут пропустить обычные плоские массивы, алгоритм смог открыть относительно большое число сделок. Это говорит о том, что он с определенной точностью отобразил структуру рынка. Однако анализ кривой средств счета в этом форвардном тестировании выявляет ключевые недостатки, связанные с детерминированной определенностью.
Без вероятностного фильтра дисперсии советник исполнял все найденные структурно допустимые триангуляции. Рыночный шум не учитывался. В периоды хаотичной волатильности совершалось много сделок по сетапам с низкой вероятностью успеха. Это видно по резким просадкам средств и сниженному профит-фактору. Сам по себе алгоритм способен находить перспективные сетапы, однако без интервала уверенности ему не хватает механизма самозащиты, необходимого для сохранения маржи в нестабильных условиях.
Запуск 2:
Во второй оптимизации, настройки которой приложены как r2.set, используются и алгоритм, и нейронная сеть. Байесовская сеть была активирована присвоением параметру Signal_BTreeBayes_UseBayesian значения true. Также был оптимизирован порог фильтра дисперсии, составивший 0,475035 для входного параметра Signal_BTreeBayes_MaxUncertainty. При совместной работе алгоритма и сети результаты форвардного тестирования существенно изменились.
Вектор триангуляции пропускался по байесовской сети через проходы Монте-Карло, и, по-видимому, советник смог количественно оценивать степень хаотичности рынка. Общее число открытых сделок заметно снизилось по сравнению с запуском 1. Это, вероятно, было не недостатком, а результатом исключения шумных сделок с низкой уверенностью.

Если BNN оценивала допустимый сетап, но вычисляла внутреннюю дисперсию прогноза выше порога 0,475, сделка отклонялась. Влияние этого на показатели эффективности становится очевидным сразу. Кривая средств счета заметно сглаживается, максимальная просадка существенно сокращается, а профит-фактор улучшается по сравнению с запуском 1. Следовательно, можно утверждать, что байесовский фильтр нейтрализовал ложные срабатывания, наблюдавшиеся в запуске 1, и служил динамическим механизмом снижения рисков, разрешая исполнение сделок только при достаточно высокой уверенности.
Резюме – основные выводы
- Реляционные данные устраняют ограничения жестких массивов: Когда стратегии масштабируются и требуется оценивать несколько коррелирующих активов, использование стандартных многомерных массивов может стать тупиковым решением. Встраивание индексации B-дерева SQLite в советник обеспечивает масштабируемость. Это позволяет советнику непосредственно моделировать сложные иерархические и временные корреляции в больших наборах данных без использования хрупких вложенных циклов for.
- Адаптируемые методы поиска обеспечивают гибкость: Для сложной стратегии обычно требуется гибкий способ извлечения данных. Используя в одном пользовательском классе сигнала отдельные алгоритмические режимы – прямой поиск, сканирование диапазона, обход в глубину и гибридный синтез, – разработчики могут расширить возможности советников, собранных с помощью Мастера. Собранные советники могут динамически менять подход к сбору данных в зависимости от преобладающей микроструктуры рынка.
- Фильтрация на основе вероятностей нейтрализует рыночный шум: Иллюзия детерминированной определенности, то есть строгая зависимость от заранее заданной логики входа, может стать одной из главных причин потерь по марже. Переход к байесовским моделям добавляет дополнительный важный уровень управления рисками. Оценка распределений весов с помощью проходов Монте-Карло позволяет байесовской сети количественно определять собственную дисперсию прогноза. Это позволяет советнику статистически избегать хаотичных сетапов.
Заключение
Цель состояла в том, чтобы механизм открытия сделок мог эффективно обрабатывать несколько потоков данных. Часть структурных ограничений, связанных с жесткостью и проблемами масштабирования плоских массивов, можно устранить с помощью пользовательского класса B-дерева. Эта интеграция заменила практику использования громоздких вложенных циклов for методами поиска по связанным данным, позволяющими советнику органично работать с более сложными наборами данных.
Кроме того, байесовская нейронная сеть до некоторой степени нейтрализовала иллюзию определенности, присущую детерминированным моделям. В качестве вторичного фильтра данные пропускались через вероятностные распределения, что позволило модели вычислять дисперсию и динамически отклонять шумные сигналы с низкой степенью уверенности.
| имя | описание |
|---|---|
| wz_92.mq5 | Советник, собранный Мастером MQL5 |
| SignalBTreeBayesian.mqh | Пользовательский класс сигнала, используемый при сборке советника Мастером MQL5 |
| r1.set | Входные настройки для отдельного теста алгоритма |
| r2.set | Входные настройки для теста с алгоритмом и нейронной сетью |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/22775
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Разработка инструментария для анализа Price Action (Часть 71): Картирование структуры гэпов выходного дня в MQL5
Интеграция MQL5 с пакетами обработки данных (часть 8): Использование графовых нейронных сетей для выявления зон ликвидности
От начального до среднего уровня: Классы (II)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования