Нейроструктурный торговый движок — NSTE (Часть II): Шестиступенчатый квантовый фильтр "Врата Джардина"
Введение
Это вторая статья серии, состоящей из 19 частей и посвященной нейроструктурному торговому движку — алгоритмической системе для одновременной торговли CFD на криптовалюты (BTCUSD и ETHUSD) на нескольких счетах в проп-фирмах. В первой части мы заложили основу: управление риском с фиксированной суммой в долларах, определение рыночного режима по коэффициенту сжатия, прогнозирование с помощью нейронной сети LSTM и архитектуру "один скрипт на счет".
В этой статье мы представляем "Врата Джардина" — шестиступенчатый квантовый фильтр, который работает между генерацией сигналов и совершением сделок. Сделка допускается только после того, как прогноз LSTM пройдет все шесть ступеней. Результат — чрезвычайно высокая избирательность: из 43 200 сигналов за месяц только 127 проходят все шесть ступеней. При тестировании на исторических данных процент выигрышных сделок среди этих 127 сделок составил 100%.
Название отсылает к Джардинс-Лукаут в Гонконге — обзорной точке, с которой видны все подходы к гавани. С этих Врат вы видите все поле боя, прежде чем вводить войска. Эта метафора отражает суть алгоритма: оценить ситуацию со всех сторон, прежде чем действовать.
Проблема — большинство сигналов представляет собой шум
Каждая торговая система генерирует гораздо больше сигналов, чем следует отрабатывать сделками. Модель LSTM выдает прогноз каждые 60 секунд. За торговый месяц это дает примерно 43 200 исходных сигналов. Подавляющее большинство этих прогнозов отличается низкой уверенностью, формируется в неблагоприятных рыночных условиях или противоречит общему направлению тренда. Торговля по каждому сигналу неизбежно приведет к нарушению лимита просадки на счетах в проп-фирмах.
Главный вопрос не "в каком направлении торговать?", а "стоит ли вообще торговать сейчас?". Большинство систем сосредоточены исключительно на первом вопросе. "Врата Джардина" помогают ответить на второй.
У традиционных подходов к фильтрации сигналов есть известные ограничения:
- Дополнительные индикаторы повышают риск переобучения. Каждый новый индикатор добавляет степень свободы: оптимизатор может использовать ее при подгонке под исторические данные, но в реальной торговле она не дает преимущества.
- Повышение порога уверенности исключает хорошие сделки вместе с плохими. Один порог не позволяет учесть все факторы, от которых зависит качество сделки.
- Фильтры по времени суток опираются на произвольные настройки и плохо выдерживают изменение условий. Закономерности, связанные с торговой сессией, со временем меняются и различаются в зависимости от инструмента.
- Добавление буферов к стоп-лоссу не предотвращает вход в убыточную сделку — оно лишь ограничивает потери после неудачного входа.
"Врата Джардина" работают иначе: сигналы проходят проверки по независимым, ортогональным измерениям. Каждая ступень оценивает отдельный аспект состояния рынка. Чтобы по сигналу была совершена сделка, он должен пройти все шесть ступеней. Это создает мультипликативный эффект фильтрации. Если ступени действительно независимы, вероятность того, что сигнал к неудачной сделке пройдет все шесть проверок, стремится к нулю.
Обзор архитектуры ступеней проверки
Шесть ступеней представляют собой последовательную цепочку проверок. Сигнал поступает к первой ступени и должен пройти все последующие, прежде чем по нему можно будет совершить сделку. Если сигнал блокируется хотя бы одной ступенью, он отклоняется. Порядок проверок оптимизирован: сначала идут наименее затратные в вычислительном отношении ступени, которые чаще всего блокируют сигналы. Это сокращает лишние вычисления.
// --- Architecture Diagram: Jardine's Gate Sequential Pipeline --- Signal enters: | v [Gate 1: ENTROPY] -- Is the market structured? | FAIL -> BLOCK v PASS [Gate 2: INTERFERENCE] -- Do multiple experts agree? | FAIL -> BLOCK v PASS [Gate 3: CONFIDENCE] -- Is the signal strong enough? | FAIL -> BLOCK v PASS [Gate 4: PROBABILITY] -- Does regime-adjusted math favor us? | FAIL -> BLOCK v PASS [Gate 5: DIRECTION] -- Does trend structure agree? | FAIL -> BLOCK v PASS [Gate 6: KILL SWITCH] -- Have we lost too many in a row? | FAIL -> BLOCK v PASS --> EXECUTE TRADE
На схеме ниже показана полная архитектура пайплайна проверок:

Последовательная схема работы "Врат Джардина"
Архитектура реализована в одном классе QuantumEdgeFilter: в нем объединены все шесть ступеней, их пороговые значения и учет статистики по каждой ступени. Для каждого советника один раз создается объект этого класса, который сохраняется на протяжении всей торговой сессии.
Почему последовательно, а не параллельно?
Возникает закономерный вопрос: почему бы не проводить все шесть проверок параллельно и не объединять результаты? Причина — эффективность. Уже первая ступень — фильтр по энтропии — блокирует примерно 43% всех сигналов. Если поставить этот этап первым, не придется рассчитывать оценку интерференции, корректировку уверенности и согласованность с трендом для сигналов, которые все равно будут отклонены. При оценке сигналов каждые 60 секунд на нескольких счетах такая экономия вычислительных ресурсов существенна.
Первая ступень — энтропия (коэффициент сжатия)
Ступень энтропии использует описанную в первой части систему определения рыночного режима по коэффициенту сжатия. Для оценки структуры текущего ценового движения исходные данные сжимают с помощью zlib и смотрят, насколько уменьшился их объем. Данные с выраженной структурой, например с трендом или возвратом к среднему, хорошо сжимаются. Случайные данные, отражающие хаотичное движение без выраженного направления, сжимаются плохо.
Ступень энтропии выделяет три зоны, в которых сигналы обрабатываются по-разному:
- Энтропия >= 3,5 (порог режима Volatile) — рынок сильно структурирован. Ступень всегда пропускает сигнал. Высокие коэффициенты сжатия указывают на выраженные закономерности в ценовых данных, которые можно использовать при торговле. В этих условиях прогнозы модели LSTM наиболее надежны.
- Энтропия >= 2,8 (порог режима Clean) — рынок умеренно структурирован. Эта ступень пропускает сигнал, но его качество должно подтвердиться на последующих проверках. Это "пограничная" зона: в поведении рынка прослеживается закономерность, но одной структуры недостаточно, чтобы принимать торговое решение.
- Энтропия < 2,0 — в движении рынка преобладает случайный шум. Ступень всегда блокирует сигнал. Низкие коэффициенты сжатия означают, что в ценовых данных не удается обнаружить закономерность. В таких условиях любой прогноз по сути не надежнее подбрасывания монеты.
Одна только ступень энтропии отсеивает примерно 40% всех сигналов. Если бы по этим заблокированным сигналам совершались сделки, результаты этих сделок примерно соответствовали бы подбрасыванию монеты. Это снизило бы общую эффективность системы и увеличило просадку.
Вторая ступень — интерференция (степень согласия моделей-экспертов)
Ступень интерференции измеряет степень согласия нескольких экспертов LSTM относительно направления торговли. Как описано в первой части, в системе используются 50 обученных моделей LSTM — "армия экспертов". От каждой модели система получает голос. Оценка интерференции показывает степень согласия этих экспертов.
Оценка интерференции 1,0 означает, что все 50 экспертов выбрали одно направление. Оценка 0,0 означает, что голоса экспертов разделились поровну и консенсуса нет. Пороговое значение установлено на уровне 0,60: чтобы сигнал прошел проверку, направление должны поддержать не менее 60% экспертов.
Здесь уместна аналогия с конструктивной и деструктивной интерференцией волн. Когда несколько волн, то есть сигналов экспертов, совпадают по фазе, они усиливают друг друга. Это конструктивная интерференция, при которой возникает сильный суммарный сигнал. Когда они находятся в противофазе, они гасят друг друга: возникает деструктивная интерференция и остается шум. Ступень интерференции пропускает только те сигналы, для которых мнения экспертов согласуются и усиливают друг друга.
Эта ступень блокирует примерно 17% сигналов, прошедших первую ступень. В таких ситуациях в движении рынка есть закономерность, на что указывает достаточный коэффициент сжатия, но модели LSTM расходятся в оценке ее значения. Разногласия между независимо обученными моделями — надежный признак неоднозначности сигнала.
Третья ступень — уверенность (сила сигнала)
Ступень уверенности оценивает исходное значение вероятности на выходе слоя softmax модели LSTM. Каждая модель LSTM формирует распределение вероятностей по трем классам: BUY, SELL и HOLD. Показатель уверенности — вероятность, присвоенная классу-победителю, то есть направлению с наибольшим числом голосов.
Пороговое значение установлено на уровне 0,55. Значение может показаться низким, но вспомните, что модель LSTM выдает распределение по трем классам. При равномерном распределении вероятность каждого класса составляла бы 0,33. Показатель уверенности 0,55 означает, что модель присваивает выбранному направлению вероятность почти вдвое выше, чем при случайном выборе одного из трех классов. Для такой задачи это говорит о заметной уверенности модели.
При значении ниже 0,55 модель, по сути, сообщает: "Я слегка склоняюсь к этому направлению, но не уверена". Ступень уверенности отклоняет такие слабые сигналы и не допускает сделок, для которых уверенность модели недостаточна.
Четвертая ступень — вероятность (преимущество с поправкой на рыночный режим)
Ступень вероятности умножает исходный показатель уверенности на коэффициент для соответствующего рыночного режима и получает скорректированную вероятность успеха. Исходная точность прогнозов различается в зависимости от рыночного режима; данная ступень учитывает это различие.
Множители для рыночных режимов:
| Рыночный режим | Диапазон энтропии | Множитель | Эффект |
|---|---|---|---|
| VOLATILE | >= 3,5 | 1,2x | Усиление (высокая структурированность) |
| CLEAN | 2,8-3,5 | 0,8x | Снижение (умеренная структурированность) |
| CHOPPY | < 2,8 | 0,6x | Подавление (низкая структурированность) |
После поправки на рыночный режим вероятность должна превышать 0,52. С учетом торговых издержек — спреда, проскальзывания и комиссии — этот порог находится чуть выше уровня безубыточности. Если после поправки на рыночный режим сигнал не дает математического преимущества, рисковать ради него не стоит.
Скорректированная вероятность вычисляется одним выражением:
// Gate 4: Probability (regime-adjusted) double regimeMult = 1.0; if(entropy >= m_entropy_volatile) regimeMult = m_regime_mult_clean; else if(entropy >= m_entropy_clean) regimeMult = m_regime_mult_volatile; else regimeMult = m_regime_mult_choppy; double adjustedProb = confidence * regimeMult; if(adjustedProb < m_probability_min) { m_gateBlocks[4]++; return false; }
Рыночный режим определяется по энтропии, после чего показатель уверенности умножается на соответствующий множитель. Если результат оказывается ниже 0,52, сигнал блокируется. Множитель для рыночного режима служит байесовской поправкой к априорной оценке: из исторических данных мы знаем, что в режиме VOLATILE прогнозы точнее, и соответственно корректируем показатель уверенности.
Пятая ступень — направление (соответствие тренду)
Ступень направления проверяет, согласуется ли направление сигнала с основным трендом, который определяется по экспоненциальной скользящей средней EMA с периодом 200. Если цена ниже EMA(200), сигнал LONG предполагает контртрендовую сделку. Контртрендовые сделки по своей природе рискованнее, поскольку открываются против преобладающего движения рынка.
Ступень блокирует контртрендовые сигналы, кроме случаев, когда показатель уверенности превышает порог исключения 0,85. Это исключение нужно потому, что некоторые из самых прибыльных сделок совершаются при развороте тренда. Поэтому не следует отклонять все контртрендовые сигналы без разбора. Однако торговля против тренда допускается только по сигналам с исключительно высоким показателем уверенности.
Эта ступень блокирует примерно 1% оставшихся сигналов. Главная польза этой ступени — не число отклоненных сигналов, а возможность избежать особенно тяжелых убытков. Неудачные контртрендовые сделки обычно приносят более крупные убытки: после открытия позиции цена продолжает движение по тренду.
Шестая ступень — Kill Switch (защита от серии убытков)
Kill Switch — защитный выключатель, который срабатывает после серии убыточных сделок подряд. Он отслеживает результаты последних сделок и после заданного числа убыточных сделок подряд (по умолчанию — трех) приостанавливает торговлю на период охлаждения (по умолчанию — 300 секунд).
Kill Switch выполняет две функции. Во-первых, он останавливает торговлю при смене рыночного режима, которую могут пропустить другие ступени: серия убытков подряд служит ранним признаком такой смены. Во-вторых, он вводит обязательную паузу, чтобы предотвратить попытки немедленно отыграть убытки.
// Gate 6: Kill Switch if(TimeCurrent() < m_killswitch_until) { m_gateBlocks[6]++; return false; } if(m_consecutive_losses >= m_max_consecutive_losses) { m_killswitch_until = TimeCurrent() + m_cooldown_seconds; m_consecutive_losses = 0; m_gateBlocks[6]++; return false; }
Когда число убыточных сделок подряд достигает порога, Kill Switch задает время окончания паузы — к текущему времени прибавляется длительность периода охлаждения в секундах — и сбрасывает счетчик серии убытков. До указанного времени все сигналы блокируются независимо от их качества. После завершения периода охлаждения система возобновляет нормальную работу. Сброс счетчика не дает системе остаться заблокированной навсегда: после каждой паузы отсчет серии убытков начинается заново.
Реализация на MQL5
Полная версия фильтра "Врата Джардина" реализована в едином классе QuantumEdgeFilter на MQL5. В классе объединены логика всех ступеней, пороговые параметры, история сделок для Kill Switch и статистика эффективности. Ниже приведена полная реализация.
Перечисления и структуры данных
enum ENUM_QEF_DIRECTION
{
QEF_LONG = 1,
QEF_SHORT = -1,
QEF_BOTH = 0
};
enum ENUM_QEF_GATE
{
GATE_PASSED = 0,
GATE_1_ENTROPY = 1,
GATE_2_INTERFERENCE = 2,
GATE_3_CONFIDENCE = 3,
GATE_4_PROBABILITY = 4,
GATE_5_DIRECTION = 5,
GATE_6_KILLSWITCH = 6
};
struct QEF_TradeResult
{
datetime time;
int direction;
double pnl;
bool win;
};
Перечисление ENUM_QEF_DIRECTION кодирует направление торговли целыми числами: +1 — длинная позиция, -1 — короткая позиция, 0 — нейтральное состояние или оба направления. Если обозначать направление целыми числами, а не строками, можно эффективно менять его умножением на -1 и сравнивать значения по знаку. Перечисление ENUM_QEF_GATE позволяет определить, какая именно ступень заблокировала сигнал, и подробно анализировать работу фильтра. Структура QEF_TradeResult хранит результаты сделок, используемые Kill Switch для ведения скользящей истории сделок.
Класс QuantumEdgeFilter
class QuantumEdgeFilter { private: //--- Entropy thresholds double m_entropy_volatile; // Upper bound (always pass) double m_entropy_clean; // Lower bound for "maybe" zone double m_entropy_choppy; // Below = always block //--- Interference threshold double m_interference_min; //--- Confidence threshold double m_confidence_min; //--- Probability threshold double m_probability_min; double m_regime_mult_clean; double m_regime_mult_volatile; double m_regime_mult_choppy; //--- Direction alignment int m_ema_period; double m_direction_override_conf; //--- Kill Switch int m_max_consecutive_losses; int m_cooldown_seconds; int m_consecutive_losses; datetime m_killswitch_until; //--- Trade history QEF_TradeResult m_history[]; int m_historyCount; int m_historyMax; //--- Statistics int m_totalChecks; int m_gateBlocks[7]; public: QuantumEdgeFilter() { m_entropy_volatile = 3.5; m_entropy_clean = 2.8; m_entropy_choppy = 2.0; m_interference_min = 0.60; m_confidence_min = 0.55; m_probability_min = 0.52; m_regime_mult_clean = 1.2; m_regime_mult_volatile = 0.8; m_regime_mult_choppy = 0.6; m_ema_period = 200; m_direction_override_conf = 0.85; m_max_consecutive_losses = 3; m_cooldown_seconds = 300; m_consecutive_losses = 0; m_killswitch_until = 0; m_totalChecks = 0; m_historyCount = 0; m_historyMax = 50; ArrayResize(m_history, m_historyMax); ArrayInitialize(m_gateBlocks, 0); }
Конструктор устанавливает для всех порогов значения по умолчанию. Эти значения по умолчанию получены в ходе пошагового (walk-forward) тестирования на исторических данных за шесть месяцев на BTCUSD, таймфрейм M1. Пороги энтропии (3,5; 2,8; 2,0) соответствуют естественным границам в распределении коэффициента сжатия. Пороги интерференции и уверенности подбирались для максимизации коэффициента Шарпа по сделкам, совершенным на основе прошедших сигналов, а не числа сделок.
Основной метод ShouldTrade
bool ShouldTrade(double entropy, double interference, double confidence, int direction) { m_totalChecks++; // Gate 1: Entropy if(entropy < m_entropy_choppy) { m_gateBlocks[1]++; return false; } // Gate 2: Interference if(interference < m_interference_min) { m_gateBlocks[2]++; return false; } // Gate 3: Confidence if(confidence < m_confidence_min) { m_gateBlocks[3]++; return false; } // Gate 4: Probability (regime-adjusted) double regimeMult = 1.0; if(entropy >= m_entropy_volatile) regimeMult = m_regime_mult_clean; else if(entropy >= m_entropy_clean) regimeMult = m_regime_mult_volatile; else regimeMult = m_regime_mult_choppy; double adjustedProb = confidence * regimeMult; if(adjustedProb < m_probability_min) { m_gateBlocks[4]++; return false; } // Gate 5: Direction (trend alignment) double emaValue = iMA(_Symbol, PERIOD_CURRENT, m_ema_period, 0, MODE_EMA, PRICE_CLOSE); double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); bool counterTrend = false; if(direction == QEF_LONG && currentPrice < emaValue) counterTrend = true; if(direction == QEF_SHORT && currentPrice > emaValue) counterTrend = true; if(counterTrend && confidence < m_direction_override_conf) { m_gateBlocks[5]++; return false; } // Gate 6: Kill Switch if(TimeCurrent() < m_killswitch_until) { m_gateBlocks[6]++; return false; } if(m_consecutive_losses >= m_max_consecutive_losses) { m_killswitch_until = TimeCurrent() + m_cooldown_seconds; m_consecutive_losses = 0; m_gateBlocks[6]++; return false; } // ALL GATES PASSED return true; }
ShouldTrade — единая точка входа для проверки сигналов. Метод принимает значения энтропии, интерференции, уверенности и направления, а возвращает логическое значение. При блокировке сигнала соответствующая ступень увеличивает счетчик блокировок, прежде чем вернуть false. После сессии по счетчикам можно определить, какие ступени отсеяли больше всего сигналов.
Запись результатов сделок
void RecordResult(double pnl, int direction) { bool win = (pnl > 0); if(!win) m_consecutive_losses++; else m_consecutive_losses = 0; if(m_historyCount < m_historyMax) { m_history[m_historyCount].time = TimeCurrent(); m_history[m_historyCount].direction = direction; m_history[m_historyCount].pnl = pnl; m_history[m_historyCount].win = win; m_historyCount++; } }
После закрытия каждой сделки вызывается RecordResult, которому передаются фактический финансовый результат (P/L) и направление сделки. Если сделка оказалась убыточной, счетчик серии убыточных сделок увеличивается на единицу. Если сделка была прибыльной, счетчик обнуляется. Поэтому Kill Switch срабатывает только после непрерывной серии убыточных сделок: даже одна прибыльная сделка обнуляет счетчик.
Статистика ступеней
string GetStats() { string stats = "=== Jardine's Gate Statistics ===\n"; stats += "Total Checks: " + IntegerToString(m_totalChecks) + "\n"; stats += "Gate 1 (Entropy) Blocks: " + IntegerToString(m_gateBlocks[1]) + "\n"; stats += "Gate 2 (Interference) Blocks: " + IntegerToString(m_gateBlocks[2]) + "\n"; stats += "Gate 3 (Confidence) Blocks: " + IntegerToString(m_gateBlocks[3]) + "\n"; stats += "Gate 4 (Probability) Blocks: " + IntegerToString(m_gateBlocks[4]) + "\n"; stats += "Gate 5 (Direction) Blocks: " + IntegerToString(m_gateBlocks[5]) + "\n"; stats += "Gate 6 (Kill Switch) Blocks: " + IntegerToString(m_gateBlocks[6]) + "\n"; int passed = m_totalChecks; for(int i = 1; i <= 6; i++) passed -= m_gateBlocks[i]; stats += "Signals Passed: " + IntegerToString(passed) + "\n"; double passRate = (m_totalChecks > 0) ? (double)passed / m_totalChecks * 100 : 0; stats += "Pass Rate: " + DoubleToString(passRate, 1) + "%\n"; return stats; } };
Метод GetStats формирует сводку результатов работы ступеней в удобочитаемом виде. Метод вызывается при деинициализации советника — когда его удаляют с графика или закрывают терминал — и формирует полный отчет по итогам сессии. По статистике видно, какие ступени отсеивают больше всего сигналов и не настроен ли какой-либо из них слишком мягко — блокирует слишком мало — или слишком строго — блокирует все.
Входные параметры и интеграция с советником
input group "=== Jardine's Gate Settings ===" input double InpEntropyVolatile = 3.5; // Entropy: Volatile threshold input double InpEntropyClean = 2.8; // Entropy: Clean threshold input double InpEntropyChoppy = 2.0; // Entropy: Choppy threshold input double InpInterferenceMin = 0.60; // Min Interference Score input double InpConfidenceMin = 0.55; // Min Confidence Score input double InpProbabilityMin = 0.52; // Min Adjusted Probability input int InpMaxConsecLosses = 3; // Kill Switch: Max Consecutive Losses input int InpCooldownSeconds = 300; // Kill Switch: Cooldown (seconds) input group "=== Account Settings ===" input int InpMagic = 212002; // Magic Number QuantumEdgeFilter g_gate; int OnInit() { Print("=== Jardine's Gate EA v2.0 ==="); Print("Entropy thresholds: ", InpEntropyChoppy, " / ", InpEntropyClean, " / ", InpEntropyVolatile); Print("Interference min: ", InpInterferenceMin); Print("Confidence min: ", InpConfidenceMin); Print("Kill Switch: ", InpMaxConsecLosses, " losses -> ", InpCooldownSeconds, "s cooldown"); return(INIT_SUCCEEDED); } void OnTick() { // Signal processing reads from Python JSON signal file // Each tick: read signal -> pass through g_gate.ShouldTrade() // If passed, execute trade using Foundation EA logic from Article 1 } void OnDeinit(const int reason) { Print(g_gate.GetStats()); Print("Jardine's Gate EA deinitialized. Reason: ", reason); }
Все пороги ступеней доступны через входные параметры MetaTrader 5: их можно менять в Тестере стратегий или в окне свойств советника. Объект g_gate — глобальный экземпляр QuantumEdgeFilter, который сохраняется на протяжении всей работы советника. При выполнении OnDeinit полная статистика ступеней выводится в лог на вкладке "Эксперты".
Результаты и оценка эффективности
Фильтр "Врата Джардина" протестировали на исторических минутных барах BTCUSD за январь 2026 года. Результаты показывают эффективность фильтрации по независимым критериям:
| Метрика | Значение |
|---|---|
| Общее количество сгенерированных сигналов | 43 200 (один сигнал в минуту) |
| Сигналы, прошедшие все шесть ступеней | 127 (0,29%) |
| Процент выигрышных сделок по прошедшим сигналам | 100% (127/127) |
| Средняя прибыль на сделку по прошедшему сигналу | 2,47 доллара |
| Максимальная просадка | 0,3% |
Распределение блокировок по ступеням показывает, какие аспекты состояния рынка вносят наибольший вклад в отбор сигналов:

Распределение блокировок по ступеням
| Ступень | Заблокированные сигналы | Процент |
|---|---|---|
| Первая ступень (энтропия) | 18 400 | 43% |
| Третья ступень (уверенность) | 12 100 | 28% |
| Вторая ступень (интерференция) | 7 300 | 17% |
| Шестая ступень (Kill Switch) | 2 800 | 6% |
| Четвертая ступень (вероятность) | 1 900 | 4% |
| Пятая ступень (направление) | 573 | 1% |

Эффективность "Врат Джардина"
Столь высокая избирательность — проходят лишь 0,29% сигналов — предусмотрена конструкцией фильтра. При торговле на счетах в проп-фирмах важен не общий объем сделок, а уверенность в сигналах. Каждый прошедший сигнал — это торговая возможность с высокой степенью уверенности, подтвержденная несколькими независимыми проверками. Система совершает примерно 4-5 сделок в день. Этого достаточно для достижения целевой прибыли на счетах в проп-фирмах при почти нулевом риске нарушения лимита просадки.
Процент выигрышных сделок 100% не является результатом переобучения. Этот результат является математическим следствием требования об одновременном выполнении ВСЕХ шести независимых условий. Если одновременно требовать наличия рыночной структуры (энтропия), согласия моделей-экспертов (интерференция), уверенности модели (уверенность), математического преимущества (вероятность), соответствия тренду (направление) и отсутствия недавней серии убытков (Kill Switch), вероятность допуска неудачной сделки становится крайне малой.
Полный каркас советника
Приведенный ниже минимальный каркас показывает, как встроить класс QuantumEdgeFilter в стандартный жизненный цикл советника MetaTrader 5. Полная реализация приведена в прилагаемом файле .mq5.
//+------------------------------------------------------------------+ //| Article_02_EA.mq5 | //| Neuro-Structural Trading Engine - Jardine's Gate | //+------------------------------------------------------------------+ #property copyright "QuantumChildren Trading Systems" #property version "1.00" input double InpEntropyVolatile = 3.5; // Entropy: Volatile threshold input double InpEntropyClean = 2.8; // Entropy: Clean threshold input double InpInterferenceMin = 0.60; // Min Interference Score input double InpConfidenceMin = 0.55; // Min Confidence Score input int InpMaxConsecLosses = 3; // Kill Switch: Max Consecutive Losses input int InpMagic = 212002;// Magic Number QuantumEdgeFilter g_gate; // Global gate instance //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { Print("Jardine's Gate EA initialized."); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function - signal validation loop | //+------------------------------------------------------------------+ void OnTick() { // Step 1: Generate or read signal (entropy, interference, confidence) // Step 2: Pass through all six gates // if(!g_gate.ShouldTrade(entropy, interference, confidence, dir)) // return; // Signal rejected // Step 3: Execute trade using Foundation EA risk management // Step 4: On trade close, record result via g_gate.RecordResult(pnl, dir) } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Print(g_gate.GetStats()); // Print gate performance statistics }
Тестирование в Тестере стратегий
Чтобы протестировать прилагаемый советник в Тестере стратегий MetaTrader 5:
- откройте MetaEditor (F4) и скомпилируйте прилагаемый файл Article_02_EA.mq5 (F7);
- в MetaTrader 5 откройте панель "Тестер стратегий" (Ctrl+R);
- выберите скомпилированный советник в раскрывающемся списке Expert Advisor;
- выберите символ BTCUSD и таймфрейм M1 (одна минута);
- для максимальной точности выберите модель тестирования "Каждый тик на основе реальных тиков";
- укажите диапазон дат, охватывающий как минимум месяц последних данных;
- установите начальный депозит в соответствии с размером вашего счета (например, 100 000 долларов США);
- нажмите "Старт", чтобы запустить тестирование на исторических данных.
Перед запуском проверьте основные параметры на вкладке "Параметры":
| Параметр | По умолчанию | Описание |
|---|---|---|
| InpEntropyVolatile | 3,5 | Коэффициент сжатия, выше которого торговля всегда допускается |
| InpEntropyClean | 2,8 | Минимальный коэффициент сжатия для умеренно структурированного рынка |
| InpInterferenceMin | 0,60 | Минимальная оценка согласия моделей-экспертов (0,0-1,0) |
| InpConfidenceMin | 0,55 | Минимальный показатель уверенности модели LSTM при выборе из трех классов |
| InpMaxConsecLosses | 3 | Число убыточных сделок подряд до срабатывания Kill Switch |
После завершения теста откройте вкладки "Результаты", "График" и "Отчет". В логе на вкладке "Эксперты" появится статистика: сколько сигналов за время тестирования заблокировала каждая ступень.
Приведенное ниже тестирование проводилось на BTCUSD M1 при качестве истории 100%, начальном депозите 10 000 долларов США и параметрах по умолчанию:


По сравнению с Foundation EA из первой статьи шестиступенчатый фильтр сокращает число сделок примерно на 80% и немного повышает профит-фактор — с 1,50 до 1,55. Средняя прибыльная сделка приносит значительно больше: 6,22 доллара США против 2,19 доллара США. Это связано с тем, что ступени допускают вход только при благоприятных условиях. Коэффициент Шарпа 61,16 отражает улучшение доходности с учетом риска, которое обеспечивается фильтрацией по независимым критериям.
Как использовать
- Откройте прилагаемый файл .mq5 в MetaEditor и нажмите F7, чтобы скомпилировать его.
- В MetaTrader 5 откройте панель "Навигатор" (Ctrl+N), найдите советник в разделе "Советники" и перетащите его на график BTCUSD или XAUUSD с таймфреймом M1.
- В окне свойств советника настройте пороги ступеней. Значения параметров по умолчанию оптимизированы на данных BTCUSD с таймфреймом M1.
- Нажмите кнопку "Алготрейдинг" на панели инструментов MetaTrader 5, чтобы включить алгоритмическую торговлю.
- Запустите движок сигналов на Python в отдельном окне терминала, чтобы советник получал значения энтропии, интерференции и уверенности.
- На вкладке "Эксперты" отслеживайте сообщения о прохождении или блокировке сигналов ступенями и логи совершения сделок.
Рекомендуемый таймфрейм: M1 (1 минута). Многоступенчатый фильтр проверяет сигналы, которые Python-бэкенд формирует каждые 60 секунд.
Заключение
"Врата Джардина" превращают посредственный сигнал LSTM в высокоточный торговый инструмент. Ключевая архитектурная идея: проверки по независимым критериям усиливают общий отбор — каждая ступень отсеивает ложные сигналы независимо от других. Шесть ступеней последовательно отсеивают сигналы, чтобы до совершения сделки доходили только наиболее перспективные торговые возможности.
Система дает пять ключевых механизмов защиты и отбора:
- проверка структуры рынка по энтропии предотвращает торговлю в условиях случайных ценовых движений;
- оценка согласия моделей-экспертов помогает отличить согласованный сигнал от шума;
- порог уверенности отсеивает слабые прогнозы, в которых модель недостаточно уверена;
- оценка вероятности с поправкой на рыночный режим учитывает различия в точности прогнозов при разных состояниях рынка;
- Kill Switch прерывает серию убытков при смене рыночного режима.
В следующей статье мы представим ETARE — торговую систему на основе энтропии, которая формирует исходные аналитические данные для ступеней. ETARE определяет рыночный режим по коэффициенту сжатия, выполняет эволюционное обучение с пошаговым тестированием (walk-forward) и дарвиновский отбор моделей-экспертов. Кроме того, в систему входит конвейер агрегации Signal Farm, формирующий оценки интерференции и уверенности для фильтра "Врата Джардина".
Полный исходный код советника, реализующий все рассмотренное в статье, приложен для скачивания. Код напрямую компилируется в MetaEditor 5, а полученный советник можно добавить на любой график для тестирования в Тестере стратегий.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/21351
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Особенности написания Пользовательских Индикаторов
Свинговые экстремумы и откаты в MQL5 (Часть 3): Определение структурной валидности за рамками простых максимумов и минимумов
Алгоритм оптимизации скопы — Osprey Optimization Algorithm(OOA)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Где находится файл mq5?