Обсуждение статьи "Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?"

 

Опубликована статья Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?:

Так уж сложилось, что сейчас мало кто из разработчиков помнит как написать простую DLL библиотеку и в чем особенности связывания разнородных систем. Я постараюсь за 10 минут на примерах продемонстрировать весь процесс создания простых DLL библиотек и раскрою некоторые технические детали нашей реализации связывания. Покажу пошаговый процесс создания DLL библиотеки в Visual Studio с примерами передачи разных типов переменных (числа, массивы, строки и т.д.) и защиту клиентского терминала от падений в пользовательских DLL.

Автор: Renat Fatkhullin

 

Очень интересная статья. Для полноты счатья не хватает:

1. Где берем котировки?, Можно ли их брать из hst - файлов?

2. Как состыковать эту библиотеку с той, которая получается в МАтЛабе 2009а или 2009в? Там ведь тоже имеется С и С++?

Огромная просьба. 

 
  1. Котировки берем в самом терминале - они теперь и детальные и глубокие (10 лет и больше).

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

  2. Состыковывать библиотеки в MQL5 стало гораздо легче за счет прозрачной поддержки stdcall / cdecl соглашений о вызовах DLL.

    Если кто-то напишет хорошую и детальную статью про связку MetaTrader 4/5 и Матлаб через DLL, то заработает от 200 и выше долларов.

    На сайте MQL4.community уже есть статьи про связку Маткад - МетаТрейдер 4:

Взаимодействие между MеtaTrader 4 и MATLAB Engine (виртуальная машина MATLAB) - Статьи по MQL4
  • www.mql5.com
Взаимодействие между MеtaTrader 4 и MATLAB Engine (виртуальная машина MATLAB) - Статьи по MQL4: особенности автоматических торговых стратегий
 
Ренат, как насчет скорости вызовов dll-ки?
Мне позарез нужно связать два терминала, так чтобы они в реал-тайм транслировали свои котировки в Excel.
В МТ4 подобное можно было бы реализовать через DDE. В МТ5 похоже, через DLL единственный выход.
Но если каждый пришедший тик будет передаваться в DLL... по-моему это будет что-то невообразимо тормознутое. Я конечно не пробовал пока реализовывать... но честно, говоря и пробовать не хочется. Это ж жуть что получится.
Короче, верните DDE, пожалста, в МТ5. Он хоть и анахронизм, но иногда бывает нужен.

P.S. А за статью спасибо, очень своевременно. Мне сейчас как раз такого материала не хватало.
 
Спасибочки !!!
 
benik:
Ренат, как насчет скорости вызовов dll-ки?

Проверить скорость вызова очень просто. Например, грубо подсчитать можно так:

_DLLAPI int __stdcall fnCalcSpeed(int var1,int var2,int var3)
  {
   return(0);
  }


#import "MQL5DLLSamples.dll"
int  fnCalcSpeed(int var1,int var2,int var3);
#import

   int calls=0;
   int ticks=GetTickCount();
   
   while(GetTickCount()-ticks<1000)
     {
      for(int i=0;i<1000;i++)
         fnCalcSpeed(1,2,3);
      calls++;
     }
   Print(calls * 1000, "вызовов в секунду");

У меня на Quad Q9400 @2.66Ghz получилось 57 000 вызовов в секунду. Тот же самый код дает в MetaTrader 4 около 20 000 000 вызовов в секунду, так как там нет контроля и обвязки.

Мы обязательно попробуем уменьшить потери на вызовах DLL в MetaTrader 5.

 
Renat писал(а)  :

получилось 57 000 вызовов в секунду

А, ну если там порядка 50 000 вызовов в сек., думаю что тогда можно и через DLL котировки транслировать. Потерь не будет.

Спасибо, что привели код. 

 
В следующем билде скорость вызова DLL поднимем, будет как в MQL4 - 20 000 000 "пустых" вызовов в секунду.
 

Хорошая статья, но она вызывает некоторые опасения.

5. DLL calls wrapper and loss of speed on calls

As already described above, every call of DLL functions is wrapped into a special wrapper in order to ensure safety. 
This binding masks the basic code, replaces the stack, supports stdcall / cdecl agreements and monitors exceptions within the functions called.

This work inevitably leads to delay of the calling function. 
Therefore, it isn't recommended to perform very frequent DLL function calls (hundreds or thousands of times per second) for small operations. 

It' s better to make infrequent calls.

Я за то, чтобы добавить защиту для приложения, но не за счет производительности. Это еще одно изменение по сравнению с MT4, так как исключения в dll приводят к краху MT4, но хорошо написанный код должен справиться с этим сценарием, я бы предпочел увидеть статьи о написании безопасного кода в dll для преодоления подобных проблем. Итак, теперь из-за плохих привычек кодирования все должны платить за производительность.

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

Почему бы Metaquotes просто не добавить немного другой метод для вызова DLL безопасным способом. Тогда разработчик мог бы выбирать, загружать его безопасным или производительным способом, и гарантировать, что он пишет хороший код, который отлавливает исключения.

"Лучше делать редкие вызовы" - я серьезно, что это за заявление.

 

Я скомпилировал dll с помощью visual c++ express 2008, но, что интересно, терминал не перехватывает исключение, а аварийно завершает работу на fnReplaceString.

Моя терминальная сборка - 239. Есть какие-нибудь подсказки?



 

Если экспорт котировок возможен только через dll, то получается нужно на каждый экспортируемый инструмент вешать скрипт? А если их много? 50 например?

Понимаю, что можно в одном скрипте передавать котировки для многих инструментов, но это же не будет полноценной заменой DDE, где тики не теряются.