dll для MetaTrader 5 в linux
- By admin
- Вт 22 Апрель 2014
Уже как месяц изучаю платформу для торговли ценными бумагами MetaTrader 5. В планах у меня стоит написать до лета торговую систему, которая будет торговать, торговать, торговать и к Новому Году я стану миллионером. :-)
Отвлекся. Тут я хотел рассказать о первой проблеме, с которой столкнулся в процессе разработки. Нужно было подключить к скрипту Metatrader-а свою dll-ку, написанную на C.На момент битвы над ошибкой использовал Xubuntu 13.10 (32 bit), Wine 1.6.1 и MetaTrader 5 (build 910). Для компиляции dll файлов использовал кроссплатформенный компилятор mingw и mingw-w64
Как ошибку воспроизвести:
Код самой dll-ки (simple.cpp):
extern "C" { int qwe() { return 1; } }
Компилируем командой i686-w64-mingw32-g++ -shared -o out.dll simple.cpp
В MetaEditor, Вставляем код, приведенный ниже. Этот программный код должен вызывать функцию qwe из dll файла:
#import "out.dll" int qwe(); #import void OnStart() { Print(qwe()); }
запускаем этот код, видим, что Metatrader показывает окно, в котором нужно подтвердить запуск dll файлов.
Подтверждаем. После подтверждения видим, в фрейме "инструменты"->"эксперты" надпись 2014.04.22 16:41:57.190 simple (Si-6.14,H1) Cannot load 'C:\Program Files\ОТКРЫТИЕ-Брокер\MQL5\Projects\out.dll'
В ходе экспериментов обнаружил, что если установить не mingw-w64-i686 а более старый mingw, то скомпилированный файл метатрейдер без проблем подключает:
Компилируем: i586-mingw32msvc-g++ -mrtd -shared -o out.dll simple.cpp
Запускаем в MetaEditor код, нажав на кнопку клавиатуры F5. Metatrader "спрашивает" можно или нет подключить dll файл:
Подтверждаем. После подтверждения в фрейме "инструменты"->"эксперты" единичку. То есть dll-ка заработала.
Если внимательно приглядеться, то можно увидеть, что если компилируем при помощи i686-w64-mingw32-g++, то Metatrader пытается загрузить какую-то библиотеку libgcc_s_sjlj-1.dll, а компилятор i586-mingw32msvc-g++ как-то обходится без нее.
Решение проблемы нашел в интернете: нужно к компилятору добавить параметр -static-libgcc. Другими словами, компилировать dll файл нужно так:
i686-w64-mingw32-g++ -static-libgcc -shared -o out.dll simple.cpp