forked from airat77786/MQL5Book
105 lines
4.8 KiB
MQL5
105 lines
4.8 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| FileStruct.mq5 |
| |||
//| Copyright 2021, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#include "..\..\Include\PRTF.mqh"
| |||
| |||
#define BARLIMIT 10
| |||
#define HEADSIZE 10
| |||
| |||
const string filename = "MQL5Book/struct.raw";
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Struct with specific file format header |
| |||
//+------------------------------------------------------------------+
| |||
struct FileHeader
| |||
{
| |||
uchar signature[HEADSIZE];
| |||
int n;
| |||
FileHeader(const int size = 0) : n(size)
| |||
{
| |||
static uchar s[HEADSIZE] = {'C','A','N','D','L','E','S','1','.','0'};
| |||
ArrayCopy(signature, s);
| |||
}
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
MqlRates rates[], candles[];
| |||
int n = PRTF(CopyRates(_Symbol, _Period, 0, BARLIMIT, rates)); // 10 / ok
| |||
if(n < 1) return;
| |||
| |||
// Part I. Writing
| |||
// create new file or open existing one and empty it
| |||
int handle = PRTF(FileOpen(filename, FILE_BIN | FILE_WRITE)); // 1 / ok
| |||
| |||
FileHeader fh(n);// prepare header with actual data counter
| |||
| |||
// write the header first
| |||
PRTF(FileWriteStruct(handle, fh)); // 14 / ok
| |||
| |||
// write the data next
| |||
for(int i = 0; i < n; ++i)
| |||
{
| |||
FileWriteStruct(handle, rates[i], offsetof(MqlRates, tick_volume));
| |||
}
| |||
FileClose(handle);
| |||
ArrayPrint(rates);
| |||
/*
| |||
output for XAUUSD,H1:
| |||
[time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
| |||
[0] 2021.08.16 03:00:00 1778.86 1780.58 1778.12 1780.56 3049 5 0
| |||
[1] 2021.08.16 04:00:00 1780.61 1782.58 1777.10 1777.13 4633 5 0
| |||
[2] 2021.08.16 05:00:00 1777.13 1780.25 1776.99 1779.21 3592 5 0
| |||
[3] 2021.08.16 06:00:00 1779.26 1779.26 1776.67 1776.79 2535 5 0
| |||
[4] 2021.08.16 07:00:00 1776.79 1777.59 1775.50 1777.05 2052 6 0
| |||
[5] 2021.08.16 08:00:00 1777.03 1777.19 1772.93 1774.35 3213 5 0
| |||
[6] 2021.08.16 09:00:00 1774.38 1775.41 1771.84 1773.33 4527 5 0
| |||
[7] 2021.08.16 10:00:00 1773.26 1777.42 1772.84 1774.57 4514 5 0
| |||
[8] 2021.08.16 11:00:00 1774.61 1776.67 1773.69 1775.95 3500 5 0
| |||
[9] 2021.08.16 12:00:00 1775.96 1776.12 1773.68 1774.44 2425 5 0
| |||
*/
| |||
| |||
// Part II. Reading
| |||
handle = PRTF(FileOpen(filename, FILE_BIN | FILE_READ)); // 1 / ok
| |||
FileHeader reference, reader;
| |||
PRTF(FileReadStruct(handle, reader)); // 14 / ok
| |||
// headers must match, otherwise it's not our data
| |||
if(ArrayCompare(reader.signature, reference.signature))
| |||
{
| |||
Print("Wrong file format; 'CANDLES' header is missing");
| |||
return;
| |||
}
| |||
| |||
PrintFormat("Reading %d candles...", reader.n);
| |||
ArrayResize(candles, reader.n); // allocate memory for reading
| |||
// since we'll read the structs partially,
| |||
// we need to prefill them by zeros
| |||
ZeroMemory(candles);
| |||
| |||
for(int i = 0; i < reader.n; ++i)
| |||
{
| |||
FileReadStruct(handle, candles[i], offsetof(MqlRates, tick_volume));
| |||
}
| |||
FileClose(handle);
| |||
ArrayPrint(candles);
| |||
/*
| |||
output for XAUUSD,H1:
| |||
[time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
| |||
[0] 2021.08.16 03:00:00 1778.86 1780.58 1778.12 1780.56 0 0 0
| |||
[1] 2021.08.16 04:00:00 1780.61 1782.58 1777.10 1777.13 0 0 0
| |||
[2] 2021.08.16 05:00:00 1777.13 1780.25 1776.99 1779.21 0 0 0
| |||
[3] 2021.08.16 06:00:00 1779.26 1779.26 1776.67 1776.79 0 0 0
| |||
[4] 2021.08.16 07:00:00 1776.79 1777.59 1775.50 1777.05 0 0 0
| |||
[5] 2021.08.16 08:00:00 1777.03 1777.19 1772.93 1774.35 0 0 0
| |||
[6] 2021.08.16 09:00:00 1774.38 1775.41 1771.84 1773.33 0 0 0
| |||
[7] 2021.08.16 10:00:00 1773.26 1777.42 1772.84 1774.57 0 0 0
| |||
[8] 2021.08.16 11:00:00 1774.61 1776.67 1773.69 1775.95 0 0 0
| |||
[9] 2021.08.16 12:00:00 1775.96 1776.12 1773.68 1774.44 0 0 0
| |||
*/
| |||
}
| |||
//+------------------------------------------------------------------+
|