Обсуждение статьи "Возможности Мастера MQL5, которые вам нужно знать (Часть 23): CNN"

Опубликована статья Возможности Мастера MQL5, которые вам нужно знать (Часть 23): CNN:

Свёрточные нейронные сети (Convolutional Neural Networks, CNNs) — ещё один алгоритм машинного обучения, который, как правило, специализируется на разложении многомерных наборов данных на ключевые составные части. Мы рассмотрим принцип его работы и исследуем возможное применение для трейдеров в очередном классе сигналов Мастера MQL5.

Мы продолжаем рассматривать идеи машинного обучения и статистики, которые могут быть полезны трейдерам, в контексте быстрого тестирования и прототипирования в Мастере MQL5. Цель по-прежнему заключается в рассмотрении одной идеи в рамках одной статьи. Изначально я думал, что для этой части потребуется как минимум две статьи, но всё же рискнул втиснуть информацию в одну. Как следует из названия, сверточные нейронные сети (Convolutional Neural Networks, CNNs) обрабатывают многомерные данные в свертках с помощью ядер.

Эти ядра несут на себе сетевые веса и, как и многомерные входные данные, обычно имеют матричную форму. Они имеют меньшие общие размеры по сравнению с входными данными. Выполняя итерацию по матрице входных данных при прямом распространении (feed forward), каждая итерация по сути циклически проходит по входным данным. Именно из-за этого "цикла" сети и называют "сверточными".

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

Автор: Stephen Njuki

Невозможно скомпилировать , потому что многие файлы потеряны. например


//--- доступный трейлинг

#include <Expert\Trailing\TrailingNone.mqh>
//--- доступное управление деньгами
#include <Expert\Money\MoneyFixedMargin.mqh>

Somkait Somsanitungkul управление деньгами
#include <Expert\Money\MoneyFixedMargin.mqh>

Здравствуйте

Файлы, на которые вы ссылаетесь, поставляются с MQL5 IDE. Здесь и здесь есть руководства по использованию мастера.

Спасибо, что прочитали.

MQL5 Wizard: Creating Expert Advisors without Programming
MQL5 Wizard: Creating Expert Advisors without Programming
  • www.mql5.com
Do you want to try out a trading strategy while wasting no time for programming? In MQL5 Wizard you can simply select the type of trading signals, add modules of trailing positions and money management - and your work is done! Create your own implementations of modules or order them via the Jobs service - and combine your new modules with existing ones.
2024.08.30 19:02:07.453 2020.01.28 00:00:00 индекс вне диапазона в 'SignalWZ_23_.mqh' (191,38)

Israel Goncalves Moraes De Souza выходит за пределы диапазона в файле «SignalWZ_23_.mqh» (191,38)

У меня то же самое. Ошибка связана с вектором _c[], который не скопирован. Так же, как _ma[0] обозначает цену последнего бара скользящего среднего, _c[] обозначает цену последнего закрытия. Несколько строк ниже он обновляется, похоже, что он каким-то образом проскочил.


double CSignalCNN::GetOutput()
  {
   int _index = 5;
   matrix _inputs;
   vector _ma, _h, _l, _c;
   _inputs.Init(m_input_size, m_input_size);
   for(int g = 0; g < m_epochs; g++)
     {
      for(int h = m_train_set - 1; h >= 0; h--)
        {
         _inputs.Fill(0.0);
         _index = 0;
         for(int i = 0; i < m_input_size; i++)
           {
            for(int j = 0; j < m_input_size; j++)
              {
               if(_ma.CopyIndicatorBuffer(m_ma[_index].Handle(), 0, h, __KERNEL + 1)
                  && _h.CopyRates(m_symbol.Name(), m_period, 2, h, __KERNEL + 1)
                  && _l.CopyRates(m_symbol.Name(), m_period, 4, h, __KERNEL + 1)
                  && _c.CopyRates(m_symbol.Name(), m_period, 8, h, __KERNEL + 1))
                 {
                  _inputs[i][j] = _c[0] - _ma[0];
                  _index++;
                 }
              }
           }
         //

         //Print(" входные данные: \n", _inputs);
         CNN.Set(_inputs);
         CNN.Pad();
         //Print("Входы с заполнителем: \n", CNN.inputs);
         CNN.Convolve();
         CNN.Activate();
         CNN.Pool();
         // целевые уровни, поскольку изменения цены с каждой матрицей служат индикатором бычьего, медвежьего или колебательного тренда
         // подразумевая матрицы для eventful:
         // значительные изменения цен
         // незначительные изменения цен
         // изменения цены закрытия,
         // соответственно
         //
         // Изменения цены в каждом столбце охватывают соответственно 1, 2 и 3 бара
         // & изменения цены в каждой строке обусловлены различными весами применяемой цены по отношению к другим применяемым ценам
         // Итак, значение «high» определяется следующим образом: только максимумы (H); (максимумы + максимумы + цена закрытия)/3 (HHC); и (максимумы + цена закрытия)/3 (HC)
         // при этом «low» определяется как: только минимумы (L); (минимумы + минимумы + цена закрытия)/3 (LLC); и (минимумы + цена закрытия)/3 (LC)
         // а цена закрытия рассчитывается следующим образом: только цена закрытия (C); (максимумы + минимумы + цена закрытия + цена закрытия)/3 (HLCC); и (максимумы + минимумы + цена закрытия)/3 (HLC)
         //
         // Здесь исходят из следующих допущений:
         // высокие значения в верхней части графиков означают бычий тренд
         // высокие значения в нижней части графика указывают на медвежью тенденцию
         // а небольшая амплитуда колебаний в условиях тесного диапазона свидетельствует о волатильном рынке
         matrix _targets[];
         ArrayResize(_targets, __KERNEL_SIZES.Size());
         for(int i = 0; i < int(__KERNEL_SIZES.Size()); i++)
           {
            _targets[i].Init(__KERNEL_SIZES[i], __KERNEL_SIZES[i]);
            //
            for(int j = 0; j < __KERNEL_SIZES[i]; j++)
              {
               if(i == 0)// максимальные значения «бычьего настроения»
                 {
                  _targets[i][j][0] = _h[j] - _h[j + 1];
                  _targets[i][j][1] = ((_h[j] + _h[j] + _c[j]) / 3.0) - ((_h[j + 1] + _h[j + 1] + _c[j + 1]) / 3.0);
                  _targets[i][j][2] = ((_h[j] + _c[j]) / 2.0) - ((_h[j + 1] + _c[j + 1]) / 2.0);
                 }
               else
                  if(i == 1)// минимумы, указывающие на «медвежью тенденцию»
                    {
                     _targets[i][j][0] = _l[j] - _l[j + 1];
                     _targets[i][j][1] = ((_l[j] + _l[j] + _c[j]) / 3.0) - ((_l[j + 1] + _l[j + 1] + _c[j + 1]) / 3.0);
                     _targets[i][j][2] = ((_l[j] + _c[j]) / 2.0) - ((_l[j + 1] + _c[j + 1]) / 2.0);
                    }
                  else
                     if(i == 2)// закрыть позицию из-за «whipsaw»
                       {
                        _targets[i][j][0] = _c[j] - _c[j + 1];
                        _targets[i][j][1] = ((_h[j] + _l[j] + _c[j] + _c[j]) / 3.0) - ((_h[j + 1] + _l[j + 1] + _c[j + 1] + _c[j + 1]) / 3.0);
                        _targets[i][j][2] = ((_h[j] + _l[j] + _c[j]) / 2.0) - ((_h[j + 1] + _l[j + 1] + _c[j + 1]) / 2.0);
                       }
              }
            //
            //Print("Цели для: " + IntegerToString(i) + " следующие: \n", _targets[i]);
           }
         CNN.Get(_targets);
         CNN.Evolve(m_learning_rate);
        }
     } // Конец цикла For

   _index = 0;
   _h.CopyRates(m_symbol.Name(), m_period, 2, 0, __KERNEL + 1);
   _l.CopyRates(m_symbol.Name(), m_period, 4, 0, __KERNEL + 1);
   _c.CopyRates(m_symbol.Name(), m_period, 8, 0, __KERNEL + 1);
   for(int i = 0; i < m_input_size; i++)
     {
      for(int j = 0; j < m_input_size; j++)
        {
         if(_ma.CopyIndicatorBuffer(m_ma[_index].Handle(), 0, 0, __KERNEL + 1))
           {
            _inputs[i][j] = _c[__KERNEL] - _ma[__KERNEL];
            _index++;
           }
        }
     }
   CNN.Set(_inputs);
   CNN.Pad();
   CNN.Convolve();
   CNN.Activate();
   CNN.Pool();
   double _long = 0.0, _short = 0.0;
   if(CNN.output[0].Median() > 0.0)
     {
      _long = fabs(CNN.output[0].Median());
     }
   if(CNN.output[1].Median() < 0.0)
     {
      _short = fabs(CNN.output[1].Median());
     }
   double _neutral = fabs(CNN.output[2].Median());
   if(_long + _short + _neutral == 0.0)
     {
      return(0.0);
     }
   return((_long - _short) / (_long + _short + _neutral));
  }

Замените этот метод

Tobias Johannes Zimmer #:

У меня то же самое. Ошибка связана с вектором _c[], который не копируется. Так же как _ma[0] обозначает цену последнего бара скользящего среднего, _c[] обозначает цену последнего закрытия. Несколько строк ниже он обновляется, похоже, что-то сбилось.


Замените этот метод

Пожалуйста, ознакомьтесь с исправленным приложением.

Файлы:
Пожалуйста, посмотрите приложение с отладочной информацией.
Файлы: