tekora
Tekora

 
Уровень 5

  Торгую в компаниях:

  Моя торговля


График торгового счета tekora

Сохранение котировок в сжатый байт-массив.
[*]

Для хранения котировок в MQL используется специальная структура

struct MqlRates 
  { 
   datetime time;         // время начала периода 
   double   open;         // цена открытия 
   double   high;         // наивысшая цена за период 
   double   low;          // наименьшая цена за период 
   double   close;        // цена закрытия 
   long     tick_volume;  // тиковый объем 
   int      spread;       // спред 
   long     real_volume;  // биржевой объем 
  };

Ранее было сказано, что для одного бара нужно выделить ровно 60 байтов или одномерный массив типа uchar состоящий из 60 элементов. Алгоритм скрипта будет загружать массив баров MqlRates, конвертировать его в байтовое представление symbol_array[], затем сжимать архиватором Zip, и уже сжатые данные zip_symbol[] сохранять в виде массива uchar, определенного в файле mqh. Для сжатия массива байтов была написана специальная подключаемая библиотека Zip. Для сохранения сжатого массива в файл mgh так же был написан дополнительный класс ResourceCreator.

#property version   "1.00"
#include <Zip\Zip.mqh>
#include <ResourceCreator.mqh>
input ENUM_TIMEFRAMES MainPeriod;

union URateToByte
{
   MqlRates bar;
   uchar    bar_array[sizeof(MqlRates)];
}RateToByte;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   //-- Загружаем котировки
   MqlRates rates[];
   int total = CopyRates(Symbol(), Period(), 0, 20000, rates);
   uchar symbol_array[];
   //-- Конвертируем их в байтовое представление
   ArrayResize(symbol_array, sizeof(MqlRates)*total);
   for(int i = 0, dst = 0; i < total; i++, dst +=sizeof(MqlRates))
   {
      RateToByte.bar = rates[i];
      ArrayCopy(symbol_array, RateToByte.bar_array, dst, 0, WHOLE_ARRAY);
   }
   //-- Сжимаем их в zip-архив
   CZip Zip;
   CZipFile* file = new CZipFile(Symbol(), symbol_array);
   Zip.AddFile(file);
   uchar zip_symbol[];
   //-- Получаем байтовое представление сжатого архива
   Zip.ToCharArray(zip_symbol);
   //-- Записываем его в виде включаемого mqh-файла
   CCreator creator;
   creator.ByteArrayToMqhArray(zip_symbol, "rates.mqh", "rates");
}
//+------------------------------------------------------------------+

Результат работы скрипта SaveRates будет создание включаемого файл rates.mqh в котором в сжатом виде будут котировки символа представленные в виде гигантского байт-массива uchar rates[]. Сам файл rates.mqh лучше не открывать в редакторе MetaEditor, т.к. он может повиснуть.
SaveRates.zip (57 Kb)
  • 0
  • Просмотров: 1273
  • 26 февраля 2018, 09:09
  • tekora
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Следующая запись в моем блоге  
Загрузка котировок из сжатого байт-массива.
22 февраля 2018
04 марта 2018

Комментарии (1)

+
0
Что бы указать с какой даты по какую сохранять данные нужно указать в функции
CopyRates другой формат.
input datetime start_time =D'2018.02.26 00:00';        // с какой даты
input datetime stop_time =D'2018.03.04 00:00';        // по какую дату 
...
   int total = CopyRates(Symbol(), Period(), start_time, stop_time, rates);
avatar

  5  tekora Автор Сообщений: 25 - Tekora

  • 2 марта 2018, 19:54

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари