Способы связи между МТ4/5 и внешними программами.

2 июня 2016, 19:58
Alexey Volchanskiy
0
122

Только сейчас обратил внимание, что в блогах нет раздела программирование!!! Что за хрень для сайта, во многом посвященного программированию!! Пришлось написать в рубрику "Разное" 

Я перепробовал много способов связи между МТ4 и программами на С++/С#, с Матлабом. Распишу по порядку, но кратко. Все только на основе личного опыта, то есть то, что я делал. Наверняка есть и другие решения.

  1. C++
    1. Всю логику выносим в ДЛЛ, терминал нужен для получения котировок и исполнения приказов. Самый простейший и быстрый путь. Во времена старого МТ4 с недоношенным MQL4, в котором даже структур не было, все серьезное делал именно так.
    2. Хотим использовать .NET. Значит нужен управляемый С++. Мало кто знает, но в одном проекте VC++ можно построить ДЛЛ, которая внешне будет иметь нативный интерфейс, а внутри логику на С++ под .NET. Но мне этот вариант не понравился, ибо в то время С++ сильно отставал от шарпа в возможностях. Значит, приручаем шарп.
    3. Отдельная программа на плюсах с логикой и интерфейсом. Не делал, т.к. для таких целей предпочитаю шарп, о чем напишу ниже.
  2. C#
    1. Вариант с ДЛЛ на шарпе напрямую не пройдет, т.к. ее не подключить к МТ4/5 - терминалы не понимают .NET. Есть два варианта - простой и сложный ))
      1. Простой. Делается ДЛЛ - обертка на С++, в проекте VC++ устанавливаем поддержку .NET. Заметьте - мы не используем управляемый С++!!! Только обычный нативный, иначе терминал ее не примет. В проекте VC++ ставим галку поддержки .NET. Пишем ДЛЛ на шарпе и включаем ее в проект, при наличии галки проект ее примет и будет понимать. НО!!! В ДЛЛ на шарпе все классы должна быть статическими, а это имеет массу минусов и ограничений. Кто знает шарп, тот меня поймет. Зато быстро ))
      2. Сложнее, но можно использовать полноценные шарповские классы без static. Та же обертка на плюсах, но для работы с ДЛЛ на C# надо постоянно к ней подключаться и создавать/уничтожать главный класс робота, что, конечно, вносит небольшой оверхед. Я его не измерял, но на Core 2 Duo было совершенно незаметно, все происходит быстро.
    2. Делаем внешнюю программу на шарпе со всем богатством интерфейса. Напомню, 5-6 лет назад в МТ4 вообше практически нельзя было создать интерфейс, язык был просто убогий. Связь через:
        1. Named Pipes - крайне неудобно, льется поток байтов, который надо парсить. Пайпы имеют свойство отваливаться. Перезапустили терминал и ли внешнюю программу - проблемы.
        2. Memory Mapping Files (далее MMF) - самый быстрый в обмене и удобный вариант. Сейчас шарп может работать с MMF, тогда еще не умел. Пришлось делать общую ДЛЛ для МТ4 и шарпа, в принципе все просто и быстро. В MLQ сделал зацикленный советник, который опрашивал флажки в MMF, сейчас удобнее юзать таймер. Кстати, те же пайпы в пределах одной ОС работают на основе MMF.
        3. Через обычные файлы. Попробовал, но не использовал.
        4. Через WCF. Крутость в том, что программа на шарпе может связываться с кучей терминалов через интернет. Требуется ДЛЛ для МТ4, которая бы поддерживала эту связь, естественно, с использованием .NET. Годятся варианты 1.2 и 2.1.1, 2.1.2. Пробовали связь Питер-Одесса, при тогдашней скорости интернета (наверное 10 Мб/с, точно уже не помню) было около 10000 транзакций в секунду, с посылкой классов небольшого размера, естественно. Прелесть в том, что WCF может передавать экземпляры классов, то есть не надо ничего парсить. Вариант сложный, но самый крутой.

Про Матлаб напишу в следующем посте, там тоже куча вариантов.

 

Поделитесь с друзьями: