122 lines
9.3 KiB
MQL5
122 lines
9.3 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| 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);
|
|
}
|
|
//+------------------------------------------------------------------+
|