Обсуждение статьи "МetaTrader 5. Экспорт котировок в .NET приложение, используя WCF сервисы"

 

Опубликована статья МetaTrader 5. Экспорт котировок в .NET приложение, используя WCF сервисы:

В статье продемонстрирован один из способов трансляции котировок из MetaTrader 5 в приложения, написанные на .NET.

Автор: Alexander

 

Молодец! Другое сказать не могу. К сожалению для связи MQL5 - .NET все еще нужен посредник, что делает всю конструкцию слишком громоздкую.

 
Itso:

К сожалению для связи MQL5 - .NET все еще нужен посредник, что делает всю конструкцию слишком громоздкую.

Согласен. Кстати, для простых взаимодействий есть отличная штука - Inverse P/Invoke - взаимодействие без посредников. 

Еще пытался использовать ILMerge, чтобы объединить все 3 сборки в QExportWrapper.dll - не получилось, вернее объединил, но после объединения из mql5 не видит экспортируемые функции

 

Большое спасибо за выложенный пример. Вот уже неделю (по вечерам) я бьюсь над созданием библиотеки обмена данными между.net и mql5.

Я не силен в С++ и этот пост мне был очень полезен.

Только вот одна беда.  после компиляции под х64 инициализация сервиса выдает ошибку. 

ExportService^ service = gcnew ExportService(serverName); // <- ServiceManaged.cpp 

 в "catch" не заходит. процесс просто "вылетает" без каких-либо объяснений. 

Как бы мне вывести эту ошибку в лог для дальнейшего анализа ? или может вы уже сталкивались с данной проблемой и решение уже есть ???? 

 
Спасибо! Очень полезное знакомство и с wcf и с mql5
 
Очень интересно..Спасибо..Но может быть Сегодня есть более простые возможности*??
 
shelandr1:
Очень интересно..Спасибо..Но может быть Сегодня есть более простые возможности*??

Статья хороша тем, что рассказывает про WCF тем, кто незнаком с технологией. Кстати, я проверял быстродействие WCF через интернет на дистанции Питер - Одесса, получалась приличная скорость около 14000 двусторонних транзакций/сек пакетами по 1 кБ. Мне лично технология нравиться своей объектно-ориентированностью, то есть передается не поток байтов (хотя можно и так), а экземпляры классов, то есть на приемном конце не надо этот поток декодировать.

Ну а по теме котировок - проще использовать memory mapping. В приложении .NET запускаем отдельную задачу с мьютексом, MQL4 грузит в память данные и сбрасывает мьютекс, после чего приложение читает данные. Так проще и быстрее, и ДЛЛ не нужна. Надо только в MQL4 добавить системные ДЛЛ для поддержки мэппинга и мьютексов, тут недавно статья была по этой теме.

 
Я столкнулся с некоторыми трудностями при реализации описанного выше. Поэтому озвучу, мало ли кто столкнется с похожими проблемами.


1) Если у вас терминал x64, то скорее всего будет необходимо перекомпилировать с++ проект в x64. На всякий случай делается это так: Visual Studio -> Properties (вашего с++ проекта) -> Configuration Manager -> и там через выпадающий список либо через <New...> меняете на x64. Компилируем. Готово. Если не компилируется - проверьте References проекта, пройдитесь по ошибкам компилятора.
2) У меня были проблемы c советником, он даже не инициализировался. Я заметил это только при отключении советника от графика, когда вылетела ошибка init failed (забавно..). Советник впадал в бесконечный Sleep еще на стадии инициализации и все дело было в этих строчках (в QService.mqh):

 QService::EnterCriticalSection()
{
   while (GlobalVariableCheck("QService_CriticalSection") > 0)
   Sleep(1);
   GlobalVariableTemp("QService_CriticalSection");

После дебага и тщетных попыток понять этот "Sleep(1)", заменил код на:

QService::EnterCriticalSection()
{
   if(!GlobalVariableCheck("QService_CriticalSection"))
   GlobalVariableTemp("QService_CriticalSection");
}

Кстати вся эта статья справедлива и для MT4. Хоть в MT4 и есть DDE, мне этот подход больше нравится. Все работает замечательно.

P.S: Спасибо автору статьи! Все круто расписано!
 
Не пойму, написано хорошо, но не работает. QEXPORTWRAPPER не запускается на 64-х разрядном терминале.
 
shelandr1:
Очень интересно..Спасибо..Но может быть Сегодня есть более простые возможности*??

Конечно есть - использование подключения через встроенную в терминал возможность. Это PIPE-канал.

https://www.mql5.com/ru/docs/files/fileopen

Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
Файловые операции / FileOpen - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5