Redis MQL5-MQL4

Redis MQL5-MQL4

21 февраля 2020, 17:00
Igor Makanu
3
51

Redis — резидентная система управления базами данных (In-memory database). класса NoSQL с открытым исходным кодом, работающая со структурами данных типа «ключ — значение». Используется как для баз данных, так и для реализации кэшей, брокеров сообщений. Ориентирована на достижение максимальной производительности на атомарных операциях (заявляется о приблизительно 100 тыс. SET- и GET-запросов в секунду , интерфейсы доступа созданы для большинства основных языков программирования. Хранит базу данных в оперативной памяти, снабжена механизмами снимков и журналирования для обеспечения постоянного хранения (на дисках, твердотельных накопителях). (Вики).

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

appendonly no
save ""

Устанавливает БД Redis  не нужно, просто скачаем и запустим redis-server.exe и если нужно то консольный клиент redis-cli.exe  ( подробнее например тут ) Команды клиента Redis  можно посмотреть на офф.сайте Redis  .

Изучив предложенные фреймворки для C# было принято использовать ServiceStack.Redis - удобные интерфейсы, да и 27,5 млн скачиваний из GitHub тоже внушают доверие

Для своих задач сделал API MQL4 / MQL5 , реализовал самый минимум команд: 

  • для работы с БД  ( flushall . del , set , get , keys  ) 

  1. void RedisFlushall() 
  2. void RedisDel(string key)
  3. void RedisSet(string key, uchar &value[])
  4. bool RedisGet(string key, uchar &value[])
  5. bool RedisKeys(string pattern, string &result[])

  • сервисные команды для подключения и пинга БД  (команды RedisConnect / RedisQuit() в основном нужны для работы МТ4, в МТ5 можно попробовать их не использовать)

  1. bool RedisConnect(string host = "localhost", int port = 6379, int MT4delay = 500)
  2. bool RedisReConnect(string host = "localhost", int port = 6379)
  3. bool RedisPing()  / int  RedisPingMicroseconds()  
  4. void RedisQuit() 

Все API подключаются одним файлом Redis.mqh (один файл и для МТ4 и для МТ5) и две dll для работы МТ4 и МТ5 соответственно. В файле Redis.mqh подробно описаны каждая функция (рус.)

В атаче два примера:

  • скрипт RedisTst_Demo - запись, чтение 500 Мб в БД, работа с set / get и работа с ключами - коментарии максимально , примитивные замеры скорости
  • ЕА Redis_exchange - запускаем 2 советника на 2-х чартах (2 терминала, можно МТ4 - МТ5) , советник "Master" пишет тик в БД по приходу тика, советник "Slave" читает это значение. Код советника "Slave" желательно использовать в таймере.

 Ну и в итоге зачем все это? 

  • можно писать данные без использования жесткого диска
  • можно обмениваться данными со всеми приложениями: ЕА - ЕА , терминал - терминал, ЕА - приложение  ( еще не проверял, но в МТ5 должно работать и терминал - тестер )


Достоинства: в Redis API использую только синхронные методы, т.е. гарантированно будет окончена запись и гарантировано будет произведено чтение (get / set), за исключением таймаута - таймаут по умолчанию 1,5 секунды - это очень большое время

Недостатки: скорее всего размеры dll, но смотри пп. достоинства .

Файлы:
redisForMT.zip 5897 kb
Поделитесь с друзьями: