MetaTrader 5 build 3390: Float в OpenCL и математических функциях, методы активации и потерь для машинного обучения

Что нового в MetaTrader 5?

4 августа 2022

Terminal

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

    Добавлено автоматическое открытие туториала при первом подключении к торговому счету.

  2.  Исправлена ошибка групповых операций "Закрыть прибыльные/убыточные позиции". Ранее для закрытия соответствующих позиций платформа использовала встречные позиции при их наличии. Например, если у вас было две убыточные позиции Buy по EURUSD и одна прибыльная позиция Sell по EURUSD, то при массовом закрытии убыточных позиций были бы закрыты все три имеющиеся позиции. Buy и Sell были бы закрыты операцией Close by, а оставшаяся Buy — обычной операцией закрытия. Теперь команды работают как запланировано, закрывая только выбранные позиции — прибыльные или убыточные.
  3. Исправлено отображение ценовой истории для отрицательных цен на графиках с периодом D1. Теперь графики с негативными ценами отображаются правильно на всех таймфреймах.
  4. Оптимизировано и значительно снижено потребление системных ресурсов терминалом.
  5. Обновлена база фундаментальных данных торговых инструментов. Количество агрегаторов, доступных для просмотра биржевого инструмента, расширено до 15, что позволяет находить информацию по максимально большому числу тикеров на самых популярных экономических агрегаторах.

    Обновлена база фундаментальных данных торговых инструментов.

    На мировом рынке котируются не менее 7 000 ликвидных акций и более 2 000 ETF. Кроме того, есть множество фьючерсов и других производных инструментов. Платформа MetaTrader 5 содержит огромную базу данных по биржевым инструментам и позволяет прямо из Market Watch в один клик перейти на сайт агрегатора для получения фундаментальных данных. Для удобства инвесторов для каждой ценной бумаги мы предлагаем на выбор множество источников информации.
  6. Исправлена подстановка уровней Стоп Лосс и Тейк Профит в окне выставления нового ордера. Теперь для счетов, работающих в режиме FIFO, значения стоп-уровней будут автоматически устанавливаться в соответствии со стоп-уровнями уже открытых позиций по тому же инструменту. Это необходимо для соблюдения правила FIFO.

MQL5

  1. Математические функции теперь могут работать с матрицами и векторами.

    Мы продолжаем расширять возможности платформы MetaTrader 5 для алготрейдинга и машинного обучения. Ранее мы добавили новый тип данных — матрицы и векторы, которые позволяют отказаться от использования массивов для обработки данных. Для работы с ними мы добавили в язык MQL5 более 70 методов, которые позволяют проводить вычисления из линейной алгебры и статистики в виде одной операции. Умножение, преобразование и решение системы уравнений — всё это теперь делается просто и без лишнего программирования. Добавление новых типов не оставило в стороне и математические функции.

    Математические функции изначально были предназначены для проведения математических операций над скалярными величинами. Теперь большая часть этих функций может использоваться и с новыми типами данных — матрицами и векторами — MathAbs, MathArccos, MathArcsin, MathArctan, MathCeil, MathCos, MathExp, MathFloor, MathLog, MathLog10, MathMod, MathPow, MathRound, MathSin, MathSqrt, MathTan, MathExpm1, MathLog1p, MathArccosh, MathArcsinh, MathArctanh, MathCosh, MathSinh, MathTanh. В этом случае матрица или вектор обрабатываются почленно. Пример:
    //---
      matrix a= {{1, 4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {9, 16}};
      Print("matrix a=\n",a);
    
      a=MathSqrt(a);
      Print("MatrSqrt(a)=\n",a);
      /*
       matrix a=
       [[1,4]
        [9,16]]
       MatrSqrt(a)=
       [[1,2]
        [3,4]]
      */
    В случае MathMod и MathPow в качестве второго параметра может быть использован как скаляр, так и матрица или вектор соответствующего размера.

    Покажем на примере, как вычислить стандартное отклонение с помощью математических функций над вектором.
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- используем инициализирующую функцию для заполнения вектора
      vector r(10, ArrayRandom); // массив случайных чисел от 0 до 1
    //--- вычислим среднее значение
      double avr=r.Mean();       // среднее значение массива
      vector d=r-avr;            // вычислим массив отклонений от среднего значения
      Print("avr(r)=", avr);
      Print("r=", r);
      Print("d=", d);
      vector s2=MathPow(d, 2);   // массив квадратов отклонений
      double sum=s2.Sum();       // сумма квадратов отклонений
    //--- вычислим стандартное отклонение 2-мя способами
      double std=MathSqrt(sum/r.Size());
      Print(" std(r)=", std);
      Print("r.Std()=", r.Std());    
     }
    /*
      avr(r)=0.5300302133243813
      r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
      d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
       std(r)=0.2838269732183663
      r.Std()=0.2838269732183663
    */ 
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }
    

  2. В шаблонных функциях теперь можно использовать записи matrix<double>, matrix<float>, vector<double>, vector<float> вместо соответствующих типов matrix, matrixf, vector, vectorf.
  3. Доработаны математические функции для работы с типом float. В связи с появившейся возможностью применения математических функций к матрицам и векторам типа float, были также доработаны соответствующие функции, применяемые к скалярам типа float. Раньше параметры этих функций безусловно приводились к типу double, вызывалась соответствующая реализация математической функции, и затем результат приводился к типу float. Теперь в случае типа float параметры и результаты не подвергаются приведению, так как вызываются реализации математических функций, соответствующих типу float.

    Разница в вычислениях на примере математического синуса:

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---  массив случайных чисел от 0 до 1
      vector d(10, ArrayRandom);
      for(ulong i=0; i<d.Size(); i++)
       {
        double delta=MathSin(d[i])-MathSin((float)d[i]);
        Print(i,". delta=",delta);
       }
     }
    /*
       0. delta=5.198186103783087e-09
       1. delta=8.927621308885136e-09
       2. delta=2.131878673594656e-09
       3. delta=1.0228555918923021e-09
       4. delta=2.0585739779477308e-09
       5. delta=-4.199390279957527e-09
       6. delta=-1.3221741035351897e-08
       7. delta=-1.742922250969059e-09
       8. delta=-8.770715820283215e-10
       9. delta=-1.2543186267421902e-08
    */
    //+------------------------------------------------------------------+
    //| Заполняет вектор случайными значениями                           |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }

  4. Добавлены методы матриц и векторов Activation (активационная функция) и Derivative (производная активационной функции) с параметрами:
    AF_ELU               Exponential Linear Unit
    AF_EXP               Exponential
    AF_GELU              Gaussian Error Linear Unit
    AF_HARD_SIGMOID      Hard Sigmoid
    AF_LINEAR            Linear
    AF_LRELU             Leaky REctified Linear Unit
    AF_RELU              REctified Linear Unit
    AF_SELU              Scaled Exponential Linear Unit
    AF_SIGMOID           Sigmoid
    AF_SOFTMAX           Softmax
    AF_SOFTPLUS          Softplus
    AF_SOFTSIGN          Softsign
    AF_SWISH             Swish
    AF_TANH              Hyperbolic Tangent
    AF_TRELU             Thresholded REctified Linear Unit
    Функция активации в нейронной сети определяет, как взвешенная сумма входного сигнала преобразуется в выходной сигнал узла или узлов на уровне сети. Выбор функции активации имеет большое влияние на возможности и производительность нейронной сети. В разных частях модели могут использоваться разные функции активации. В MQL5 реализованы не только все известные функции активации, но и производные активационной функции. Производные функции нужны для быстрого вычисления поправки на основании полученной ошибки во время обучения нейронной сети.

  5. Добавлен метод матриц и векторов Loss (функция потерь) со следующими параметрами:
    LOSS_MSE            Mean Squared Error
    LOSS_MAE            Mean Absolute Error
    LOSS_CCE            Categorical Crossentropy
    LOSS_BCE            Binary Crossentropy
    LOSS_MAPE           Mean Absolute Percentage Error
    LOSS_MSLE           Mean Squared Logarithmic Error
    LOSS_KLD            Kullback-Leibler Divergence
    LOSS_COSINE         Cosine similarity/proximity
    LOSS_POISSON        Poisson
    LOSS_HINGE          Hinge
    LOSS_SQ_HINGE       Squared Hinge
    LOSS_CAT_HINGE      Categorical Hinge
    LOSS_LOG_COSH       Logarithm of the Hyperbolic Cosine
    LOSS_HUBER          Huber

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

  6. Добавлены методы матриц и векторов matrix::CompareByDigits и vector::CompareByDigits. Они сравнивают элементы двух матриц/векторов на совпадение значащих цифр.

  7. Добавлена поддержка функций MathMin и MathMax для строк. В этом случае функции будут использовать лексикографическое сравнение — буквы сравниваются согласно алфавиту и с учетом регистра.

  8. Увеличено максимальное количество объектов OpenCL c 256 до 65536. Хендлы на OpenCL-объекты в MQL5-программе создаются с помощью функций CLContextCreate, CLBufferCreate и CLProgramCreate. Прежнее ограничение в 256 хендлов не позволяло эффективно работать в методах машинного обучения.

  9. Разрешено использование OpenCL на картах без поддержки double. Ранее в MQL5-программах безусловно использовались только GPU с поддержкой double, хотя множество задач допускают и предназначены для расчетов с использованием float. Тип float изначально считается родным для проведения параллельных вычислений, так как занимает меньше места. Теперь это требование убрано.

    Если для решения задачи требуется использовать только GPU с поддержкой double, то это можно явно указать при вызове CLContextCreate с помощью нового значения CL_USE_GPU_DOUBLE_ONLY (разрешается использовать только устройства, которые поддерживают вычисления с типом double).
       int cl_ctx;
    //--- инициализация OpenCL контекста
       if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE)
         {
          Print("OpenCL not found");
          return;
         }

  10. Исправлена работа функции CustomBookAdd. Ранее, если в поле MqlBookInfo::volume_real указывалось нулевое значение, снимок стакана цен не создавался. Теперь проверка выполняется так:
    Передаваемые данные проверяются на корректность: для каждого элемента должны быть указаны тип, цена и объем. При этом MqlBookInfo.volume и MqlBookInfo.volume_real не должны быть нулевыми или отрицательными: если оба объема отрицательны, то это будет считаться ошибкой. Указывать можно любой из объемов или оба — берется тот, который указан или является положительным:

       volume=-1 && volume_real=2 — будет использован volume_real=2,

       volume=3 && volume_real=0 — будет использован volume=3.

    Объем с повышенной точностью MqlBookInfo.volume_real имеет больший приоритет по сравнению с обычным MqlBookInfo.volume. Если для элемента стакана указаны оба значения, будет использовано volume_real.

    Если хотя бы один элемент стакана описан неверно, система отбросит переданное состояние полностью.

  11. Исправлена работа функции CalendarValueLast. Ошибка заключалась в том, что в некоторых случаях последовательные вызовы функции после изменений в экономическом календаре (параметр change получал новое значение после вызова) могли пропускать события при использовании фильтра по валюте.
    CalendarValueLast(change, result, "", "EUR")
  12. Исправлено поведение функции ArrayBSearch — при наличии нескольких одинаковых элементов возвращается ссылка на первый по порядку, а не на случайный, как было ранее.
  13. Исправлен учёт видимости шаблонной функции в классе. Ошибка заключалась в том, что функции шаблона класса, объявленные как private/protected, оказывались фактически общедоступными (public).

MetaEditor

  1. Исправлены ошибки и неоднозначное поведение MetaAssist.
  2. Добавлена поддержка макроса %terminal%, который означает путь к каталогу данных платформы, где установлен данный терминал. Например, %terminal%\MQL5\Experts. 

    Добавлена поддержка макроса %terminal%, который означает путь к каталогу данных платформы, где установлен данный терминал.

  3. Улучшено отображение массивов в отладчике.
  4. Увеличен буфер для копирования значений из отладчика.
  5. Улучшены подсказки при ошибках.
  6. В файле проекта *.mproj теперь прописываются относительные пути. Ранее пути были абсолютные, что приводило к ошибкам компиляции при перемещении проекта.
  7. Добавлено автоматическое встраивание BMP-ресурсов в виде глобально доступных 32-битных массивов битмапа при включении в проекты. Это избавляет от необходимости вызывать в коде ResourceReadImage для чтения графического ресурса.
    'levels.bmp' as 'uint levels[18990]'
    
  8. Улучшено чтение расширенных форматов BMP-файлов.
  9. Обновлены переводы пользовательского интерфейса.
  10. Исправления по крешлогам.