Создание собственного расширения MetaTrader (dll) - страница 3

 

Вопрос по C++... внешняя DLL для MT4

Привет всем,

У меня есть внешняя DLL, которую я написал на C++. Однако я еще совсем новичок в C++, поэтому я думаю, что это может быть причиной моей проблемы. У меня есть другая версия, написанная на C#, которая работает нормально, за исключением того, что для того, чтобы сделать C# DLL вызываемыми MQL, я должен изменить их, и это изменение, похоже, вызывает небольшие утечки памяти. Я надеюсь, что кто-нибудь здесь сможет помочь мне с версией на C++. Вот история:

Я медленно разрабатываю различные библиотеки для программирования торговых стратегий. Одна из вещей, которую я пытаюсь сделать, это разработать последовательный набор сервисов для различных вещей, таких как логирование, блокировка (потокобезопасный доступ к ресурсам) и уведомление о событиях. В общем, я пытаюсь подтянуть MQL к более современной парадигме программирования. В любом случае, в настоящее время я работаю над библиотекой, которая позволит советникам получать уведомления о различных торговых событиях (размещен, заполнен, закрыт). Эти события могут быть результатом сделок, совершенных советником, подписывающимся на события, или другими советниками. Для этого я использую внешнюю DLL, которая в основном облегчает коммуникацию между советниками посредством передачи сообщений. Есть советник-публикатор, который просто ищет новые торговые события, и когда одно из них происходит, он помещает сообщение в очередь для советника-подписчика (у каждого подписчика своя очередь).

Проблема заключается в следующем... Пока передается только одно сообщение за раз, все работает нормально. Очевидно, что это совершенно неприемлемо. Когда передается более одного сообщения за раз, я обнаруживаю, что первое сообщение повреждается (оно продолжает возвращать сообщение как "1", хотя вместо этого должно быть что-то вроде "FILLED,1005167"). Со вторым сообщением все в порядке, а с первым - нет. Я еще не тестировал более двух сообщений, но, предположительно, мы увидим то же самое.

Я был бы рад, если бы кто-нибудь знал ответ на вопрос, что именно я делаю неправильно, и смог бы пролить свет на мою проблему. Несколько замечаний: 1) В конечном итоге я собираюсь выпустить этот код под Apache 2.0, поэтому этот исходный файл также выкладывается под Apache 2.0... Я намерен выложить его для сообщества, когда он будет работать достаточно гладко. 2) Я неоднократно говорил здесь "очередь", но если вы посмотрите на исходный код, то увидите, что я использую вектор вместо этого, и в основном использую его как стек. Первоначально у меня была очередь, но я изменил ее на вектор только на случай, если я делаю что-то не так с очередью STL, о чем я не знал. Не повезло. Реальной реализацией будет очередь, но пока ни очередь, ни вектор не работают корректно для меня.

Заранее спасибо за любую информацию.

Брэндон Уилхайт

Файлы:
 

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

Когда я впервые начал писать DLL для использования в MT4, я никогда не мог заставить их работать на C++. Я думаю, проблема была в том, что мои настройки проекта в Visual Studio всегда были неправильными (их так много). Совсем недавно я нашел пример от CodeGuru, который я действительно смог скомпилировать и использовать. Теперь я практически вычистил этот проект и использую его как шаблон.

Тем временем я пишу DLL на C# и использую вот этот замечательный инструмент. По сути, он берет IL и изменяет его так, чтобы его можно было вызывать из неуправляемого кода. Единственная проблема заключается в том, что MT4, похоже, демонстрирует утечку памяти, когда делает это. Я не определил окончательно, связано ли это с MT4 или с изменением IL, или еще с чем, но это происходит.

Далее я буду либо учиться писать обертки на C++ и/или просто изучать C++. Надеюсь, это решит проблему с памятью.

В любом случае, то, что вы хотите сделать, определенно может быть реализовано. Мне удалось написать несколько довольно сложных DLL для MT4 на C#, включая такие вещи, как remoting, raw sockets, http, WinForms. Практически все, что можно сделать с .NET, можно вызвать из MT4 таким образом (назовите это, и я, вероятно, сделал это). И это очень надежно. Единственная проблема - относительно медленная утечка памяти.

Magick:
Спасибо Патрик

Это очень интересная идея использовать FTP.

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

Я нашел вот это, которое, как мне кажется, может помочь - Упрощенная обёртка и генератор интерфейса.

Однако я программист довольно начального уровня и не совсем понимаю, что нужно для создания промежуточного слоя обертки на c++.

Мне было бы интересно услышать ваше мнение, считаете ли вы, что это может быть полезным инструментом для использования в качестве моста между c++ и .net?
 
bwilhite:
Поскольку я был здесь, я решил поделиться своим опытом. То, что вы хотите сделать, безусловно, можно сделать, и я сам делал это много раз.

Когда я впервые начал писать DLL для использования в MT4, я никогда не мог заставить их работать на C++. Я думаю, проблема была в том, что мои настройки проекта в Visual Studio всегда были неправильными (их так много). Совсем недавно я нашел пример от CodeGuru, который я действительно смог скомпилировать и использовать. Теперь я практически вычистил этот проект и использую его как шаблон.

Тем временем я пишу DLL на C# и использую вот этот замечательный инструмент. По сути, он берет IL и изменяет его так, чтобы его можно было вызывать из неуправляемого кода. Единственная проблема заключается в том, что MT4, похоже, демонстрирует утечку памяти, когда делает это. Я не определил окончательно, связано ли это с MT4 или с изменением IL, или еще с чем, но это происходит.

Далее я буду либо учиться писать обертки на C++ и/или просто изучать C++. Надеюсь, это решит проблему с памятью.

В любом случае, то, что вы хотите сделать, определенно может быть достигнуто. Мне удалось написать несколько довольно сложных DLL для MT4 на C#, включая такие вещи, как remoting, raw sockets, http, WinForms. Практически все, что можно сделать с .NET, можно вызвать из MT4 таким образом (назовите это, и я, вероятно, сделал это). И это очень надежно. Единственная проблема - относительно медленная утечка памяти.

bwilhite Вы просто спаситель! Это выглядит как отличный инструмент. Нет ли у вас, случайно, проекта на c#, который демонстрирует взаимодействие с MT из C#? Я хочу, чтобы мое .net приложение сообщало MT, когда торговать. Или, возможно, вы можете порекомендовать ссылку, которая могла бы помочь. Любая помощь будет высоко оценена.

 

Большое спасибо!

 

Dll

Привет

Можно ли использовать DLL для отправки и получения заказов через таблицу excel?

Где я могу изучить этот аспект DLL.

С уважением

Латино

 
codersguru:
Все, кто заинтересован в создании собственного расширения (dll) MetaTrader, могут перейти по ссылке:

Создание собственного расширения MetaTrader (dll) - часть 1

Создание собственного расширения MetaTrader (dll) - часть 2

Будет еще одна (или 2) части, которые я пишу!

Надеюсь, они вам понравятся!

Пожалуйста, обновите свой курс до Visual C++ 2008 Express Edition

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

Когда я впервые начал писать DLL для использования в MT4, я никогда не мог заставить их работать на C++. Я думаю, проблема была в том, что мои настройки проекта в Visual Studio всегда были неправильными (их так много). Совсем недавно я нашел пример от CodeGuru, который я действительно смог скомпилировать и использовать. Теперь я практически вычистил этот проект и использую его как шаблон.

Тем временем я пишу DLL на C# и использую вот этот замечательный инструмент. По сути, он берет IL и изменяет его так, чтобы его можно было вызывать из неуправляемого кода. Единственная проблема заключается в том, что MT4, похоже, демонстрирует утечку памяти, когда делает это. Я не определил окончательно, связано ли это с MT4 или с изменением IL, или еще с чем, но это происходит.

Далее я буду либо учиться писать обертки на C++ и/или просто изучать C++. Надеюсь, это решит проблему с памятью.

В любом случае, то, что вы хотите сделать, определенно может быть достигнуто. Мне удалось написать несколько довольно сложных DLL для MT4 на C#, включая такие вещи, как remoting, raw sockets, http, WinForms. Практически все, что можно сделать с .NET, можно вызвать из MT4 таким образом (назовите это, и я, вероятно, сделал это). И это очень надежно. Единственная проблема - относительно медленная утечка памяти.

Вы смогли определить источник этой медленной утечки, bwilhite? Я был бы признателен за вашу помощь в этой области, если вы все еще готовы. На данный момент я ищу простую mql dll, которая позволит мне отправлять и получать сообщения через сокеты. Я знаком с основами c#, так что если я смогу найти способ воспользоваться преимуществами, тем лучше.

Спасибо.

 
Magick:
bwilhite Вы - спаситель жизни! Это выглядит как отличный инструмент. Нет ли у вас, случайно, проекта на c#, который демонстрирует взаимодействие с MT из C#? Я хочу сделать так, чтобы мое .net приложение сообщало MT, когда торговать. Или, возможно, вы можете порекомендовать ссылку, которая могла бы помочь. Любая помощь будет высоко оценена.

Вам повезло с этим Магиком? Это именно то, что я тоже хочу сделать - чтобы приложение .net говорило MT, когда и что торговать. Пожалуйста, дайте мне знать, если вы нашли решение.

Я также ценю и хотел бы услышать больше от bwihite. Есть ли у вас какие-нибудь примеры c# dll, которыми вы могли бы поделиться.

Спасибо!

 

Я работал над своей собственной DLL и столкнулся с ошибкой 127.

Файл .cpp содержит (среди прочего):

MT4_EXPFUNC char* _stdcall DLLtest() {

return("testing!");

}

[/CODE]

header file contains:

#define MT4_EXPFUNC __declspec(dllexport)

MT4 file:

[CODE]

#import "mydll.dll"

string DLLtest();

Конечно, это не все, что они содержат, но это существенная информация. Теперь, исходя из моего понимания, у меня есть все, чтобы попытаться вызвать функцию из MT4.

По какой-то причине он просто не "видит", что она существует. Я думал, что дело в том, что в моей DLL не хватает файла .def, но даже после того, как я создал его вручную, он все равно не работает. Кроме того, я полагаю, что строка MT4_EXPFUNC означает, что функция будет экспортирована в любом случае, поэтому .def не нужен. Все компилируется нормально, советник работает нормально до тех пор, пока я не пытаюсь вызвать функцию (поскольку он ее не видит), и тогда он останавливается.

Я в растерянности. Я действительно думал, что это проблема с .def, но чем больше я думаю об этом, тем больше убеждаюсь, что это не так.

BTW Я использую Visual C++ 2008 Express...

Спасибо за любое понимание,

-Джейсон

 

У меня такая же ошибка 127 при использовании Visual C++ 2008 Express. Решения пока нет, если я найду его, то опубликую.

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