Exchange_Data.mqh
#include <MemMapLib.mqh>
#include <TypeToBytes.mqh>
template <typename T>
class EXCHANGE_DATA
{
private:
CMemMapFile* FileMemory;
public:
// Выделяет память заданной длины под данные
EXCHANGE_DATA( const int Amount, const bool ModeCreate = false, string FileName = "Local\\test" )
{
// FileName += _Symbol;
this.FileMemory = new CMemMapFile;
if (this.FileMemory.Open(FileName, sizeof(T) * Amount + sizeof(int) + HEAD_MEM, ModeCreate ? modeCreate : modeOpen) != 0)
{
Alert("FileMemory.Open - ERROR!");
delete &this;
}
}
~EXCHANGE_DATA( void )
{
this.FileMemory.Close();
delete this.FileMemory;
}
// Записывает данные в память
void DataSave( const T &Data[], const bool FromBegin = true ) const
{
const int Size = ::ArraySize(Data) * sizeof(T);
uchar Bytes[];
_ArrayCopy(Bytes, _R(Size).Bytes); // Записали количество
_ArrayCopy(Bytes, _R(Data).Bytes, sizeof(int)); // Записали данные
if (FromBegin)
this.FileMemory.Seek(0, SEEK_SET);
this.FileMemory.Write(Bytes, ::ArraySize(Bytes)); // Сбросили все в память
return;
}
// Считывает данные из памяти
int DataLoad( T &Data[], const bool FromBegin = true ) const
{
if (FromBegin)
this.FileMemory.Seek(0, SEEK_SET);
uchar Bytes[];
this.FileMemory.Read(Bytes, sizeof(int)); // Прочли из памяти количество данных
this.FileMemory.Read(Bytes, _R(Bytes)[0]); // Получили сами данные
_ArrayCopy(Data, Bytes); // Сбросили данные в массив
return(::ArraySize(Data));
}
};
PriceGiver.mq4
#property strict
#include "Exchange_Data.mqh"
#define AMOUNT 100
EXCHANGE_DATA<MqlTick> ExchangeTicks(AMOUNT, true);
const bool Init = EventSetMillisecondTimer(100);
void OnTimer( void )
{
static MqlTick Ticks[1];
if (SymbolInfoTick(_Symbol, Ticks[0]))
ExchangeTicks.DataSave(Ticks);
}
PriceTaker.mq4
#property strict
#include "Exchange_Data.mqh"
#define AMOUNT 100
EXCHANGE_DATA<MqlTick> ExchangeTicks(AMOUNT);
const bool Init = EventSetMillisecondTimer(100);
#define TOSTRING(A) (#A + " = " + (string)(A) + " ")
void OnTimer( void )
{
static MqlTick PrevTick = {0};
MqlTick Ticks[];
if ((ExchangeTicks.DataLoad(Ticks) > 0) &&
((Ticks[0].bid != PrevTick.bid) || (Ticks[0].ask != PrevTick.ask)))
{
Print(TOSTRING(Ticks[0].time) + TOSTRING(Ticks[0].bid) + TOSTRING(Ticks[0].ask));
PrevTick = Ticks[0];
}
}
Run PriceGiver.ex4 and PriceTaker.ex4.
Result
2017.11.30 15:13:55.101 Expert PriceGiver EURUSD,M1: removed
2017.11.30 15:13:55.091 PriceGiver EURUSD,M1: uninit reason 1
2017.11.30 15:13:51.006 Expert PriceTaker GBPAUD,M1: removed
2017.11.30 15:13:50.996 PriceTaker GBPAUD,M1: uninit reason 1
2017.11.30 15:13:49.168 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:41 Ticks[0].bid = 1.18483 Ticks[0].ask = 1.18487
2017.11.30 15:13:48.838 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:41 Ticks[0].bid = 1.18484 Ticks[0].ask = 1.18489
2017.11.30 15:13:48.186 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:40 Ticks[0].bid = 1.18483 Ticks[0].ask = 1.18487
2017.11.30 15:13:47.751 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:40 Ticks[0].bid = 1.18484 Ticks[0].ask = 1.18488
2017.11.30 15:13:42.178 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:34 Ticks[0].bid = 1.18485 Ticks[0].ask = 1.18489
2017.11.30 15:13:41.633 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:34 Ticks[0].bid = 1.18484 Ticks[0].ask = 1.18488
2017.11.30 15:13:37.588 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:30 Ticks[0].bid = 1.18483 Ticks[0].ask = 1.18487
2017.11.30 15:13:36.175 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:28 Ticks[0].bid = 1.18481 Ticks[0].ask = 1.18485
2017.11.30 15:13:30.717 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:23 Ticks[0].bid = 1.18482 Ticks[0].ask = 1.18486
2017.11.30 15:13:29.514 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:22 Ticks[0].bid = 1.18483 Ticks[0].ask = 1.18487
2017.11.30 15:13:27.324 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:19 Ticks[0].bid = 1.1848 Ticks[0].ask = 1.18484
2017.11.30 15:13:26.994 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:19 Ticks[0].bid = 1.18482 Ticks[0].ask = 1.18486
2017.11.30 15:13:26.012 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:18 Ticks[0].bid = 1.18481 Ticks[0].ask = 1.18485
2017.11.30 15:13:25.584 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:18 Ticks[0].bid = 1.18482 Ticks[0].ask = 1.18486
2017.11.30 15:13:25.254 PriceTaker GBPAUD,M1: Ticks[0].time = 2017.11.30 15:13:16 Ticks[0].bid = 1.18481 Ticks[0].ask = 1.18485
2017.11.30 15:13:25.147 PriceTaker GBPAUD,M1: initialized
2017.11.30 15:13:24.049 Expert Sparring\PriceTaker GBPAUD,M1: loaded successfully
2017.11.30 15:13:21.157 PriceGiver EURUSD,M1: initialized
2017.11.30 15:13:19.617 Expert Sparring\PriceGiver EURUSD,M1: loaded successfully