Обсуждение статьи "Работа с матрицами и векторами в MQL5"

 

Опубликована статья Работа с матрицами и векторами в MQL5:

Для решения большого класса математических задач в язык MQL5 были добавлены специальные типы данных — матрицы и векторы. Новые типы имеют встроенные методы для написания краткого и понятного кода, который близок к математической записи.

За последние годы мы сделали многое по внедрению передовых технологий в язык MQL5:



    Язык MQL5 будет продолжать развиваться, и приоритетным направлением является машинное обучение. У нас большие планы, и мы не останавливаемся на достигнутом. Оставайтесь с нами, поддерживайте нас и учитесь новому вместе с нами.

    Автор: MetaQuotes

     
    matrix corr_from_matrix=rates.CorrCoef(false);   // false означает, что векторы находятся в строках матрицы

    Уверены, что не в столбцах?

     
        //--- получим цены Close в вектор
        if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
         {
          //--- вставим вектор в матрицу таймсерий
          rates.Col(close, i);

    К сожалению, подобный простой способ заполнения матрицы имеет серьезный изъян: несинхронизированность мультивалютных баров.

    Возможно, имеет смысл делать штатный метод CopyRates еще и для матриц, чтобы получать корректные данные так же просто.

     
    Уделили внимание простому заполнению векторов ценовыми данными. Однако, есть же еще и торговые сделки.
    vector::Deals( void* Filter );

    Соответственно, напрашивается раздел Статистики наполнить не только математическими методами, но и финансовыми: Gain, MaxDD, PF и т.д.

     
    fxsaber #:

    Уверены, что не в столбцах?

    Да, опечатка.

    Спасибо, исправили.

     
    fxsaber #:

    К сожалению, подобный простой способ заполнения матрицы имеет серьезный изъян: несинхронизированность мультивалютных баров.

    Возможно, имеет смысл делать штатный метод CopyRates еще и для матриц, чтобы получать корректные данные так же просто.

    Вот же гвозди  метод  CopyRates и пример в нем

    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- получим котировки в матрицу
      matrix matrix_rates;
      if(matrix_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_OHLCT, 1, 10))
        Print("matrix rates: \n", matrix_rates);
      else
        Print("matrix_rates.CopyRates failed. Error ", GetLastError());
    //--- проверка
      MqlRates mql_rates[];
      if(CopyRates(Symbol(), PERIOD_CURRENT, 1, 10, mql_rates)>0)
       {
        Print("mql_rates array:");
        ArrayPrint(mql_rates);
       }
      else
        Print("CopyRates(Symbol(), PERIOD_CURRENT,1, 10, mql_rates). Error ", GetLastError());
    //--- получим котировки в вектор = неправильный вызов
      vector vector_rates;
      if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_OHLC, 1, 15))
        Print("vector_rates COPY_RATES_OHLC: \n", vector_rates);
      else
        Print("vector_rates.CopyRates COPY_RATES_OHLC failed. Error ", GetLastError());
    //--- получим цены закрытия в вектор
      if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_CLOSE, 1, 15))
        Print("vector_rates COPY_RATES_CLOSE: \n", vector_rates);
      else
        Print("vector_rates.CopyRates failed. Error ", GetLastError());
     };
    /*
       matrix rates:
       [[0.99686,0.99638,0.99588,0.99441,0.99464,0.99594,0.99698,0.99758,0.99581,0.9952800000000001]
        [0.99708,0.99643,0.99591,0.9955000000000001,0.99652,0.99795,0.99865,0.99764,0.99604,0.9957]
        [0.9961100000000001,0.99491,0.99426,0.99441,0.99448,0.99494,0.9964499999999999,0.99472,0.9936,0.9922]
        [0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
        [1662436800,1662440400,1662444000,1662447600,1662451200,1662454800,1662458400,1662462000,1662465600,1662469200]]
       mql_rates array:
                        [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2022.09.06 04:00:00 0.99686 0.99708 0.99611 0.99641          4463        0             0
       [1] 2022.09.06 05:00:00 0.99638 0.99643 0.99491 0.99588          4519        0             0
       [2] 2022.09.06 06:00:00 0.99588 0.99591 0.99426 0.99441          3060        0             0
       [3] 2022.09.06 07:00:00 0.99441 0.99550 0.99441 0.99464          3867        0             0
       [4] 2022.09.06 08:00:00 0.99464 0.99652 0.99448 0.99594          5280        0             0
       [5] 2022.09.06 09:00:00 0.99594 0.99795 0.99494 0.99697          7227        0             0
       [6] 2022.09.06 10:00:00 0.99698 0.99865 0.99645 0.99758         10130        0             0
       [7] 2022.09.06 11:00:00 0.99758 0.99764 0.99472 0.99581          7012        0             0
       [8] 2022.09.06 12:00:00 0.99581 0.99604 0.99360 0.99528          6166        0             0
       [9] 2022.09.06 13:00:00 0.99528 0.99570 0.99220 0.99259          6950        0             0
       vector_rates.CopyRates COPY_RATES_OHLC failed. Error 4003
       vector_rates COPY_RATES_CLOSE:
       [0.9931,0.99293,0.99417,0.99504,0.9968399999999999,0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
    */
    Документация по MQL5: Методы матриц и векторов / Инициализация / CopyRates
    Документация по MQL5: Методы матриц и векторов / Инициализация / CopyRates
    • www.mql5.com
    CopyRates - Инициализация - Методы матриц и векторов - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
     
    Rashid Umarov #:

    Вот же гвозди  метод  CopyRates и пример в нем

    Видимо, плохо сформулировал проблему. При заполнении матрицы для расчета корреляции символов может случиться так, что EURUSD[5].BarTime не совпадает с GBPUSD[5].BarTime. Это называется мультибаровой несинхронизированностью. Подобной подготовке данных перед расчетами приходится уделять довольно много времени/усилий. Если это будет решаться одной строкой, будет здорово.

     

    В статье указано:

    Над матрицами и векторами можно поэлементно производить математические операции — сложение, вычитание, умножение и деление. Для этого оба объекта должны быть одного и того же типа и должны иметь одинаковые размеры. Каждый член матрицы/вектора оперирует с соответствующим элементом второй матрицы/вектора.

    Хочу уточнить, как происходит такое вычисление, т.е. приводятся ли числа к double, а потом происходят вычисление и обратное преобразование в начальный тип данных, что снижало бы потери точности (или я не прав и разницы нет?), или сразу в том типе данных, что есть? Очевидно, что разные типы позволяют экономить оперативную память, но если я вычисляю в массивах данные, то привожу цифры в double для вычислений, а потом опять, допустим во float для сохранения точности вычислений. Может сделать по выбору, как производить операции над числами?
     

    В инструкции есть такое

    void matrix.FromBuffer(const int rows, const int cols, const scalar array[], const int count=-1, const int offset=0)

    frombuffer

    Создает матрицу из одномерного массива


    но по факту не работает. Есть ли другой способ одномерный массив скопировать в матрицу?

     
    Есть, почитайте статью .
     
    Rashid Umarov #:
    Есть, почитайте статью .

    В статье многомерный массив копируется, а надо одномерный!