English Deutsch 日本語
preview
Кодекс рыночных состояний в MQL5 (Часть 1): Побитовое обучение на примере Nvidia

Кодекс рыночных состояний в MQL5 (Часть 1): Побитовое обучение на примере Nvidia

MetaTrader 5Тестер |
58 0
Stephen Njuki
Stephen Njuki

Введение

Сегодня эта статья служит пилотным выпуском новой серии, которую мы будем выпускать под общим названием "Кодекс рыночного позиционирования в MQL5". Эти статьи будут посвящены целенаправленному изучению автоматизированной алгоритмической торговли для стратегий, которые в основном будут адаптированы под акции с преимущественно длинным уклоном. Наша адаптация концепции «кодекса» основана не только на «побитовом обучении» — структурированном подходе к разложению сигналов индикаторов на дискретные паттерны, — но и на включении крайне важного «машинного обучения». Использование дискретных паттернов, как мы рассматривали в предыдущей серии, впоследствии можно объединять для обучения с учителем и тестирования. Цель этого подхода — выявлять надёжные сигналы рыночного позиционирования за счёт изоляции и строгой оценки отдельных сигнальных паттернов.

В этой статье мы сосредоточимся на Nvidia Corporation (NVDA) — хорошо зарекомендовавшей себя, очень ликвидной и весьма динамичной компании, которая в значительной степени движима циклами технологических инноваций и активностью в сфере корпоративных слияний и поглощений. Мы хотим использовать эту рыночную сложность и, возможно, продемонстрировать устойчивость сочетания индекса относительной силы (RSI) и осциллятора DeMarker в дисциплинированном тактическом long-only-подходе. Планируемое окно тестирования — с августа 2021 года по июнь 2024 года — выбрано как обходное решение ограничений тестера стратегий MetaTrader 5, поскольку при тестировании нельзя учесть сплиты акций компании. В реальной торговле большинство брокеров обрабатывает такие события, но тестер стратегий пока не умеет корректно с ними справляться. Для NVDA, самой дорогой компании в мире, два последних сплита акций оказались очень близко к начальной и конечной датам нашего тестирования.

Одна из наших ключевых предпосылок в этой серии состоит в том, что в предыдущих статьях серии MQL5 Wizard наши побитовые паттерны, по-видимому, работали только независимо и не давали ощутимого эффекта при объединении друг с другом через целочисленный битовый входной параметр ‘patterns-used’. Поэтому мы хотим подробно проверить, сохраняется ли это явление, когда требуется строгое/независимое использование паттернов, зависящее от знаний и опыта трейдера, даже если мы придерживаемся конкретного типа позиции, например тестируем только длинные позиции. Когда у нас не было требования по конкретному типу позиции, аргумент против объединения нескольких паттернов состоял в том, что они преждевременно взаимно отменяли бы друг друга и тем самым давали бы «подогнанные под кривую» результаты при обучении, которые не переносились бы в реальные условия.

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

Эта статья, как и, надеюсь, многие последующие материалы серии “Кодекс рыночного позиционирования”, не только предложит своего рода план поиска и построения новых торговых сигналов в MQL5, но и обогатит интерпретацию торговых алгоритмов, превращая сложные, часто осцилляторные входные данные в пригодные для кода идеи.


Nvidia Corp. (NVDA)

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

Важными рыночными событиями, повлиявшими на эту компанию за последние пять лет, стали два крупных сплита её акций. Первый произошёл в июле 2021 года, когда был проведён сплит 4 к 1, временно снизивший цену до 25% от прежнего значения. Второй и самый недавний сплит состоялся в июне 2024 года, когда был проведён сплит 10 к 1. Сплиты акций меняют восприятие цены акции, фактически снижая цену одной акции и одновременно увеличивая количество акций. Здесь акцент именно на «восприятии», поскольку большая часть финансового сообщества и даже брокеры, поддерживающие MetaTrader, имеют системы корректировок для обработки таких сплитов, тогда как тестер стратегий в MetaTrader этого не делает. Это означает, что открытые позиции, которые с нашей точки зрения тестирования были бы длинными, могут мгновенно привести счёт к маржин-колл в зависимости от текущего уровня маржи. 

У большинства брокеров, включая тех, кто предлагает MetaTrader, такие позиции были бы закрыты и заново открыты с увеличенным объёмом в масштабе сплита по новой сниженной цене акций, без влияния на уже накопленную прибыль открытой позиции. Поэтому в целом было бы полезно, если бы такие события сплитов можно было заранее задавать в тестере стратегий перед запуском тестов, чтобы учитывать эту аномалию. Ещё одним решением или заменой для активов со сплитами может быть использование цен пользовательских индикаторов, полученных из таких активов, но без этих сплитов. Помимо тестирования маржин-колл, ещё более коварная проблема — даже если счёт показывает прибыльные результаты тестирования — может заключаться в неверной интерпретации ключевых уровней поддержки/сопротивления цены акции.

Поскольку мы заранее знаем даты сплитов, а поддержание сопоставимых цен важно на протяжении всех тестовых прогонов, окно тестирования, используемое в этой статье, скорректировано так, чтобы охватывать период с 1 августа 2021 года по 1 июня 2024 года. Внутри этого окна мы проводим обучение/оптимизацию модели с 1 августа 2021 года по 1 июня 2023 года. Этот период охватывает значительную часть исторического ралли NVDA, особенно динамичное ценовое движение, включавшее ранние тренды, обусловленные ИИ, некоторые коррекции и сдвиги микроструктуры. Это даёт нам относительно нейтральные условия для проверки как индикаторные паттерны ведут себя на фоне корпоративных событий такого типа.

Итак, хотя мы могли бы создать пользовательский экземпляр символа NVDA без этих сплитов акций, использование сырых брокерских данных в выбранном нами небольшом окне должно дать похожие результаты без нашего «вмешательства» или «смещения» на участке истории акции между двумя крупными корпоративными корректировками. В следующих статьях мы рассмотрим выполнение части такого тестирования и корректировки сплитов акций средствами Python. IDE Python даёт ряд преимуществ, некоторые из которых, например эффективность выполнения, мы уже затрагивали в предыдущих статьях; но в более широком смысле это также более богатая библиотека индикаторов и инструментов, которые мы будем использовать не только при обучении, но и при выборе индикаторов. Хотя для NVDA мы заранее «предопределили» пару индикаторов RSI и DeMarker, в следующих материалах подбор пар индикаторов будет более строгим.


Используемые индикаторы

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

Этот осциллятор, RSI, был разработан для оценки недавних движений цены с целью определения состояний перекупленности и перепроданности. Его выходные значения всегда находятся между 0 и 100. Он должен отражать темп и величину ценовых движений, помогая трейдерам выявлять изменения импульса. Классическая формула такова:

Где:

RS, относительная сила, — это отношение среднего восходящего движения цены к среднему нисходящему движению. Период усреднения n обычно равен 14.

Шаги расчёта начинаются с определения восходящих и нисходящих изменений, которые ниже обозначены как Ui и Di.

Расчёт сглаженных средних двух указанных выше величин также можно выполнить методом Уайлдера или с помощью экспоненциальной скользящей средней. Затем значения RS и RSI просто получают из этих двух величин, применяя приведённые выше формулы. Значения RSI, близкие к порогу 70, обычно интерпретируются как признак перекупленности или повышенной вероятности разворота цены вниз. С другой стороны, показания индикатора около порога 30 отмечают условия перепроданности и повышенную вероятность разворота вверх. В качестве оговорки стоит отметить, что в очень сильных трендах RSI может оставаться в экстремальных зонах длительное время, поэтому при его использовании полезно сочетать его с другим, желательно дополняющим индикатором. Именно поэтому в этой статье мы также используем осциллятор DeMarker.

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

Где:

  • SMA — это простая скользящая средняя
  • H и L — это максимальная и минимальная цены во временном ряду t.

Этот осциллятор выдаёт значения в диапазоне от 0 до 1, и, как и RSI, значения на уровне 0,7 или выше отмечают условия перекупленности, тогда как значения 0,3 или ниже указывают на перепроданность. Тем не менее RSI и DeMarker дополняют друг друга.

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


Паттерн-0: скрытая дивергенция индикаторов

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

Цена формирует более низкий минимум, тогда как и RSI, и DeMarker формируют более высокие минимумы (скрытая бычья дивергенция), а наклон RSI(3) > 0.

p0

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

//+------------------------------------------------------------------+
//| Check for Pattern 0.                                             |
//1) Price-Indicator Hidden Divergence (slope + deviation)           |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_0(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return(Low(X() + 1) > Low(X()) && DeMarker(X() + 1) < DeMarker(X()) && DeMarker(X()) < 0.4 && RSI(X() + 1) < RSI(X()) && RSI(X()) < 30.0 && RSI(X()) - RSI(X() + 3) > 0.0);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(High(X() + 1) < High(X()) && DeMarker(X() + 1) > DeMarker(X()) && DeMarker(X()) > 0.6 && RSI(X() + 1) > RSI(X()) && RSI(X()) > 70.0 && RSI(X()) - RSI(X() + 3) < 0.0);
   }
   return(false);
}

Выше мы пытаемся реализовать описанную логику, сравнивая минимумы и максимумы ценовых буферов с соответствующими минимумами и максимумами индикаторов в скользящем окне. Наклон RSI на интервале в 3 бара мы вычисляем как разницу, или изменение RSI, на этом отрезке. Это служит дополнительным фильтром, который при значении больше нуля для покупок подтверждает улучшение импульса. При проверке продаж этот наклон был бы отрицательным, однако в этой статье мы не рассматриваем позиции на продажу. Форвард-тест с использованием только этого сигнала, паттерна-0, даёт следующий отчёт:

r0

Наш форвард-прогон Nvidia на 4-часовом таймфрейме с 2023.06.01 по 2024.06.01 смог превратить начальный депозит 10 тыс. в 11 904,57. Это около 19 процентов доходности. Результат получен по 39 сделкам. Сделки были только длинными, как уже упоминалось во введении, и из 39 входов 38 закрылись в плюсе, а убыточной была только одна. Это дало фактор прибыли 15,24 при ожидаемой прибыли 50 долларов на сделку. Коэффициент Шарпа превысил 8, а максимальная просадка оставалась в районе 4,5 процента, то есть около 500 долларов от 10 тыс. LR-корреляция оказалась слишком идеальной — 1,00 — при качестве ценовой истории около 99 процентов. Это потенциально указывает на то, что входы хорошо соответствовали тренду Nvidia. Z-score выше 2 при 95,6 процента может также означать, что серии выигрышей не были случайным шумом. В итоге мы очень чисто отрабатываем сделки на продолжение движения после отката. Для проверки этой эффективности, даже если она получена вне выборки, следует прогнать этот паттерн на более медвежьих участках рынка и посмотреть, насколько хорошо он способен сохранять капитал.


Паттерн-1: пробой наклона с подтверждением ценой

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

Наклон RSI(5) пересекает уровень от отрицательного → к положительному, наклон DeMarker(5) > 0 на протяжении 2 последовательных баров, а цена закрывается выше 8-периодной EMA.

p1

Условие покупки отмечается, когда наклон RSI, измеренный на 5 барах, меняется с отрицательного на положительный, потенциально сигнализируя о переходе от медвежьего импульса к бычьему. DeMarker, также на 5 барах, сохраняет положительность как минимум на 2 последовательных барах, подтверждая, что этот импульс имеет продолжение. Наконец, цена закрывается выше EMA, подтверждая прохождение цены через любое краткосрочное сопротивление. Мы реализуем это в MQL5 следующим образом:

//+------------------------------------------------------------------+
//| Check for Pattern 1.                                             |
//2) Leading-Indicator Slope Break with Price Confirmation           |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_1(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return(DeMarker(X()) - DeMarker(X() + 5) > 0.0 && RSI(X() + 1) - RSI(X() + 5 + 1) < 0.0 && RSI(X()) - RSI(X() + 5) > 0.0 && Close(X()) > Cl(X()) && Close(X() + 1) > Cl(X() + 1));
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(DeMarker(X()) - DeMarker(X() + 5) < 0.0 && RSI(X() + 1) - RSI(X() + 5 + 1) > 0.0 && RSI(X()) - RSI(X() + 5) < 0.0 && Close(X()) < Cl(X()) && Close(X() + 1) < Cl(X() + 1));
   }
   return(false);
}

Требования для продажи возникают, когда наклон RSI переключается с положительного на отрицательный, что означает появление медвежьего импульса, а DeMarker также показывает отрицательный наклон на протяжении 2 последовательных баров. Интервалы наклона, как и в бычьем варианте, берутся по 5 барам. Цена также должна закрыться ниже EMA в качестве проверки или окончательного подтверждения медвежьего сценария. Форвард-тестирование этого паттерна дало следующий тестовый отчёт:

r1

Форвард-прогоны этого базового паттерна на основе наклона на 4-часовом графике превращают 10 тыс. в 12 454, что соответствует доходности 24,5 процента. Было размещено 46 сделок, из которых снова 45 оказались прибыльными, и только одна была убыточной, что даёт долю выигрышей выше 97 процентов. При факторе прибыли почти 18 и коэффициенте Шарпа 8,78 LR-корреляция почти идеальна — 0,99, что снова указывает на тесное совпадение с трендом, а не на случайность. Просадка по средствам оставалась умеренной — 6,2 процента, тогда как просадка по балансу была ещё менее заметной — 1,19 процента. В целом паттерн-1 улавливает краткосрочные перегибы с использованием подтверждений EMA, но, учитывая слишком глянцевую статистику всего по 46 сделкам и отсутствие мер безопасности вроде размещения стоп-лосса или фильтрации волатильности, этот форвард-прогон всё ещё можно считать подгонкой под кривую, если не добавить такие меры и не протестировать разные рыночные режимы.


Паттерн-2: формации M/W с ценовым откатом

Наш третий сигнал, паттерн-2, ищет классические формации M для двойной вершины и W для двойного дна на осцилляторах RSI и DeMarker. Затем он объединяет их с важными ценовыми откатами или свингами от прежних ключевых уровней. По сути, он использует способность осцилляторов выявлять развороты импульса по повторяющимся пикам или впадинам вместе с ретестом ценой важных уровней поддержки или сопротивления, чтобы подтвердить ожидаемые развороты. Сигнал покупки, учитывая, что для NVDA мы тестируем только покупки, может выглядеть на графике следующим образом:

RSI формирует W (две впадины, вторая впадина ≥ первой) в пределах последних 12 баров, DeMarker также показывает W-паттерн, а цена откатывается к прежнему сопротивлению, ставшему поддержкой (предыдущий свинговый максимум), и удерживается.

p2

Формально условия покупки выполняются, когда и RSI, и DeMarker формируют W-образные паттерны на любом из последних 12 ценовых баров. Затем цена откатывается к прежнему уровню сопротивления, который теперь стал поддержкой, — то есть удерживается выше предыдущего свингового максимума. Проверки формаций M и W вместе с паттерном-2 мы реализуем в MQL5 следующим образом:

//+------------------------------------------------------------------+
//| Detect "M" (double-top) pattern                                  |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsM(const vector &v)
{  int n = (int)v.Size();
   if(n < 5)
      return false;
   // Search sequentially for an M: high1 -> valley -> high2
   for(int i = 1; i < n - 3; i++)
   {  if(!LocalMax(v, i)) continue;  // first peak (high1)
      for(int j = i + 1; j < n - 2; j++)
      {  if(!LocalMin(v, j)) continue;  // middle trough
         for(int k = j + 1; k < n - 1; k++)
         {  if(!LocalMax(v, k)) continue;  // second peak (high2)
            double high1 = v[i];
            double valley = v[j];
            double high2 = v[k];
            // Geometric validation:
            // - both peaks should be above the valley
            // - second peak should not be significantly higher than the first (allow tiny tolerance)
            if(high1 > valley && high2 > valley && high2 <= high1 * 1.001)
               return true;
         }
      }
   }
   return false;
}
//+------------------------------------------------------------------+
//| Detect "W" (double-bottom) pattern                               |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsW(const vector &v)
{  int n = (int)v.Size();
   if(n < 5)
      return false;
   // Search sequentially for a W: low1 → peak → low2
   for(int i = 1; i < n - 3; i++)
   {  if(!LocalMin(v, i)) continue;  // first trough (low1)
      for(int j = i + 1; j < n - 2; j++)
      {  if(!LocalMax(v, j)) continue;  // middle peak
         for(int k = j + 1; k < n - 1; k++)
         {  if(!LocalMin(v, k)) continue;  // second trough (low2)
            double low1 = v[i];
            double peak = v[j];
            double low2 = v[k];
            // Simple geometric validation:
            // peak must be above both lows,
            // and second low not much lower than the first.
            if(peak > low1 && peak > low2 && low2 >= low1 * 0.999)
               return true;
         }
      }
   }
   return false;
}
//+------------------------------------------------------------------+
//| Check for Pattern 2.                                             |
//3) M/W Formation on Indicator + Price Pullback                     |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_2(ENUM_POSITION_TYPE T)
{  vector _rsi, _demarker;
   _rsi.Init(fmax(5, m_past));
   _demarker.Init(fmax(5, m_past));
   for(int i = 0; i < fmax(5, m_past); i++)
   {  _rsi[i] = RSI(i);
      _demarker[i] = DeMarker(i);
   }
   //Print(__FUNCTION__ + ": rsi, ", _rsi);
   //Print(__FUNCTION__ + ": demarker, ", _demarker);
   //_demarker.CopyIndicatorBuffer(m_demarker.Handle(), X(), 0, fmax(5, m_past)) &&
   if(T == POSITION_TYPE_BUY)
   {  return(IsW(_rsi) &&
             IsW(_demarker) &&
             Close(X()) > Close(X() + 1) && Close(X() + 1) < Close(X() + 2));
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(IsM(_rsi) &&
             IsM(_demarker) &&
             Close(X()) < Close(X() + 1) && Close(X() + 1) > Close(X() + 2));
   }
   return(false);
}

Сигнал продажи, наоборот, определяется, когда и RSI, и DeMarker регистрируют M-образные формации — признак двойных пиков. Как и в бычьем сигнале, второй пик этой формации должен совпадать с первым или быть ниже него. Цена должна подняться к недавнему уровню поддержки, не удержаться и превратить этот уровень в сопротивление из-за неспособности продвинуться выше. Форвард-тестирование этого сигнала после оптимизации даёт следующий отчёт:

r2

И снова наш форвард-тест с 2023.06.01 по 2024.06.01 с третьим сигнальным паттерном, паттерном-2, увеличивает начальный депозит 10 тыс. до чуть более 14 тыс., фиксируя чистую прибыль 4 325. Этот сигнальный паттерн открыл 54 сделки, снова все длинные в соответствии с темой статьи, и дал «неопределённый» фактор прибыли, поскольку все сделки закрылись в плюс. Такая эффективность приносила примерно 80 долларов на сделку, а коэффициент Шарпа также оказался очень высоким — 9,23. LR-корреляция, что интересно, немного не дотянула до идеальных 1,0, вероятно, из-за некоторых неблагоприятных форвардных отклонений, в отличие от паттерна-0. Однако в большинстве случаев структуры M/W не только заранее определяли истощение движения, но и точно попадали в зоны продолжения, когда цена ретестировала заданный уровень перед продолжением.

С учётом этого вступления всё же стоит подчеркнуть, что эти результаты, пожалуй, слишком идеальны, чтобы им слепо доверять. Ни одна позиция не была закрыта в минус, несмотря на промежуточные просадки по средствам, достигавшие 8 процентов. При 54 последовательных победах диагноз здесь не «плохая стратегия», а, как и с уже рассмотренными выше паттернами, «красиво переобученная кривая». Следует стремиться внедрить контроль риска, фильтры волатильности и более строгую логику выхода, если паттерн-2 должен выдержать рваные рынки или переход к медвежьему режиму. Можно утверждать, что использование паттерна-2 как инструмента тайминга для входов на истощении в сочетании с более сильными трендовыми фильтрами старшего уровня может быть перспективным; однако если оставить его работать самостоятельно, то такой подход может быстро привести к серьёзным просадкам.


Паттерн-3: пробой сжатия с дивергенцией индикаторов

Наш следующий сигнал, который мы индексируем как 3, сосредоточен на выявлении фаз NVDA со сжатой динамикой цены. Это проявляется в узких торговых диапазонах. Центральная идея паттерна состоит в том, что рыночные фазы низкой или редкой волатильности, когда ATR или подходящая метрика волатильности дают умеренные значения, часто сменяются сигналами пробоя или очень сильными направленными движениями. Поэтому паттерн-3 использует дивергенцию индикаторов для подтверждения таких пробоев, когда они происходят. На графике сигнал покупки мог бы выглядеть следующим образом:

Цена находилась в узком диапазоне (малый ATR / узкая полоса high-low в течение 8 баров), затем пробивает верхнюю границу диапазона при RSI > RSI.mean(20) и растущем DeMarker; если RSI и DeMarker сформировали более высокие минимумы во время сжатия, бычий уклон усиливается.

p3

Сигнал покупки для этого паттерна возникает, когда цена удерживалась в узком диапазоне на протяжении заданного числа баров; в нашем случае это оптимизируемый или настраиваемый параметр. Признаком сжатия диапазона считаем снижение разницы между максимумом и минимумом за выбранный период. В этой фазе сжатия RSI и DeMarker показывают соответственно более высокие минимумы или более низкие минимумы, что является признаком дивергенции и, следовательно, повышенной вероятности накопления импульса. Пробой подтверждается, когда цена поднимается выше предыдущего максимума, а RSI также находится выше своего среднего за 20 периодов или имеет восходящий тренд на оптимизируемом периоде. DeMarker также должен расти. Кроме того, если дивергенция между осцилляторами одновременно отмечена более высокими минимумами, бычий сценарий для паттерна-3 усиливается. Реализуем это в MQL5 следующим образом:

//+------------------------------------------------------------------+
//| Check for Pattern 3.                                             |
//4) Compression Breakout with Indicator Divergence                  |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_3(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) &&
             Close(X()) > Hi(X()) &&
             RSI(X()) > RSI(X() + m_past) &&
             DeMarker(X()) > DeMarker(X() + 1));
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(Hi(X() + m_past + 1) - Lo(X() + m_past + 1) > Hi(X() + 1) - Lo(X() + 1) &&
             Close(X()) < Lo(X()) &&
             RSI(X()) < RSI(X() + m_past) &&
             DeMarker(X()) < DeMarker(X() + 1));
   }
   return(false);
}

Логика сигнала продажи является зеркалом описанной выше бычьей логики: цена также находится в узком диапазоне на фоне снижения RSI и DeMarker. Затем следует пробой цены ниже предыдущего минимума диапазона. Как и в бычьем паттерне, RSI ниже своего среднего и нисходящий DeMarker поддерживают сценарий пробоя цены вниз. Паттерн-3 важен потому, что выявляет затишье перед бурей и стремится извлечь из этого выгоду, усиливая внимание к ключевым ценовым пробоям. Один из главных инструментов здесь, как упоминалось выше, — выявление дивергенций. По результатам форвард-теста этого паттерна на цене акций Nvidia Corp с 2023.06.01 по 2024.06.01, при открытии сделок исключительно на основе паттерна 3 и его оптимизированных настроек, мы получили следующие результаты:

r3

Отчёт тестера стратегий выше для нашего четвёртого сигнального паттерна, паттерна-3, как и уже рассмотренные случаи, показал устойчивый пробойный подход к торговле Nvidia. Мы по-прежнему использовали только сигналы на покупку, что совпадает с преобладающей бычьей динамикой технологического сектора США на этом горизонте, требуя от паттерна подтверждать пробои, когда RSI проходит выше своего среднего, а DeMarker растёт. В этом форвард-прогоне советник совершил 78 сделок, и все они закрылись в плюс, принеся чистую прибыль более 3 тыс. при начальном депозите 10 тыс. Эта 30-процентная доходность при прибыли почти 39 долларов на сделку имела фактор прибыли 9,63 и LR-корреляцию 0,99. Максимальная просадка по средствам также составила всего 5,7 процента. Эта впечатляющая серия из 78 последовательных побед демонстрирует, как данный паттерн аккуратно участвует в тренде NVDA несмотря на фиксированные цели по прибыли; по сути это означает, что входы достаточно точны, чтобы выдерживать внутрибарный шум и всё равно закрываться с заметной прибылью. 

Хотя паттерн-3 показывает сильные стороны в определении точек входа и выхода на протяжении бычьего тренда NVDA, есть области, требующие улучшения. Самая глубокая просадка почти достигала 40 процентов, а крупнейший одиночный убыток превысил 3 700 — две статистики, подчёркивающие риски паттерна-3 при неудачных пробоях или резких разворотах. Способность системы восстанавливаться, на которую указывают фактор восстановления и стабильно высокая доля прибыльных сделок, отчасти компенсирует это, однако остаётся необходимость в более эффективном управлении стопами.


Паттерн-4: сигналы типа failure swing с подтверждением осциллятором

Заключительный для этой статьи паттерн использует классическую концепцию свинга, введённую в широкую практику Ларри Уильямсом. Здесь мы применяем её к RSI и DeMarker как подтверждениям сдвигов импульса, не полагаясь на типичные пороговые уровни. Графическое представление паттерна-4 для покупки может выглядеть следующим образом:

RSI формирует бычий failure swing (сигнал неудавшегося свинга) (RSI падает ниже 30, затем поднимается выше своего предыдущего максимума, не возвращаясь ниже впадины), DeMarker > 0.45, а цена закрывается выше свингового максимума.

p4

Условие покупки срабатывает, когда RSI опускается ниже уровня перепроданности, базово обычно равного 30, а затем поднимается выше него, превосходя предыдущие максимумы без отката. Это бычий неудавшийся свинг. DeMarker, со своей стороны, также подтверждает импульс, поднимаясь выше уровня 0,45. Помимо этих двух показаний осцилляторов, цена должна закрыться выше предыдущего свингового максимума, тем самым закрепляя бычий сигнал. Мы реализуем это в MQL5 следующим образом:

//+------------------------------------------------------------------+
//| Check for Pattern 4.                                             |
//5) Failure Swing (Williams-style) on RSI + Dem confirmation        |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_4(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return((Close(X()) >= Hi(X()) || Close(X()) >= High(X() + 1)) &&
             RSI(X() + 2) < RSI(X() + 1) && RSI(X() + 1) > RSI(X()) && RSI(X()) <= 30.0 &&
             DeMarker(X()) > 0.45);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return((Close(X()) <= Lo(X()) || Close(X()) <= Low(X() + 1)) &&
             RSI(X() + 2) > RSI(X() + 1) && RSI(X() + 1) < RSI(X()) && RSI(X()) >= 70.0 &&
             DeMarker(X()) < 0.55);
   }
   return(false);
}

Условие продажи определяется, когда RSI пробивает порог перекупленности, обычно 70, а затем снижается ниже своих предыдущих минимумов без повторного тестирования прежних пиков — снова медвежий неудавшийся свинг. DeMarker должен оставаться ниже 0,55, а цена должна закрыться ниже предыдущего свингового минимума как подтверждение сигнала продажи. Форвард-тестирование в условиях, аналогичных четырём паттернам, уже рассмотренным выше, после оптимизационного прогона даёт следующий отчёт:


r4


Наш пятый сигнал, паттерн-4, достаточно точно привязывает входы к восходящим движениям Nvidia, что позволяет получить доходность 30 процентов. Форвард-прогон совершил 57 сделок, снова все прибыльные, с коэффициентом Шарпа 9,20 и LR-корреляцией 0,99. Эта эффективность, как отмечалось для предыдущих паттернов, может быть чрезмерно привязана к бычьему режиму Nvidia, учитывая неопределённый фактор прибыли и почти нулевую просадку по средствам. Дополнительное стресс-тестирование в медвежьих режимах, вероятно с введением фильтров волатильности и некоторого управления риском, может стать ключевым предварительным условием перед дальнейшим рассмотрением этого паттерна, как и предыдущих четырёх. Полный исходный код, пригодный для использования в MQL5 Wizard, приложен ниже.



Заключение

В заключение, первая часть «Кодекса позиционирования рынков в MQL5» заложила некоторую основу для структурированного изучения сигнальных паттернов с одним типом позиции на примере тестирования Nvidia. В этой серии мы намерены протестировать множество акций, поэтому наше тестирование одного типа позиции будет включать большое число длинных позиций. Для тестируемой в этой статье акции, Nvidia, период был доминирован устойчивым бычьим импульсом. Значит ли это, что тестирование систем только для длинных позиций бессмысленно? Нет. Использование советников с одним типом позиции призвано лучше раскрыть потенциал торговли при сочетании нескольких сигнальных паттернов.

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

имя описание
EMC-1.mq5 Собранный советник, заголовок которого содержит список ссылок
SignalEMC-1.mqh Файл пользовательского класса сигналов

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/20020

Прикрепленные файлы |
EMC-1.mq5 (8.32 KB)
SignalEMC_1.mqh (50.47 KB)
Двумерные копулы в MQL5 (Часть 2): Реализация архимедовых копул в MQL5 Двумерные копулы в MQL5 (Часть 2): Реализация архимедовых копул в MQL5
Во второй части серии мы рассматриваем свойства двумерных архимедовых копул и их реализацию в MQL5. Мы также изучаем применение копул для разработки простой стратегии парного трейдинга.
Архитектура системы машинного обучения в MetaTrader 5 (Часть 4): Скрытый изъян пайплайна финансового ML — одновременность меток Архитектура системы машинного обучения в MetaTrader 5 (Часть 4): Скрытый изъян пайплайна финансового ML — одновременность меток
Узнайте, как исправить критический изъян в финансовом машинном обучении, который приводит к переобученным моделям и плохой работе в реальной торговле, — одновременность меток. При использовании метода тройного барьера (triple-barrier) обучающие метки перекрываются во времени, нарушая базовое предположение IID большинства ML-алгоритмов (алгоритмов машинного обучения). В статье показано практическое решение через взвешивание наблюдений: как измерять временное перекрытие торговых сигналов, рассчитывать взвешивание наблюдений с учётом уникальной информации и применять эти веса в scikit-learn для построения более устойчивых классификаторов. Освоение этих техник поможет сделать торговые модели более устойчивыми, надёжными и прибыльными.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Разработка инструментария для анализа Price Action (Часть 41): Создание советника для статистического анализа ценовых уровней на MQL5 Разработка инструментария для анализа Price Action (Часть 41): Создание советника для статистического анализа ценовых уровней на MQL5
Статистика всегда лежала в основе финансового анализа. По определению статистика – это дисциплина, которая собирает, анализирует, интерпретирует и представляет данные в осмысленном виде. Теперь представьте, что тот же подход применяется к свечам – необработанная ценовая динамика преобразуется в измеримые показатели. Насколько полезно было бы знать для заданного периода центральную тенденцию, разброс и распределение поведения рынка? В этой статье мы покажем именно такой подход и разберем, как статистические методы превращают свечные данные в четкие, практические сигналы.