English 中文 Español Deutsch 日本語 Português
preview
Возможности Мастера MQL5, которые вам нужно знать (Часть 40): Parabolic SAR

Возможности Мастера MQL5, которые вам нужно знать (Часть 40): Parabolic SAR

MetaTrader 5Торговые системы |
463 0
Stephen Njuki
Stephen Njuki

Введение

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

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

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


Определение Parabolic SAR

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

где:  

  • SAR n+1 ​- значение SAR для следующего периода.
  • SAR n ​- текущее значение SAR.
  • EP (Extreme Point) - самая высокая цена в текущем тренде.
  • α - коэффициент ускорения (acceleration factor, AF), который обычно начинается с 0,02 и увеличивается на 0,02 каждый раз при достижении нового EP, максимум — 0,20 (может меняться в зависимости от настроек пользователя).

Также стоит отметить, что при восходящем тренде:

  • EP - самый высокий максимум с начала тренда.
  • Значение SAR будет увеличиваться по мере продолжения тренда, корректируясь в соответствии с движением цены.

Для медвежьего тренда:

где:

  • EP - самая низкая цена в текущем нисходящем тренде.

Не менее примечательно, что в нисходящем тренде:

  • EP - самый низкий минимум с начала тренда.
  • Значение SAR будет снижаться с течением времени, следуя за медвежьим трендом.

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


Пересечение интервала разворота (Reversal Gap Crossover)

Наш первый паттерн, 0, представляет собой пересечение интервала (разрыва), при котором точки индикатора SAR меняют положение, становясь либо ниже минимумов в случае бычьего разрыва, либо выше максимумов в случае медвежьего разрыва. Часто величина разрыва между точками Parabolic SAR и ближайшей ценовой точкой (которая будет минимальной для бычьего разрыва или максимальной - для медвежьего) указывает на силу сигнала. Чем шире разрыв, тем сильнее новый тренд.

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

Для реализации нашего шаблона 0 в нашем пользовательском классе сигнала мы используем следующую функцию:

//+------------------------------------------------------------------+
//| Check for Pattern 0.                                             |
//+------------------------------------------------------------------+
bool CSignalSAR::IsPattern_0(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Base(StartIndex() + 1) > High(StartIndex() + 1) && Base(StartIndex()) < Low(StartIndex()))
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex() + 1) < Low(StartIndex() + 1) && Base(StartIndex()) > High(StartIndex()))
   {  return(true);
   }
   return(false);
}

Тестовые прогоны для собранного с помощью Мастера советника, который использует исключительно паттерн 0, дают нам следующие результаты:

r0

c_0


Зона сжатия SAR (SAR Compression Zone)

Наш следующий паттерн — зона сжатия. По сути, это усовершенствованный шаблон 0. Его главное отличие, как следует из названия, заключается в необходимости сжатия цены (что соответствует предыдущему тренду низкой волатильности) перед разворотом индикатора SAR. Как уже упоминалось, SAR указывает на то, какой тренд в настоящее время преобладает (бычий или медвежий), и поэтому, если предыдущий тренд имел незначительную динамику, это можно интерпретировать как сжатие. Количественная оценка "незначительного" значения может означать, что нам необходимо добавить еще один входной параметр для определения этого значения. Однако я решил реализовать паттерн следующим образом:

bool              Compression(ENUM_POSITION_TYPE T, double &Out)
   {                 Out = 0.0;
                     int _i = StartIndex() + 1, _c = 0;
                     double _last = Base(StartIndex() + 1);
                     double _first = 0.0;
                     if
                     (
                     T == POSITION_TYPE_BUY &&
                     Base(StartIndex()) < Low(StartIndex()) &&
                     Base(_i) < Close(StartIndex()) &&
                     Base(_i) > High(_i)
                     )
                     {  while(Base(_i) > High(_i) && _c < __COMPRESSION_LIMIT)
                        {  _first = Base(_i);
                           _i++;
                           _c++;
                        }
                        if(_c > 0)
                        {  Out = fabs(_first - _last)/_c;
                           return(true);
                        }
                     }
                     else if
                     (
                     T == POSITION_TYPE_SELL &&
                     Base(StartIndex()) > High(StartIndex()) &&
                     Base(_i) > Close(StartIndex()) &&
                     Base(_i) < Low(_i)
                     )
                     {  while(Base(_i) < Low(_i) && _c < __COMPRESSION_LIMIT)
                        {  _first = Base(_i);
                           _i++;
                           _c++;
                        }
                        if(_c > 0)
                        {  Out = fabs(_first - _last)/_c;
                           return(true);
                        }
                     }
                     return(false);
   }

Это, в свою очередь, означает, что наша функция шаблона 0 обрабатывается следующим образом:

//+------------------------------------------------------------------+
//| Check for Pattern 1.                                             |
//+------------------------------------------------------------------+
bool CSignalSAR::IsPattern_1(ENUM_POSITION_TYPE T)
{  double _compression = 0.0;
   if(Compression(T, _compression))
   {  if(T == POSITION_TYPE_BUY && _compression < 0.02*fabs(Base(StartIndex())-Low(StartIndex())))
      {  return(true);
      }
      else if(T == POSITION_TYPE_SELL && _compression < 0.02*fabs(Base(StartIndex())-High(StartIndex())))
      {  return(true);
      }
   }
   return(false);
}

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

r1

c1

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



Расширенный трендовый SAR (Extended Trending SAR)

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

//+------------------------------------------------------------------+
//| Check for Pattern 2.                                             |
//+------------------------------------------------------------------+
bool CSignalSAR::IsPattern_2(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && 
   Base(StartIndex()) - Base(StartIndex() + 1) > Base(StartIndex() + 1) - Base(StartIndex() + 2) && 
   Base(StartIndex() + 1) - Base(StartIndex() + 2) > Base(StartIndex() + 2) - Base(StartIndex() + 3) && 
   Base(StartIndex() + 2) - Base(StartIndex() + 3) > Base(StartIndex() + 3) - Base(StartIndex() + 4) 
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   Base(StartIndex() + 1) - Base(StartIndex()) > Base(StartIndex() + 2) - Base(StartIndex() + 1) && 
   Base(StartIndex() + 2) - Base(StartIndex() + 1) > Base(StartIndex() + 3) - Base(StartIndex() + 2) && 
   Base(StartIndex() + 3) - Base(StartIndex() + 2) > Base(StartIndex() + 4) - Base(StartIndex() + 3) 
   )
   {  return(true);
   }
   return(false);
}

Чтобы проверить только паттерн 2, нам понадобится карта входных параметров (input map) для паттернов, используемых в качестве 4. Тестирование советника, использующего только этот шаблон с теми же настройками, которые мы использовали выше, дает следующие результаты:

r2

c2


Ложный разворот SAR (SAR Flip Fake-Out)

Как следует из названия, паттерн фиксирует разворот, который почти немедленно сменяется возвратом к предыдущему движению. Часто это обозначается трендами из одной или двух точек на графике SAR, при этом тренд, следующий за этими точками и находящийся на их противоположной стороне, указывает на истинное направление. Итак, при бычьем сигнале мы видим обычный бычий тренд, за которым следует переворот, который характеризуется продолжительностью всего 1-2 ценовых бара, а затем возобновлением длинного тренда, причем сигналом является возобновление тренда. Аналогично, медвежий паттерн начинается с нисходящего тренда, который ненадолго переворачивает бычий на один или два ценовых бара, прежде чем возобновить нисходящее движение. Реализация паттерна в коде выглядит так:

//+------------------------------------------------------------------+
//| Check for Pattern 3.                                             |
//+------------------------------------------------------------------+
bool CSignalSAR::IsPattern_3(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Base(StartIndex()) < Low(StartIndex()) && Base(StartIndex() + 1) > High(StartIndex() + 1) && Base(StartIndex() + 2) < Low(StartIndex() + 2))
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > High(StartIndex()) && Base(StartIndex() + 1) < Low(StartIndex() + 1) && Base(StartIndex() + 2) > High(StartIndex() + 2))
   {  return(true);
   }
   return(false);
}

Это четвертый паттерн, обозначенный как паттерн 3, размещает сделки полагаясь исключительно на свои сигналы. Наша карта входных параметров для используемых паттернов должна быть равна 8. Тестовые прогоны с настройками, аналогичными указанным выше для этого паттерна, не привели к открытию сделок. Распространенными причинами таких ложных срабатываний являются нестабильные/боковые рынки, низкая волатильность или рыночный шум. Здесь могут помочь вспомогательные индикаторы (например, MACD), анализ ценового действия (для поддержки и сопротивления) или анализ объема (если эта информация доступна). Учитывая вышесказанное, этот сигнал должен быть более надежным, чем одиночный разворот, например, паттерн 0.


Двойной разворот SAR с продолжением тренда (Double SAR Flip with Trend Continuation)

Это паттерн 3 плюс еще два разворота. Это приводит к продолжению тренда, подобно паттерну 3. Так же как паттерн 3 сильнее паттерна 0, паттерн 4 более надежен, чем паттерн 3. Реализация в коде представлена ниже. Тесты паттерна оставлены на усмотрение читателя. В идеале требуется тестирование, превышающее один год. Поскольку в 2023 году по EURJPY на дневном графике не было совершено ни одной сделки по паттерну 3, мы не ожидаем никаких сигналов и по паттерну 4.

//+------------------------------------------------------------------+
//| Check for Pattern 4.                                             |
//+------------------------------------------------------------------+
bool CSignalSAR::IsPattern_4(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && 
   Base(StartIndex()) < Low(StartIndex()) && 
   Base(StartIndex() + 1) > High(StartIndex() + 1) && 
   Base(StartIndex() + 2) < Low(StartIndex() + 2) && 
   Base(StartIndex() + 3) > High(StartIndex() + 4) && 
   Base(StartIndex() + 4) < Low(StartIndex() + 5)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   Base(StartIndex()) > High(StartIndex()) && 
   Base(StartIndex() + 1) < Low(StartIndex() + 1) && 
   Base(StartIndex() + 2) > High(StartIndex() + 2) && 
   Base(StartIndex() + 3) < Low(StartIndex() + 4) && 
   Base(StartIndex() + 4) > High(StartIndex() + 5)
   )
   {  return(true);
   }
   return(false);
}


Расхождение SAR со скользящей средней (SAR Divergence with Moving Average)

Паттерн 5 возникает из-за расхождения (дивергенции). Поскольку расхождения между ценами и SAR встречаются довольно часто, индикатор скользящей средней служит подтверждением. Таким образом, для бычьего сигнала цена будет падать по направлению к SAR, в то время как SAR также будет расти, а скользящая средняя будет ниже или равна SAR. Напротив, для медвежьей модели цена будет расти при падающем SAR, а скользящая средняя все еще будет выше или равна обоим значениям. Количество шагов, необходимое для измерения подъема или спада, можно определить по своему усмотрению (или путем тестирования), однако для наших целей мы просто примем их за три. Реализация в коде выглядит так:

//+------------------------------------------------------------------+
//| Check for Pattern 5.                                             |
//+------------------------------------------------------------------+
bool CSignalSAR::IsPattern_5(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && 
   MA(StartIndex()) <= Base(StartIndex()) && 
   Base(StartIndex()) > Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) > Base(StartIndex() + 2) && 
   Close(StartIndex()) < Close(StartIndex() + 1) && 
   Close(StartIndex() + 1) < Close(StartIndex() + 2)
   )
   {  return(true);
   }
   else if(T == POSITION_TYPE_SELL && 
   MA(StartIndex()) >= Base(StartIndex()) && 
   Base(StartIndex()) < Base(StartIndex() + 1) && 
   Base(StartIndex() + 1) < Base(StartIndex() + 2) && 
   Close(StartIndex()) > Close(StartIndex() + 1) && 
   Close(StartIndex() + 1) > Close(StartIndex() + 2)
   )
   {  return(true);
   }
   return(false);
}

Тестирование советника, использующего только эти паттерны, дает нам следующие результаты:

r5

c5

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


Построение каналов Parabolic SAR (Parabolic SAR Channeling)

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

bool              Channel(ENUM_POSITION_TYPE T)
   {                 vector _max,_max_i;
                     vector _min,_min_i;
                     _max.Init(2);
                     _max.Fill(High(0));
                     _max_i.Init(2);
                     _max_i.Fill(0.0);
                     _min.Init(2);
                     _min.Fill(Low(0));
                     _min_i.Init(2);
                     _min_i.Fill(0.0);
                     for(int i=0;i<m_ma_period;i++)
                     {  if(High(i) > _max[0])
                        {  _max[0] = High(i);
                           _max_i[0] = i;
                        }
                        if(Low(i) < _min[0])
                        {  _min[0] = Low(i);
                           _min_i[0] = i;
                        }
                     }
                     double _slope = (Close(0) - Close(m_ma_period-1))/m_ma_period;
                     double _upper_scale = fabs(_slope);
                     double _lower_scale = fabs(_slope);
                     for(int i=0;i<m_ma_period;i++)
                     {  if(i == _max_i[0])
                        {  continue;
                        }
                        else
                        {  double _i_slope = (High(i) - _max[0])/(i - _max_i[0]);
                           if((_i_slope > 0.0 && _slope > 0.0)||(_i_slope < 0.0 && _slope < 0.0))
                           {  if(fabs(_i_slope-_slope) < _upper_scale)
                              {  _max[1] = High(i);
                                 _max_i[1] = i;
                              } 
                           }
                        }
                     }
                     for(int i=0;i<m_ma_period;i++)
                     {  if(i == _min_i[0])
                        {  continue;
                        }
                        else
                        {  double _i_slope = (Low(i) - _min[0])/(i - _min_i[0]);
                           if((_i_slope > 0.0 && _slope > 0.0)||(_i_slope < 0.0 && _slope < 0.0))
                           {  if(fabs(_i_slope-_slope) < _lower_scale)
                              {  _min[1] = Low(i);
                                 _min_i[1] = i;
                              } 
                           }
                        }
                     }
                     vector _projections;
                     _projections.Init(4);
                     _projections[0] = _max[0] + (_max_i[0]*_slope);
                     _projections[1] = _min[0] + (_min_i[0]*_slope);
                     _projections[2] = _max[1] + (_max_i[1]*_slope);
                     _projections[3] = _min[1] + (_min_i[1]*_slope);
                     if(T == POSITION_TYPE_BUY && Close(0) < Close(m_ma_period) && Close(0) < _projections.Mean())
                     {  return(true);
                     }
                     else if(T == POSITION_TYPE_SELL && Close(0) > Close(m_ma_period) && Close(0) > _projections.Mean())
                     {  return(true);
                     }
                     return(false);
   }

Основными выходными данными этого канала будут, учитывая тип позиции, следующие: указывает ли канал на возможный разворот? И чтобы ответить на этот вопрос, нам нужно сначала определить, какие ценовые точки определяют верхнюю и нижнюю линии. Насколько легко визуально выделить обычный ценовой график, настолько же легко в коде можно прийти к выводу о необходимости фракталов. И хотя это вполне рабочий вариант при условии, что индикатор фракталов будет действительно хорош, я обнаружил, что сосредоточение внимания на общем наклоне заданного исторического периода (look-back period) дает более обобщающее решение.

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

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

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

Вот почему мы определяем наш канал как имеющий две, а не только одну верхнюю и нижнюю границы. Каждая из этих линий будет проходить через четыре точки, которые мы уже определили выше. Наш бычий сигнал с паттерном 6 заключается в том, что цена находится в нижней половине канала, а параболический SAR также указывает на бычий тренд. Для медвежьего варианта цена будет находиться в верхней половине канала, а SAR будет указывать на медвежий тренд. Чтобы определить, в какой половине канала находится наша текущая цена, мы просто возьмем среднее значение всех четырех прогнозируемых ценовых точек. Эти прогнозы представляют собой просто продолжения линий, проходящих через наши две высокие и две низкие точки до текущего индекса, при этом сохраняется тот же наклон общего тренда. Реализуем этот шаблон в MQL5 следующим образом:

//+------------------------------------------------------------------+
//| Check for Pattern 6.                                             |
//+------------------------------------------------------------------+
bool CSignalSAR::IsPattern_6(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY && Base(StartIndex()) < Low(StartIndex()))
   {  return(Channel(T));
   }
   else if(T == POSITION_TYPE_SELL && Base(StartIndex()) > High(StartIndex()))
   {  return(Channel(T));
   }
   return(false);
}

Тестирование с теми же настройками, которые мы использовали выше для EURJPY на дневном графике за 2023 год, дало нам следующие результаты:

r6

c6

Входные данные применения паттернов для текущего паттерна — 64.


Заключение

Мы рассмотрели 7 из 10 возможных моделей Parabolic SAR. Оставшиеся три пришлось оставить на потом, иначе статья стала бы слишком длинной. Паттерны, которые мы рассмотрим в следующей статье, будут включать дивергенцию Parabolic SAR и объема, инвертированную SAR на более высоком таймфрейме, а также наложение SAR и RSI. Каждый из паттернов, уже рассмотренных в этой статье, может быть дополнительно использован и реализован разными способами и в различных форматах. В этой и двух предыдущих статьях мы полагаемся на встроенные методы паттернов файла класса сигнала, от которого наследуется наш пользовательский класс сигнала. В двух предыдущих статьях мы объявляли и использовали параметр m_patterns_used, который был дублирующим и ненужным, поскольку наш родительский класс уже имеет параметр m_patterns_usage. Последний вариант минимизирует наши требования к коду и обеспечивает более краткие результаты, поскольку фактическая карта входных параметров используется должным образом.

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

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

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

Прикрепленные файлы |
SignalWZ_40.mqh (26.24 KB)
wz_40.mq5 (8.39 KB)
Нейросети в трейдинге: Актер—Режиссёр—Критик (Actor—Director—Critic) Нейросети в трейдинге: Актер—Режиссёр—Критик (Actor—Director—Critic)
Предлагаем познакомиться с фреймворком Actor-Director-Critic, который сочетает в себе иерархическое обучение и многокомпонентную архитектуру для создания адаптивных торговых стратегий. В этой статье мы подробно рассмотрим, как использование Режиссера для классификации действий Актера помогает эффективно оптимизировать торговые решения и повышать устойчивость моделей в условиях финансовых рынков.
Как реализовать автоматическую оптимизацию в советниках MQL5 Как реализовать автоматическую оптимизацию в советниках MQL5
Пошаговое руководство по автоматической оптимизации на MQL5 для советников. Мы рассмотрим надежную логику оптимизации, лучшие практики по выбору параметров, а также как реконструировать стратегии с помощью бэк-тестирования. Кроме того, будут рассмотрены методы более высокого уровня, такие как пошаговая форвард-оптимизация, которые улучшат ваш подход к трейдингу.
Определение перекупленности и перепроданности по теории хаоса Определение перекупленности и перепроданности по теории хаоса
Определяем перекупленность и перепроданность рынка по теории хаоса: интеграция принципов теории хаоса, фрактальной геометрии и нейронных сетей для прогнозирования финансовых рынков. Исследование демонстрирует применение показателя Ляпунова, как меры рыночной хаотичности, и динамическую адаптацию торговых сигналов. Методология включает алгоритм генерации фрактального шума, гиперболическую тангенциальную активацию и оптимизацию с моментом.
Пример CNA (сетевого анализа причинно-следственных связей), SMOC (оптимального управления стохастической моделью) и теории игр Нэша с Глубоким обучением Пример CNA (сетевого анализа причинно-следственных связей), SMOC (оптимального управления стохастической моделью) и теории игр Нэша с Глубоким обучением
Мы добавим Глубокое обучение к тем трем примерам, которые были опубликованы в предыдущих статьях, и сравним результаты с предыдущими. Цель состоит в том, чтобы научиться каким образом добавлять Глубокое обучение (DL) в другие советники.