Кодекс рыночных состояний в MQL5 (Часть 2): Побитовое обучение и мультипаттерны на примере Nvidia
Введение
В нашей предыдущей пилотной статье о рыночном позиционировании мы использовали акции Nvidia Corp (NVDA) в качестве актива, чтобы определить, могут ли стратегии с одним типом позиции быть эффективными при реальном применении после масштабного тестирования. Наше тестовое окно было ограничено из-за сплитов акций Nvidia, поэтому нам пришлось обучать модель на узком двухлетнем диапазоне, а затем проводить годовой форвардный тест. Оба периода находились в промежутке между двумя недавними сплитами NVDA. Эти сплиты, хотя и могут сильно исказить результаты, если их не учитывать в Strategy Tester, обычно обрабатываются большинством брокеров, включая тех, кто предлагает MetaTrader, путем закрытия позиций трейдеров по высокой цене и повторного открытия их с увеличенным объемом по новой цене без ухудшения финансового результата позиции. Мы продолжаем наше исследование NVDA, рассматривая паттерны с 5 по 9 для пары индикаторов RSI и DeMarker.
Паттерн 5, основанный на согласовании наклонов и расширении диапазона
Шестой сигнал, который мы рассматриваем, отбирает рыночные движения с высокой уверенностью сигнала за счет объединения метрик наклона RSI и DeMarker с расширением ценового диапазона high-low. Обычно это указывает на рост активности трейдеров, а также на повышение волатильности. Условие для покупки фиксируется, когда наклон RSI за 3 бара положительный, и DeMarker также показывает аналогичное состояние за свои 3 бара. Ценовой диапазон текущего бара, где под текущим понимается последний завершенный ценовой бар с индексом 1, также должен быть больше диапазона предыдущего бара на оптимизированном расстоянии в прошлом. Когда текущая цена закрытия находится в верхних 25 процентах своего диапазона, это сигнализирует о давлении покупателей. Графическое представление этого условия выглядит следующим образом:
Наклон RSI(3) > 0, наклон DeMarker(3) > 0, И диапазон текущего бара (high-low) > 1,2 × средний диапазон(range, 10), то есть расширение диапазона, — цена должна закрыться в верхних 25% бара.
В качестве примечания: с учетом нашего подхода только в длинную сторону, требования для продажи также выполняются, когда наклоны RSI и DeMarker отрицательны на трехбарном периоде, а текущий диапазон high-low увеличился сильнее, чем диапазон одного из прошлых баров. Этот прошлый ориентир можно настраивать и оптимизировать, и мы принимаем его период равным периоду используемых нами средних значений, чтобы сократить количество оптимизируемых параметров. Разумеется, читатели могут изменить это, однако логика здесь заключается в осторожном отношении к переобучению на исторических данных. Текущая цена закрытия также должна находиться в нижних 25 процентах диапазона текущего ценового бара, чтобы подтвердить наличие давления продавцов. Мы реализуем это в MQL5 следующим образом:
//+------------------------------------------------------------------+ //| Check for Pattern 5. | //6) Slope Confluence with Volume/Range Expansion //+------------------------------------------------------------------+ bool CSignalRSI_DeMarker_SL::IsPattern_5(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY) { return(Hi(X() + m_past + 1) - Lo(X() + m_past + 1) < Hi(X() + 1) - Lo(X() + 1) && RSI(X()) - RSI(X() + 3) > 0.0 && DeMarker(X()) - DeMarker(X() + 3) > 0.0); } else if(T == POSITION_TYPE_SELL) { return(Hi(X() + m_past + 1) - Lo(X() + m_past + 1) < Hi(X() + 1) - Lo(X() + 1) && RSI(X()) - RSI(X() + 3) < 0.0 && DeMarker(X()) - DeMarker(X() + 3) < 0.0); } return(false); }
Паттерн 5 разработан так, чтобы эффективно фильтровать бары, демонстрирующие одновременное ускорение импульса, измеряемое через наклоны индикаторов, при одновременной фиксации сильных ценовых движений за счет расширения диапазона. Требуя, чтобы оба осциллятора совпадали по направлению, мы тем самым подтверждаем, что расширение диапазона сопровождается согласованным импульсом индикаторов. Таким образом, мы отбираем движения с высокой уверенностью сигнала, а не просто всплески, которые могут оказаться кратковременными. Результаты форвардного теста для этого паттерна, проведенного в период с 01.06.2023 по 01.06.2024 на 15-минутном таймфрейме, дают нам следующий отчет:
Согласно приведенному выше отчету, паттерн 5, основанный на согласовании наклонов и расширении диапазона, показывает скромный, но устойчивый результат. При начальном депозите в 10 000 USD нам удалось зафиксировать чистую прибыль в размере 2 251 USD. Убыточных сделок не было зафиксировано; было открыто 42 позиции, все — в длинном направлении, согласно нашему протоколу тестирования, в рамках которого мы намерены одновременно проверять несколько сигнальных паттернов. При неограниченном профит факторе ожидаемый выигрыш составил 53,6, а крупнейшая прибыльная сделка — 173,76. Мы проводили тестирование с фиксированной маржой, а не с фиксированным лотом, поэтому эти числа не обязательно имеют такое же значение, но, тем не менее, они являются заслуживающими внимания ориентирами. Просадка по эквити находилась ниже одного процента, а просадка по балансу отсутствовала. Фактор восстановления составил 2,5 при коэффициенте Шарпа 6,32. Все это, вместе с идеальной LR-корреляцией 1,00, указывает на то, что логика входов хорошо совпадала с преобладающим трендом NVDA.
С концептуальной точки зрения, согласование наклонов RSI и DeMarker вместе с расширением диапазона продолжает цепляться за всплески бычьего направления после сжатия, однако в данном форвардном тесте, по-видимому, делает это избирательно. Поскольку зафиксированных убытков у нас нет, основной риск паттерна 5, вероятно, заключается во внутрисделочных просадках по эквити, а также в возникновении ложных расширений в будущем. В нашем тестовом окне они не встретились, поскольку мы находились в крупном бычьем периоде между двумя значительными сплитами акций. Поэтому добавление явных проверок волатильности, более жесткой логики стопов или консервативного размера позиции, настроенного на волатильность, — все это дополнительные меры, которые можно использовать для его улучшения.
Паттерн 6: Опережающая цена и запаздывающие индикаторы
Наш седьмой сигнал, паттерн 6, размещает сделки на основе входов после отката, выявляя случаи, когда цена, как правило, первой показывает явный импульсный пробой, тогда как RSI и DeMarker запаздывают и при этом не указывают на истощение. Графическое представление этого условия может выглядеть следующим образом:
Цена формирует импульсное движение вверх, то есть более высокий максимум, затем откатывается к 21-EMA; RSI при этом все еще выше 45, а DeMarker выше 0,45, то есть без серьезного падения индикаторов, — вход выполняется, когда наклон RSI снова становится положительным.
Условие покупки срабатывает, когда цена совершает импульсное движение вверх, формируя более высокий максимум, а затем откатывается к ключевому уровню поддержки, которым в рамках этой статьи является оптимизированная по периоду экспоненциальная скользящая средняя. Эта EMA обозначает важную динамическую поддержку, и если RSI остается выше 45, а DeMarker также находится выше 0,45, это можно интерпретировать как отсутствие серьезной потери импульса. Вход в длинную позицию должен срабатывать, когда наклон RSI снова становится положительным, то есть когда импульс возобновляется. Мы реализуем это в MQL5 следующим образом:
//+------------------------------------------------------------------+ //| Check for Pattern 6. | //7) Price Leading, Indicator Lagging (confirm pullback entries) //+------------------------------------------------------------------+ bool CSignalRSI_DeMarker_SL::IsPattern_6(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY) { return(High(X() + 2) < High(X() + 1) && High(X() + 1) > High(X()) && Close(X()) <= Cl(X()) && RSI(X()) > 45.0 && DeMarker(X()) > 0.45); } else if(T == POSITION_TYPE_SELL) { return(Low(X() + 2) > Low(X() + 1) && Low(X() + 1) < Low(X()) && Close(X()) >= Cl(X()) && RSI(X()) < 55.0 && DeMarker(X()) < 0.55); } return(false); }
Условие продажи, с другой стороны, возникает тогда, когда цена совершает импульсное движение вниз, регистрируя новый минимум, а затем откатывается вверх к условному уровню сопротивления. Это сопротивление является динамическим и, как и в условии покупки, представляет собой EMA с оптимизируемым периодом. RSI должен быть ниже 55, а DeMarker также не должен превышать 0,55 — это признак слабого, но все еще проявляющегося медвежьего импульса. Вход может выполняться, когда наклон RSI становится отрицательным, подтверждая, что развивается медвежье продолжение. Форвардное тестирование этого сигнала после обучения на периоде с 01.08.2021 по 01.06.2023 дало нам следующий отчет:
Этот сигнальный паттерн, основанный на опережающей цене и запаздывающих индикаторах, принес нам прибыль в размере 2 532 USD при начальном депозите 10 000 USD. Всего в процессе было открыто 26 позиций, и все они закрылись в плюсе. Ожидаемый выигрыш составил 97, коэффициент Шарпа — достойные 5,32, а LR-корреляция — идеальные 1,0. Однако еще более примечательной оказалась максимальная просадка по эквити, которая была близка к нулю при тестировании на доступных брокерских тиках. Нам удалось успешно позволить монетизировать подтверждённые входы на откатах в рамках упорядоченных движений продолжения.
С концептуальной точки зрения этот паттерн опирается на идею о том, что ценовой импульс идет первым, а индикаторы должны подтверждать, что эти движения все еще сохраняются и не исчерпаны. Крупнейшая отдельная прибыльная сделка составила 195 USD, также без убытков. Это продолжает нашу основную мысль: речь идет не о неуязвимости, а о мягком периоде, в котором мы проводили форвардный тест паттерна. Серия из 26 «победных» сделок, если это вообще имеет значение в данном контексте, выглядит впечатляюще на бумаге, но ничего не говорит о результативности в медвежьих или пилообразных рыночных условиях. Дополнительная система стопов представляется обязательной, учитывая, что в нашем тестировании даже не задействуются трейлинг-стопы. Эти изменения можно легко внести в диалоговых окнах сборки Wizard. Необходимость продумать динамические правила выхода, а также стопы с учетом волатильности, как это реализовано в готовых пользовательских модулях MQL5 Wizard, безусловно, стоит учитывать, если планируется пережить режим, более сложный, чем бычий период NVDA.
Паттерн 7: Несоответствие индикаторов
Восьмой сигнал, паттерн 7, использует особое расхождение между осциллятором DeMarker и осциллятором RSI для получения ранних сигналов входа. Мы отслеживаем формации M/W на DeMarker, одновременно анализируя относительное положение RSI относительно нейтрального уровня 50. Наше типичное графическое представление этого паттерна выглядит следующим образом:
DeMarker формирует W, то есть два повышающихся минимума, тогда как RSI все еще находится ниже 50, но разворачивается вверх: наклон RSI(2) > 0. Вход выполняется, когда цена закрывается выше последнего локального максимума.
Условие покупки срабатывает, когда DeMarker формирует W-образную формацию с двумя нижними U-образными впадинами, которые повышаются, либо вторая впадина находится на уровне первой или выше нее; при этом RSI находится ниже уровня 50, но имеет положительный наклон на двух ценовых барах. Вход может выполняться, когда цена закрывается выше последнего малого локального максимума, подтверждая бычий сценарий. Мы реализуем это в MQL5 следующим образом:
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //8) Indicator Mismatch (one leading, one confirming) //+------------------------------------------------------------------+ bool CSignalRSI_DeMarker_SL::IsPattern_7(ENUM_POSITION_TYPE T) { vector _demarker; _demarker.Init(fmax(5, m_past)); for(int i = 0; i < fmax(5, m_past); i++) { _demarker[i] = DeMarker(i); } if(T == POSITION_TYPE_BUY) { return(IsW(_demarker) && RSI(X()) - RSI(X() + 2) > 0.0 && Close(X()) >= High(X() + 1)); } else if(T == POSITION_TYPE_SELL) { return(IsM(_demarker) && RSI(X()) - RSI(X() + 2) < 0.0 && Close(X()) <= Low(X() + 1)); } return(false); }
Условие продажи фиксируется, когда DeMarker на этот раз формирует M-образную формацию, также обозначенную двумя понижающимися строчными «n», при этом вторая находится на уровне первой или ниже нее, а RSI расположен выше 50, но имеет отрицательный наклон. Вход может выполняться после того, как цена пробивает вниз последний малый swing low. Приведенный выше исходный код определяет локальные экстремумы DeMarker в окне поиска abc, которое всегда составляет не менее 5, а также проверяет наклоны осциллятора перед поиском соответствующего подтверждения со стороны ценового действия. Форвардный тест паттерна 7 представил нам следующий отчет:
Восьмой сигнальный паттерн показывает ровный профиль доходности, увеличив начальный депозит в 10 000 USD на 2 570 после размещения 52 сделок. И снова, возможно, неудивительно, нам удается достичь 100-процентной доли прибыльных сделок с использованием идеи несоответствия индикаторов. Коэффициент Шарпа составил 8,17, что выше, чем у двух предыдущих паттернов, рассмотренных выше, а LR-корреляция почти идеальна — 0,99. Таким образом, наши входы способны корректно отслеживать ценовое движение Nvidia и избегать ненужных неблагоприятных отклонений. Наихудшая просадка по эквити составила 9 процентов, что, хотя и является значительным значением, может быть управляемым и указывает на более стабильное кривую капитала, когда действует рыночный режим продолжения пробоя. Паттерн 7 опирается на подтверждения RSI и DeMarker и заставляет эту связку работать за счет синхронизированного тайминга, позволяющего последовательно захватывать рыночные продолжения, избегая при этом шумных пилообразных движений возврата к среднему.
С концептуальной точки зрения этот паттерн пытается использовать DeMarker как предварительный сигнал силы или слабости преобладающего рыночного тренда, тогда как RSI играет роль более медленного фильтра импульса. В нашем тестировании это партнерство проявляется скорее как контролируемая передача инициативы, а не как перетягивание каната. Наша крупнейшая прибыльная сделка превысила 600, а средняя прибыль была почти такой же. Поскольку убытков не было понесено, наши крупные победители не исправляли вмятины на кривой эквити, и нам нечего было сказать о recovery factor. Мы зафиксировали 52 прибыльные сделки в несколько волатильной, но в основном бычьей среде, что, как и в случае с другими паттернами, подразумевает необходимость повторных прогонов за пределами этого окна, чтобы сделать более надежные выводы. Хотя это взаимодействие связки опережающего и запаздывающего сигналов, безусловно, выглядит перспективным, дальнейшая работа над паттерном представляется уместной не только через тестирование за пределами его предполагаемой комфортной зоны. После этого ранее упомянутые фильтры волатильности и механизмы управления стоп-лоссом, предложенные для предыдущих паттернов, можно рассматривать как дополнительные элементы.
Паттерн 8: Последовательная лестница наклонов
Наш предпоследний паттерн задействует проверку наклонов на нескольких периодах как стратегию повышения прогнозной надежности за счет наложения фильтров импульса на коротком, среднем и более длинном горизонтах при измерении наклона RSI. Это сочетается с текущим наклоном DeMarker как релевантным подтверждением заданного тренда. Графическое представление для сигнала покупки выглядит следующим образом:
Наклон RSI(1) > 0, наклон RSI(3) > 0, наклон RSI(5) > 0, то есть монотонно положительные наклоны от краткосрочного к долгосрочному горизонту, И наклон DeMarker(1) > 0.
При такой логике условие покупки фиксируется, когда RSI на одном баре, трех барах и пяти барах показывает положительный наклон, а DeMarker за один бар также находится в плюсе. Это должно отражать монотонно возрастающую «лестницу наклонов» на последовательных, расширяющихся временных горизонтах. Предполагается, что она указывает на восходящий импульс. Мы реализуем это в MQL5 следующим образом:
//+------------------------------------------------------------------+ //| Check for Pattern 8. | //9) Sequential Slope Ladder (multi-period confirmation) //+------------------------------------------------------------------+ bool CSignalRSI_DeMarker_SL::IsPattern_8(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY) { return(RSI(X()) - RSI(X() + 1) > 0.0 && RSI(X()) - RSI(X() + 3) > 0.0 && RSI(X()) - RSI(X() + 5) > 0.0 && DeMarker(X()) - DeMarker(X() + 1) > 0.0); } else if(T == POSITION_TYPE_SELL) { return(RSI(X()) - RSI(X() + 1) < 0.0 && RSI(X()) - RSI(X() + 3) < 0.0 && RSI(X()) - RSI(X() + 5) < 0.0 && DeMarker(X()) - DeMarker(X() + 1) < 0.0); } return(false); }
Обратные условия продажи предполагают, что RSI также фиксирует отрицательный наклон на периодах в один, три и пять баров, при этом осциллятор DeMarker также в данный момент находится в зоне отрицательного наклона. Это первый рассматриваемый нами сигнал, в котором ценовое действие вообще не учитывается, что само по себе должно быть опасным. Форвардный тест, проведенный в период с 01.06.2023 по 01.06.2024 после обучения на периоде с 01.08.2021 по 01.06.2023, дал нам следующий отчет:
Паттерн 8 представлял собой последовательную стратегию "лестницы наклонов", предназначенную для извлечения импульса из наложенных наклонов RSI и DeMarker. Он показал еще один чистый результат, исполняя только длинные позиции на фоне бычьего движения NVDA. Получив 2 894 USD прибыли на депозите 10 000 USD, паттерн 8 дает прирост 54,6 на сделку. Мы открыли 53 позиции, и снова все они закрылись в плюсе, что означает неограниченный или NaN профит фактор, где указанное значение ноль является лишь заполнителем. Указанная просадка по эквити составила 8,8 процента, а в абсолютном выражении — чуть более 900 USD. Исходя из стартового капитала 10 000 USD, эти значения комфортно находятся в пределах нашей зоны риска, при этом оставляя место для внутрисделочного шума без принудительных выходов.
Дальнейший анализ сделок паттерна 8 показывает, что чисто импульсные входы не только точны, но, вероятно, и довольно настойчивы, учитывая 100-процентную долю прибыльных сделок по 53 входам. Тем не менее такая результативность может усыплять бдительность. Как уже упоминалось в отношении других паттернов, у нас нет полноценного понимания того, насколько серьезными могут быть убытки или смогут ли несколько неудачно рассчитанных разворотов стереть значительную часть накопленной прибыли. Средняя прибыль в диапазоне 49–55 также предполагает, что преимущество паттерна 8 основано скорее на повторяемости, чем на сделках с крупной прибылью или сделках восстановления.
С учетом этого те же меры, которые мы рекомендовали для паттернов 5–7 выше, по-прежнему применимы. Явные стопы необходимы, как и фильтры волатильности. Подтверждение со стороны ценового действия также может гарантировать, что когда рыночный режим NVDA перестанет вознаграждать эту логику "последовательной лестницы наклонов", неизбежные просадки не уничтожат нашу кривую капитала, и мы сможем продолжить торговать в другой день.
Паттерн 9: Обнаружение ложного пробоя
Последний сигнальный паттерн для длинных позиций по NVDA, использующий осцилляторы RSI и DeMarker, стремится обнаруживать ложные пробои, а также ловушки путем объединения неудачного ценового действия с "неподтверждениями" со стороны RSI и DeMarker. На бумаге это должно указывать на асимметричные сетапы для входа, обеспечивающие благоприятное соотношение риска и прибыли. На графике это может выглядеть следующим образом:
Цена кратковременно пробивает поддержку вниз, то есть закрывается ниже нее, но в течение 3 баров возвращается выше поддержки, то есть снова закрывается над ней, И RSI не подтверждает движение, то есть не формирует новый минимум, тогда как DeMarker показывает растущий наклон. Это интерпретируется как медвежья ловушка; вход в длинную позицию выполняется при возврате выше поддержки.
Для входа в длинную позицию цена должна пробить вниз ключевой уровень поддержки, закрывшись ниже него. После этого, если в течение 3 ценовых баров цена способна отыграть это падение, впоследствии закрывшись выше данной поддержки, при этом RSI не подтвердил падение цены, что указывает на ослабление импульса, а DeMarker также показал растущий наклон, это усиливает признаки покупательского давления. Покупки могут открываться, когда цена закрывается и повторно открывается выше этого уровня поддержки. Мы кодируем это в MQL5 следующим образом:
//+------------------------------------------------------------------+ //| Check for Pattern 9. | //10) False Break / Trap Detection (price action deviation) //+------------------------------------------------------------------+ bool CSignalRSI_DeMarker_SL::IsPattern_9(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY) { return(Close(X() + 2) < Cl(X() + 2) && Close(X() + 1) < Cl(X() + 1) && Close(X()) >= Cl(X()) && RSI(X()) - RSI(X() + 1) > 0.0 && DeMarker(X()) - DeMarker(X() + 1) > 0.0); } else if(T == POSITION_TYPE_SELL) { return(Close(X() + 2) > Cl(X() + 2) && Close(X() + 1) > Cl(X() + 1) && Close(X()) <= Cl(X()) && RSI(X()) - RSI(X() + 1) < 0.0 && DeMarker(X()) - DeMarker(X() + 1) < 0.0); } return(false); }
Медвежья ловушка зеркально повторяет описанное выше: цена пробивает вверх уровень сопротивления и даже закрывается выше него, прежде чем в течение 3 ценовых баров или быстрее откатиться назад и закрыться ниже этого уровня. RSI аналогичным образом не подтверждает пробой, не формируя новый максимум, тогда как DeMarker также имеет нисходящий наклон. Короткие позиции открываются, когда цена закрывается и открывается ниже сопротивления. Форвардное тестирование паттерна 9 дает нам следующие результаты в Strategy Tester:
Наш последний сигнальный паттерн, использующий сигнал ложной ловушки в его уточненной форме, продемонстрировал более контролируемую результативность, увеличив начальный баланс в 10 000 USD всего на 1 300 USD за 37 сделок. Поскольку все позиции намеренно были длинными, как было обосновано во введении, мы снова получили только прибыльные сделки. При отсутствии убытков напечатанный выше профит фактор, равный 0, является номинальным обозначением неограниченного значения. Ожидаемый выигрыш, таким образом, был умеренным с учетом небольших прибылей, полученных нами по сравнению с другими сигнальными паттернами. Однако коэффициент Шарпа 14,19 указывает, что преимущество этого паттерна является одновременно эффективным и устойчивым. Вслед за этим просадка по эквити была почти минимальной по меркам волатильности NVDA — 2,6 процента, или 277 USD в абсолютном выражении. Это сильно отличается от провалов почти на 40–50 процентов, которые мы видели в отчетах по другим сигнальным паттернам выше и в предыдущей статье. Поэтому можно сказать, что этот результат вполне соответствует тому, что любой трейдер счел бы "выживаемым", даже при использованном кредитном плече 1:100.
В итоге мы получили сигнальный паттерн, который не только в большинстве случаев правильно определяет направление, но и более осторожен в том, как участвует в тренде. Хотя 37 безубыточных прибыльных сделок выглядят подозрительно идеально, умеренная ожидаемая прибыль в 36 USD и крупнейшая прибыльная сделка всего в 85 USD показывают, что наша динамика эквити не выглядит как результат редких случайных сверхприбылей. Это скорее постепенная работа, а не погоня за славой. Вопрос используемого кредитного плеча, однако, остается актуальным, поскольку в ряде крупных юрисдикций его пришлось бы снизить, что, в свою очередь, уменьшило бы доходность, но дало бы некоторое утешение с точки зрения профиля риска. Даже в этих бычьих режимах, в которых мы тестируем Nvidia, движение не было спокойным: система выдерживала умеренные отклонения как против позиции, так и в ее пользу. При реальном применении явно потребовалось бы внимательно следить за размером позиций и не предполагать, что годы нашего тестирования являются единственно возможным сценарием, а также применять некоторые меры, предложенные выше для предыдущих паттернов.
Мультипаттерн с выбором до 10 вариантов
Мы реализуем только условия для длинных позиций, чтобы исследовать, сможет ли такой подход показать себя лучше в форвардных тестах, чем наши предыдущие попытки мультипаттерн-тестирования, где мы брали как длинные, так и короткие позиции. Наши условия, разумеется, сильно смещены из-за бычьей фазы NVDA, которую мы изучаем и которую, кроме того, пришлось дополнительно ограничить из-за сплитов акций компании. Наш код MQL5 для условий покупки и продажи выглядит следующим образом:
//+------------------------------------------------------------------+ //| "Voting" that price will grow. | //+------------------------------------------------------------------+ int CSignalRSI_DeMarker::LongCondition(void) { PatternsUsed(GetDualMap(m_dual_map)); int result = 0, results = 0; //--- if the model 0 is used if(((m_patterns_usage & 0x01) != 0) && IsPattern_0(POSITION_TYPE_BUY)) { result += m_pattern_0; results++; } //--- if the model 1 is used if(((m_patterns_usage & 0x02) != 0) && IsPattern_1(POSITION_TYPE_BUY)) { result += m_pattern_1; results++; } //--- if the model 2 is used if(((m_patterns_usage & 0x04) != 0) && IsPattern_2(POSITION_TYPE_BUY)) { result += m_pattern_2; results++; } //--- if the model 3 is used if(((m_patterns_usage & 0x08) != 0) && IsPattern_3(POSITION_TYPE_BUY)) { result += m_pattern_3; results++; } //--- if the model 4 is used if(((m_patterns_usage & 0x10) != 0) && IsPattern_4(POSITION_TYPE_BUY)) { result += m_pattern_4; results++; } //--- if the model 5 is used if(((m_patterns_usage & 0x20) != 0) && IsPattern_5(POSITION_TYPE_BUY)) { result += m_pattern_5; results++; } //--- if the model 6 is used if(((m_patterns_usage & 0x40) != 0) && IsPattern_6(POSITION_TYPE_BUY)) { result += m_pattern_6; results++; } //--- if the model 7 is used if(((m_patterns_usage & 0x80) != 0) && IsPattern_7(POSITION_TYPE_BUY)) { result += m_pattern_7; results++; } //--- if the model 8 is used if(((m_patterns_usage & 0x100) != 0) && IsPattern_8(POSITION_TYPE_BUY)) { result += m_pattern_8; results++; } //--- if the model 9 is used if(((m_patterns_usage & 0x200) != 0) && IsPattern_9(POSITION_TYPE_BUY)) { result += m_pattern_9; results++; } //--- return the result //if(result > 0)printf(__FUNCSIG__+" result is: %i",result); if(results > 0 && result > 0) { return(int(round(result / results))); } return(0); } //+------------------------------------------------------------------+ //| "Voting" that price will fall. | //+------------------------------------------------------------------+ int CSignalRSI_DeMarker::ShortCondition(void) { return(0); }
Наш код, как и в предыдущих статьях, по сути представляет собой взвешенную систему голосования, которая определяет убежденность торговой системы в пользу покупок. Эта система собирается через MQL5 Wizard. Концепция ее работы заключается в том, что каждый из десяти сигнальных паттернов, которые в нашем случае получены из комбинации индикаторов RSI и DeMarker и рассмотрены в предыдущих разделах, может независимо оценивать наличие бычьих условий в цене. Десять паттернов, которые мы обычно представляем как IsPattern_0() через IsPattern_9(), как правило, оценивают разные характеристики индикаторов. Они могут включать дивергенции, синхронизированные сдвиги импульса или структурные формации M/W, как мы видели выше на примере паттернов RSI-DeMarker. Поэтому функция LongCondition() объединяет все эти проверки паттернов в один общий сигнал, который выдает взвешенный средний балл коллективного голосования всех выбранных паттернов в пользу бычьего исхода.
Выбор паттерна управляется целочисленной переменной m_patterns_usage, которая действует как битовая маска. Каждый "бит" в ней, если преобразовать значение в двоичную систему, то есть в нули и единицы, соответствует одному из десяти отдельных сигнальных паттернов. Например, присвоение этой переменной целого значения 1 активирует только паттерн 0, тогда как значения 2, 4, 8, 16, …, 512 активируют паттерны с индексами от 1 до 9 соответственно. Это относится к случаю исключительного использования одного паттерна. При комбинировании паттернов этому значению, однако, присваиваются разные целые числа, обычно в диапазоне от 0 до 1023. Мы останавливаемся на 1023, потому что у нас есть 10 паттернов, а 1024 — это 2 в степени 10.
Функция PatternsUsed() присваивает значение этой переменной m_patterns_usage из входного параметра, тогда как интерпретация битовой маски происходит в функции LongCondition(). Мы оптимизируем/обучаем комбинации паттернов в диапазоне от 0 до 1023 для RSI и DeMarker на периоде с 01.08.2021 по 01.06.2023, как и в случае с одиночными паттернами, а затем выполняем форвардный тест на периоде с 01.06.2023 по 01.06.2024. Полученные результаты приведены ниже:
Приведенный выше отчет был получен при запуске торгового советника с входным параметром используемых паттернов, установленным на значение 605. Это соответствует использованию сигнальных паттернов 0, 2, 3, 4, 6 и 9. Этот форвардный тест выглядит устойчивым. С начального депозита в 10 000 USD нам удалось получить чистую прибыль в размере 2 309 USD. Строго говоря, это несколько разочаровывает, учитывая, что в нашем распоряжении было 10 сигнальных паттернов, особенно если учесть, что мы уже смогли получить более высокую доходность всего с одним сигнальным паттерном, как было показано в этой и предыдущей статье. Было размещено 40 сделок, и все они снова закрылись в плюсе. При факторе восстановления 2,95 и коэффициенте Шарпа 6,99 наша доходность выглядит здоровой относительно волатильности.
Риск также оказался умеренным: максимальная просадка по эквити составила 7,61 процента, или 703 USD. Качество моделирования также было приемлемым — 99 процентов.
В целом этот форвардный тест можно считать доказательством концепции, которое выдержало проверку. В начале статьи мы сосредоточились только на открытии длинных позиций, с конечной целью протестировать несколько паттернов, которые все открывают позиции в одном конкретном направлении. Ранее в других статьях я писал о неразумности использования более чем одного паттерна в торговом советнике, поскольку сигналы имеют тенденцию взаимно нейтрализоваться при форвардном тестировании. В результате хорошие показатели, полученные при обучении/оптимизации, не воспроизводятся, поскольку результаты обучения фактически оказываются подгонкой кривой, где длинные позиции компенсируют короткие и наоборот.
40 сделок, все прибыльные, просадки по балансу фактически нет. Похоже, мы подтвердили аргумент в пользу открытия только односторонних позиций, если есть желание торговать с несколькими сигнальными паттернами. Однако более общая цель использования нескольких паттернов состояла в получении выдающейся доходности, определенно выше, чем у одиночных паттернов, то есть в гипотетической ситуации, где сумма лучше отдельных частей. Мы явно не достигли первой цели, которая является самой базовой. В текущем виде, без тестирования на более широких окнах, внедрения управления стопами и предложенных фильтров волатильности, все еще можно утверждать, что торговля только одним хорошо работающим сигнальным паттерном, дающим свыше 30 процентов, как мы уже видели у некоторых паттернов, является более разумной стратегией.
Заключение
После тестирования наших 10 сигнальных паттернов на акциях Nvidia Corp, начатого в предыдущей статье и завершаемого в этой, общую тему можно сформулировать так: рынки вознаграждают точность, но наказывают самоуверенность. Многие трейдеры это подозревают, но редко говорят об этом прямо. Несмотря на то что многие наши модели сигнальных паттернов показали достойные выигрыши, хронической проблемой оставалась слабая асимметрия прибыли и убытков. Например, расширение диапазона и согласование наклонов в паттерне 5 продемонстрировали впечатляющий захват импульса, но сопровождались значительными просадками, что может заставить многих трейдеров сомневаться в своих сделках. Паттерн 6, где мы использовали цену как опережающий фактор и запаздывающие индикаторы, также выглядел элегантным и эффективным при умеренной просадке, однако нам все равно требовалась более строгая постановка стопов, чтобы пережить продолжительные периоды повышенной волатильности.
В отличие от этих первых сигнальных паттернов, паттерн 8, где мы опирались на "последовательную лестницу наклонов", показал риски отрыва сигнальной логики от ценовой структуры. Его методология, основанная только на импульсе, показала уязвимость подхода, оторванного от ценовой структуры, несмотря на хорошие формальные результаты форвардного теста.
Настоящей ключевой находкой, по-видимому, стала мультипаттерн-конфигурация. Это было наше последнее тестирование выше, и в нем мы позволили выбирать до 10 паттернов для голосования через взвешенную маску. Победившая битовая маска после обучения/оптимизации составила 883, то есть паттерны 0, 1, 4, 6, 9, и они дали профит-фактор 3,0, коэффициент Шарпа выше 20, при крупнейшей просадке по эквити менее 19 процентов. Эти показатели были достигнуты при увеличении стартового депозита в 2,5 раза, что опять же является очень агрессивной результативностью. Мы использовали высокое кредитное плечо 1:100, поэтому при использовании 1:50 теоретически все еще можно было бы получить около 75 процентов годовой доходности. Более широкий вывод здесь может заключаться в том, что разнообразие паттернов компенсирует слабости отдельных паттернов. Иными словами, ансамбль мультипаттерн-выбора вел себя подобно модели машинного обучения, где смешение сигналов подтверждения, разворотов и расширения диапазона формировалось в единый согласованный слой принятия решений.
При этом бесплатных решений в трейдинге не бывает. Хотя эти форвардные результаты выглядят многообещающе, наше тестовое окно было ограничено датами сплитов акций NVDA и охватывало исключительный бычий период для бумаги. Да, в отдельных конфигурациях и при использовании стопов потери были возможны, хотя в рассмотренных выше отчетах преобладали безубыточные серии. Как эти паттерны поведут себя на медвежьем рынке? Всегда существует скрытая опасность принять совпадение кривой за устойчивость модели. Эти паттерны, включая мультипаттерн, следует повторно валидировать в разных режимах волатильности. Кроме того, такое тестирование вне исходного режима должно учитывать задержки исполнения, изменения спредов и чувствительность к кредитному плечу, поскольку мы использовали 1:100, тогда как некоторые трейдеры не могут применять плечо выше 1:50.
| Название | Описание |
|---|---|
| EMC-1.mq5 | Торговый советник, собранный через Wizard, со ссылками в заголовке |
| SignalEMC-1.mq5 | Файл класса сигналов торгового советника, использованный с MQL5 Wizard |
Примечание для редактора: в заключении исходного текста сохранены числовые расхождения с основным блоком статьи. В основном описании мультипаттерн-теста указаны параметр 605, паттерны 0, 2, 3, 4, 6 и 9, прибыль 2 309 USD, 40 прибыльных сделок, коэффициент Шарпа 6,99 и просадка по эквити 7,61%. В заключении оригинала указаны маска 883, паттерны 0, 1, 4, 6, 9, профит-фактор 3,0, коэффициент Шарпа выше 20, рост стартового депозита в 2,5 раза и наличие некоторых убытков. Перед публикацией эти данные нужно сверить с автором или с исходными отчетами тестирования.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/20045
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Нейросети в трейдинге: Внимание, память и рыночные паттерны в GDformer (Global Dictionary)
Автоматизация торговых стратегий в MQL5 (Часть 26): Создание системы усреднения на основе пин-баров для многопозиционной торговли
Сила MetaTrader 5: от пошаговой отладки до защиты EX5 в одной среде
Построение моделей волатильности в MQL5 (Часть I): Первичная реализация
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования










