//+------------------------------------------------------------------+ //| positionencoder.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" //+------------------------------------------------------------------+ //| Подключаем библиотеки | //+------------------------------------------------------------------+ #include "bufferdouble.mqh" //+------------------------------------------------------------------+ //| Class CPositionEncoder | //| Назначение: Класс позиционного кодированиия | //+------------------------------------------------------------------+ class CPositionEncoder : public CBufferDouble { protected: uint m_iCount; uint m_iDimension; public: CPositionEncoder(void) {}; ~CPositionEncoder(void) {}; //--- virtual bool InitEncoder(uint count, uint dimension); // Метод инициализации virtual bool AddEncoder(CBufferDouble *&buffer); // Метод добавление позиционного коирования к исходным данным //--- Метод работы с файлами virtual bool Save(const int file_handle); virtual bool Load(const int file_handle); }; //+------------------------------------------------------------------+ //| Метод инициализации | //+------------------------------------------------------------------+ bool CPositionEncoder::InitEncoder(uint count, uint dimension) { //--- Сожраняем 5константы m_iCount = count; m_iDimension = dimension; m_data_total = (int)(count * dimension); //--- Подготовка буфера if(ArrayResize(m_data, m_data_total) < m_data_total) { m_data_total = 0; return false; } m_data_max = m_data_total; //--- Заполнение буфера метками позиционного кодирования for(int i = 0; i < (int)count; i++) { for(int d = 0; d < (int)dimension; d++) { int pos = i * (int)dimension + d; double value = i / pow(1000, 2 * d / dimension); switch(d % 2) { case 0: m_data[pos] = MathSin(value); break; case 1: m_data[pos] = MathCos(value); break; } } } //--- Создание буфера в контексте OpenCL if(CheckPointer(m_cOpenCL) != POINTER_INVALID) BufferCreate(m_cOpenCL); //--- return true; } //+------------------------------------------------------------------+ //| Метод добавление позиционного колирования к исходным данным | //+------------------------------------------------------------------+ bool CPositionEncoder::AddEncoder(CBufferDouble *&buffer) { //--- Блок контролей if(CheckPointer(buffer) == POINTER_INVALID) return false; if(buffer.Total() > m_data_total) if(!InitEncoder(1,buffer.Total())) return false; //--- Добавляем метки к буферу исходных данных double result[]; int total = buffer.Total(); if(ArrayResize(result, total) < total) return false; for(int i = 0; i < total; i++) buffer.m_data[i] += m_data[i]; //--- return true; } //+------------------------------------------------------------------+ //| Метод сохранения элементов класса в файл | //+------------------------------------------------------------------+ bool CPositionEncoder::Save(const int file_handle) { //--- Блок контролей if(file_handle == INVALID_HANDLE) return false; //--- Сохранение констант if(!FileWriteInteger(file_handle, (int)m_iCount) || !FileWriteInteger(file_handle, (int)m_iDimension)) return false; //--- return true; } //+------------------------------------------------------------------+ //| Метод восстановления класса из сохранённых данных | //+------------------------------------------------------------------+ bool CPositionEncoder::Load(const int file_handle) { //--- Блок контролей if(file_handle == INVALID_HANDLE) return false; //--- Считываем константы m_iCount = (uint)FileReadInteger(file_handle); m_iDimension = (uint)FileReadInteger(file_handle); //--- return InitEncoder(m_iCount, m_iDimension); } //+------------------------------------------------------------------+