Библиотека (dll): Shared Nodes Library (Библиотека разделяемых узлов) Обмен данными между советниками, индикаторами, скриптами и внешними программами

 

Библиотека реализует простой механизм обмена данными как внутри терминала (между советниками, индикаторами и скриптами), так и с внешними программами. Библиотека полностью "пассивная", т.е. не создает потоков/процессов, не использует динамически выделяемую память, не использует callback-функций . Из последнего следует, что контроль наличия новых пакетов остается исключительно на вашей совести. :)

Библиотека состоит из:

  •  1000 общедоступных узлов для обмена данными. Объем каждого узла равен 1024 байта.
  •  100 слотов на программу для сборки/разборки пакетов.
  •  Набор функций для сериализации/десериализации данных.

При использовании сериализации/десиализации данных действует правило очереди: первым вошел - первым вышел. Автор заранее открещивается от любых секретных данных полученных при кривой сериализации/десериализации. :)

Библиотека не имеет механизмов "уведомления" программ, использующих SNL. Тем не менее, для контроля доступности новых данных в конкретном узле используется быстрая функция SNL_CheckNode(...), позволяющая установить факт записи новых данных в конкретный узел. 

Очень важно: для корректной работы с библиотекой все советники, индикаторы, скрипты и внешние программы должны подгружать библиотеку из одной директории. Например: "C:\Program Files\MT4\MQL4\SNL.dll".


Механика обмена данными.

Прежде чем начинать любую деятельность с библиотекой, необходимо вызвать функцию SNL_Start(). В противном случае прием и отправка пакетов будут недоступны. Программа, использующая библиотеку, получает в свое распоряжение 100 слотов доступных только ей. В слотах производится только сборка/разборка пакетов.

Прежде чем начать собирать пакет, нужно получить номер свободного слота вызвав функции SNL_OpenSlot(), которая подготовит слот для сборки/разборки пакета и не позволит его выбрать повторно, пока слот не будет освобожден. Сборка пакета осуществляется функциями-сборщиками типа  SNL_Pack***(...). После завершения сборки пакет можно отправить в открытый доступ в один или несколько узлов вызовом функции SNL_SendPack(...), передав ей номер узла и номер слота, который содержит пакет для отправки. Пакет будет храниться в узле до момента отправки нового пакета в этот узел. Т.е. чтение узла не стирает содержимое этого узла.

Для получения данных из открытого доступа используется функция SNL_RecvPack(...). В функцию нужно передать номер узла из которого нужно произвести чтение пакета. Функция возвращает номер слота в который бал помещен для разборки прочитанный пакет. Разборка пакета (извлечение данных) осуществляется функциями-разборщиками SNL_Unpack***(...). После разборки пакета нужно освободить слот, номер которого был возвращен функцией SNL_RecvPack(...). Для освобождения слота используется функция SNL_CloseSlot(...).


Список функций:


  • unsigned int    SNL_PackMaxSize(void) 
    Возвращает максимальный размер пакета.

  • unsigned int    SNL_PackFreeSize(unsigned int _slotid)
    Возвращает объем свободного места в пакете в байтах.
    Принимает номер слота (_slotid).

  • unsigned int    SNL_OpenSlot(void)
    Открывает новый слот.
    Возвращает номер слота (_slotid) в случае успеха, либо нуль, если открыть слот не удалось.

  • bool  SNL_PackChar(unsigned int _slotid, char _val)
    Записывает в пакет значение типа char
    Принимает номер слота (_slotid) и значение типа char.
    Возвращает true в случае успешной записи, либо false, если запись не удалась.

  • bool SNL_PackUChar(unsigned int _slotid, unsigned char _val)
    Записывает в пакет значение типа unsigned char
    Принимает номер слота (_slotid) и значение типа unsigned char.
    Возвращает true в случае успешной записи, либо false, если запись не удалась.

  • bool       SNL_PackShort(unsigned int _slotid, short _val)
    Записывает в пакет значение типа short
    Принимает номер слота (_slotid) и значение типа short.
    Возвращает true в случае успешной записи, либо false, если запись не удалась.

  • bool       SNL_PackUShort(unsigned int _slotid, unsigned short _val)
    Записывает в пакет значение типа unsigned short
    Принимает номер слота (_slotid) и значение типа unsigned short.
    Возвращает true в случае успешной записи, либо false, если запись не удалась.

  • bool       SNL_PackInt(unsigned int _slotid, int _val)
    Записывает в пакет значение типа int
    Принимает номер слота (_slotid) и значение типа int.
    Возвращает true в случае успешной записи, либо false, если запись не удалась.

  • bool       SNL_PackUInt(unsigned int _slotid, unsigned int _val)
    Записывает в пакет значение типа unsigned int
    Принимает номер слота (_slotid) и значение типа unsigned int.
    Возвращает true в случае успешной записи, либо false, если запись не удалась.

  • bool       SNL_PackFloat(unsigned int _slotid, float _val)
    Записывает в пакет значение типа float
    Принимает номер слота (_slotid) и значение типа float.
    Возвращает true в случае успешной записи, либо false, если запись не удалась.

  • bool       SNL_PackDouble(unsigned int _slotid, double _val)
    Записывает в пакет значение типа double
    Принимает номер слота (_slotid) и значение типа double.
    Возвращает true в случае успешной записи, либо false, если запись не удалась.

  • unsigned int SNL_PackRawData(unsigned int _slotid, void *_data, unsigned int _datasize, bool _cutter = false)
    Записывает в пакет произвольные данные.
    Принимает номер слота (_slotid), указатель на данные (_*data), размер данных (_datasize), ключ обрезания данных (_cutter = false по-умолчанию).
    Возвращает количество записанных байтов в случае успеха, либо нуль, если запись не была произведена.
    Параметр (_cutter) управляет записью данных, объем которых превышает размер одного пакета (1024 байт):
     - true - в пакет записывается часть произвольных данных и возвращается количество записанных байтов, либо нуль, если запись не удалась,
     - false - запись данных производится только если данные помещаются в пакет целиком. Возвращает количество записанных байтов,
          либо нуль, если данные не помещаются.

  • bool       SNL_SendPack(unsigned int _nodeid, unsigned int _slotid, bool _closeslot = true)
    Отправляет пакет в заданный узел.
    Принимает номер узла (_nodeid), номер слота отправляемого пакета (_slotid) и ключ освобождения слота (_closeslot = true по-умолчанию).
    Возвращает true  в случае успешной отправки пакета, либо false, если отправка пакета не удалась.
    Параметр (_closeslot) отвечает за освобождение номера слота:
     - true - слот освобождается,
     - false -слот остается занятым (полезно, если один пакет нужно отправить в несколько узлов).

  • bool SNL_CheckNode(unsigned int _nodeid)
    Проверяет узел на обновление данных.
    Принимает номер узла (_nodeid).
    Возвращает true, если данные обновились, либо false, если с момента последнего получения пакета обновления данных в узле не произошло.

  • unsigned int SNL_RecvPack(unsigned int _nodeid)
    Читает пакет из заданного узла.
    Принимает номер узла (_nodeid).
    Возвращает номер слота (_slotid) в который был помещен принятый пакет.

  • bool       SNL_EndOfPack(unsigned int _slotid)
    Определяет достигнут ли конец пакета при извлечении данных.
    Принимает номер слота (_slotid).
    Возвращает true, если конец пакета достигнут, либо false, если пакет еще содержит данные.

  • char       SNL_UnpackChar(unsigned int _slotid)
    Извлекает из пакета значение типа char.
    Принимает номер слота (_slotid).
    Возвращает значение типа char.

  • unsigned char SNL_UnpackUChar(unsigned int _slotid)
    Извлекает из пакета значение типа unsigned char.
    Принимает номер слота (_slotid).
    Возвращает значение типа unsigned char.

  • short SNL_UnpackShort(unsigned int _slotid)
    Извлекает из пакета значение типа short.
    Принимает номер слота (_slotid).
    Возвращает значение типа short.

  • unsigned short SNL_UnpackUShort(unsigned int _slotid)
    Извлекает из пакета значение типа unsigned short.
    Принимает номер слота (_slotid).
    Возвращает значение типа unsigned short.

  • int       SNL_UnpackInt(unsigned int _slotid)
    Извлекает из пакета значение типа int.
    Принимает номер слота (_slotid).
    Возвращает значение типа int.

  • unsigned int SNL_UnpackUInt(unsigned int _slotid)
    Извлекает из пакета значение типа unsigned int.
    Принимает номер слота (_slotid).
    Возвращает значение типа unsigned int.

  • float       SNL_UnpackFloat(unsigned int _slotid)
    Извлекает из пакета значение типа float.
    Принимает номер слота (_slotid).
    Возвращает значение типа float.

  • double SNL_UnpackDouble(unsigned int _slotid)
    Извлекает из пакета значение типа double.
    Принимает номер слота (_slotid).
    Возвращает значение типа double.

  • int SNL_UnpackRawData(unsigned int _slotid, void *_databuf, unsigned int _databufsize)
    Извлекает произвольные данные из пакета в заданный буфер.
    Принимает номер слота (_slotid), указатель на буфер (_databuf), объем буфера (_databufsize) в байтах.
    Возвращает количество прочитанных байтов, либо нуль, если пакет не содержит данных.

  • bool            SNL_ResetRead(unsigned int _slotid)
    Возвращает каретку чтения в начало пакета.
    Принимает номер слота (_slotid).
    Возвращает true в случае успешного возврата, либо false, если возврат каретки чтения не произошел.

  • bool            SNL_ResetWrite(unsigned int _slotid)
    Возвращает каретку записи в начало пакета.
    Принимает номер слота (_slotid).
    Возвращает true в случае успешного возврата, либо false, если возврат каретки записи не произошел.

  • void       SNL_CloseSlot(unsigned int _slotid)
    Освобождает слот. Содержимое пакета будет утеряно.
    Принимает номер слота (_slotid).

  • bool            SNL_Start(void)
    Инициализация библиотеки SNL.
    Инициализация происходит только при первом вызове функции. Повторные вызовы эффекта не имеют и на функционирование библиотеки не влияют.


Пример реализации простой функции для передачи unicode-строки:

bool SNL_SendUCString(unsigned int _nodeid, string _str)
// функция передачи unicode-строки
{
   // Определяем, поместится ли строка в пакет целиком
   if(INT_VALUE + 2*(uint)StringLen(_str) > SNL_PackMaxSize()) return false;
   // Открываем слот для сборки пакета
   uint slot = SNL_OpenSlot();
   if(slot == 0) return false;
   // Записываем длину строки
   SNL_PackInt(slot,StringLen(_str));
   // Записываем посимвольно строку
   for(int x=0;x<StringLen(_str);x++) SNL_PackUShort(slot,StringGetCharacter(_str,x));
   // Отправляем строку в заданный узел и освобождаем слот
   SNL_SendPack(_nodeid,slot,true);
   return true;
};

Пример реализации простой функции для приема unicode-строки:

string SNL_RecvUCString(unsigned int _nodeid)
// Функция приема unicode-строки
{
   // Получаем пакет из заданного узла
   uint slot = SNL_RecvPack(_nodeid);
   if(slot == 0) return NULL;
   // Извлекаем длину строки
   int Len = SNL_UnpackInt(slot);
   // Читаем посимвольно строку
   string str = "";
   if(Len > 0) for(int x=0;x<Len;x++) str += ShortToString(SNL_UnpackUShort(slot));
   // Освобождаем слот
   SNL_CloseSlot(slot);
   return str;
};

Содержимое zip-архива:

  • Файл библиотеки - SNL.dll
  • Файл с #import секцией для MQL4
  • Заготовка заголовочного файла для C/C++


п.с. позже дополню тему скринами.

Файлы:
SNL.zip  22 kb
 

Наверное, очень полезная вещь. 

Но: Что скажут Метаквоты? 

 

Промахнулся разделом. Хотел запостить в MQL4 и MetaTrader 4.

Можно ли перенести?

@Алексей Тарабанов а что они могут сказать? Я же не вирей толкаю, а собственную разработку.

 

А что "под капотом" ?

самодельное хранилище или какой-нить windows post box ??

 
@Maxim Kuznetsov "под капотом" секция разделяемой памяти
 
AdjusterAdviser:

Библиотека реализует простой механизм обмена данными как внутри терминала (между советниками, индикаторами и скриптами), так и с внешними программами. Содержимое zip-архива:

  • Файл библиотеки - SNL.dll
  • Файл с #import секцией для MQL4
  • Заготовка заголовочного файла для C/C++


п.с. позже дополню тему скринами.

Внешние программы должны быть написаны на C/C++? Почему не сделали реализацию под MT5?

 
Aleksey Vyazmikin:

Внешние программы должны быть написаны на C/C++? Почему не сделали реализацию под MT5?

Внешние программы могут быть написаны на любом языке. Главное, чтобы они умели подгружать библиотеки (DLL).

Эта библиотека не привязана к конкретной версии терминала. Можно обмениваться как внутри терминала, так и между терминалами, в том числе и между MT4 и МТ5. Ну и между внешними программами тоже. Преград нет. И все это одновременно, если требуется.

 
AdjusterAdviser:

Внешние программы могут быть написаны на любом языке. Главное, чтобы они умели подгружать библиотеки (DLL).

Эта библиотека не привязана к конкретной версии терминала. Можно обмениваться как внутри терминала, так и между терминалами, в том числе и между MT4 и МТ5. Ну и между внешними программами тоже. Преград нет. И все это одновременно, если требуется.

Интересно, но не просто для применения.

 
AdjusterAdviser:


  • Файл библиотеки - SNL.dll
  • Файл с #import секцией для MQL4
  • Заготовка заголовочного файла для C/C++


п.с. позже дополню тему скринами.

Никто не будет пользоваться библиотекой без исходного кода

 
AdjusterAdviser:

Библиотека реализует простой механизм обмена данными как внутри терминала (между советниками, индикаторами и скриптами), так и с внешними программами. Библиотека полностью "пассивная", т.е. не создает потоков/процессов, не использует динамически выделяемую память, не использует callback-функций . Из последнего следует, что контроль наличия новых пакетов остается исключительно на вашей совести. :)

Библиотека состоит из:

  •  1000 общедоступных узлов для обмена данными. Объем каждого узла равен 1024 байта.
  •  100 слотов на программу для сборки/разборки пакетов.
  •  Набор функций для сериализации/десериализации данных.

При использовании сериализации/десиализации данных действует правило очереди: первым вошел - первым вышел. Автор заранее открещивается от любых секретных данных полученных при кривой сериализации/десериализации. :)

Библиотека не имеет механизмов "уведомления" программ, использующих SNL. Тем не менее, для контроля доступности новых данных в конкретном узле используется быстрая функция  SNL_CheckNode(...), позволяющая установить факт записи новых данных в конкретный узел. 

Очень важно: для корректной работы с библиотекой все советники, индикаторы, скрипты и внешние программы должны подгружать библиотеку из одной директории. Например: "C:\Program Files\MT4\MQL4\SNL.dll".


Содержимое zip-архива:

  • Файл библиотеки - SNL.dll
  • Файл с #import секцией для MQL4
  • Заготовка заголовочного файла для C/C++


п.с. позже дополню тему скринами.

Тема скорее всего будет удалена. Здесь не приветствуются DLLки без исходников.

Хотите поделиться, выкладывайте в котобазу вместе с исходниками.

Ничего сверхсекретного в них нет.

 
Koldun Zloy:

Тема скорее всего будет удалена. 

Во сколько? ;)
Теме уже год ))
А так - согласен.
Причина обращения: