Способы коммуникаций терминалов и внешних программ между собой

 

Недавно один участник форума попросил написать свое мнение о его способе связи внешней программы и терминала, я в ответ выложил свои, проверенные на практике. Выложил в блог, но, так как блоги никто не читает, решил разместить и здесь. Надеюсь, эта шпаргалка кому-то пригодится, хотя бы для расширения кругозора.

Этот пост надо воспринимать не как руководство, а именно как краткую шпаргалку, указывающую на возможные пути решения проблемы. Буду рад узнать еще какие-то способы, добавлю их в список с вашего разрешения.

---------------------------------

 Я перепробовал много способов связи между МТ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 может передавать экземпляры классов, то есть не надо ничего парсить. Вариант сложный, но самый крутой.

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

 
Полезный пост
 
Свалка хаотичных мыслей.
 
Alexey Volchanskiy:

  1. C++
    1. Всю логику выносим в ДЛЛ, терминал нужен для получения котировок и исполнения приказов. Самый простейший и быстрый путь. Во времена старого МТ4 с недоношенным MQL4, в котором даже структур не было, все серьезное делал именно так.
    2. Хотим использовать .NET. Значит нужен управляемый С++. Мало кто знает, но в одном проекте VC++ можно построить ДЛЛ, которая внешне будет иметь нативный интерфейс, а внутри логику на С++ под .NET. Но мне этот вариант не понравился, ибо в то время С++ сильно отставал от шарпа в возможностях. Значит, приручаем шарп.

Дополнение к п. 1.2

В последние несколько лет MS снова взялась за поддержку С++, хотя ранее заявляла, что язык мертвый и развивать его в студии не будет. Однако, тем временем вышли стандарты С++ 11, С++ 14 (небольшие улучшения 11) и на подходе стандарт С++17.

Сейчас VS 2015 и, тем более, будущая версия с рабочим названием VS 15 Preview 2 поддерживает полностью С++ 11 и частично более поздние стандарты. Возможно, сейчас есть смысл в некоторых случаях обойтиcь без C#, кому как удобнее.

Visual Studio "15" Preview 2 | Visual Studio
Visual Studio "15" Preview 2 | Visual Studio
  • www.visualstudio.com
Today, we are happy to announce the release of the Visual Studio "15" Preview 2. This new release includes our most recent feature innovations and improvements. Important Note: This is an unsupported prerelease version of Visual Studio. We do not advise that you use it in a production environment. However, we welcome your feedback! For...
 
Dmitry Fedoseev:
Свалка хаотичных мыслей.
Это нормально))
 
Dmitriy Skub:
Это нормально))
Тем более четко написал - Этот пост надо воспринимать не как руководство, а именно как краткую шпаргалку
 
Alexey Volchanskiy:
Тем более четко написал - Этот пост надо воспринимать не как руководство, а именно как краткую шпаргалку
Вы правы.
 
Alexey Volchanskiy:

Недавно один участник форума попросил написать свое мнение о его способе связи внешней программы и терминала, я в ответ выложил свои, проверенные на практике. Выложил в блог, но, так как блоги никто не читает, решил разместить и здесь. Надеюсь, эта шпаргалка кому-то пригодится, хотя бы для расширения кругозора.

Этот пост надо воспринимать не как руководство, а именно как краткую шпаргалку, указывающую на возможные пути решения проблемы. Буду рад узнать еще какие-то способы, добавлю их в список с вашего разрешения.

---------------------------------

 Я перепробовал много способов связи между МТ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 может передавать экземпляры классов, то есть не надо ничего парсить. Вариант сложный, но самый крутой.

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

Спасибо, полезный пост. Особенно интересно про Матлаб.

Причина обращения: