Можно сделать файл с пустыми функциями и еще одну функцию для проверки рабочая библиотека или пустышка.
.. замкнуто-порочный круг, т.е. проверить:
# а есть ли там вызываемая процедура ..
# процедура есть, а то ли кол-во параметров она берет,
# а какая версия алгоритма работы на контролькном примере
# а что она возвращает - массив или число или логику )))
Короче интеллектуалный каталогизатор библиотек а не трейдер )
Для загрузки библиотеки можно использовать kernel32.LoadLibraryA (или LoadLibraryW); для получения адресов функций из загруженных библиотек - GetProcAddress. Для плагинов я бы предложил организовать дополнительную dll'ку, предоставляющую интерфейс следующего вида:
1) функция, загружающая библиотеку по имени и возвращающая хэндл (обёртка вокруг LoadLibrary)
2) функция, получающая адрес ф-ии посредством GetProcAddress по заданным хэндлу и имени функции; должна возвращать адрес искомой функции либо нулевой указатель (обёртка вокруг GetProcAddress)
3) функция, позволяющая выполнить вызов функции по адресу с проверкой на его корректность (передаем адрес и строчку с параметрами; при этом все функции плагинов оформляем таким образом, чтобы им передавалась текстовая строка с параметрами, а они уже сами разбивали её и извлекали нужные параметры... если вам, конечно, нужны параметры)
Вообще вариантов уйма - можно ещё сделать перечисление всех библиотек в заданной папке; грузить их по очереди и при обнаружении в конкретной библиотеке функции с именем типа InitMyCoolPlugin регистрировать её в советнике каким-либо образом (массивы в помощь), после чего, консультируясь с внутренней таблицей эксперта о необходимости того или иного плагина - решать, что и откуда грузить.
Вообще тема обширная, имхо тянет на статью :) Может кто возьмется написать?
Для загрузки библиотеки можно использовать kernel32.LoadLibraryA (или LoadLibraryW); для получения адресов функций из загруженных библиотек - GetProcAddress.
Я уж было обрадовался :(
Для DLL - действительно такое можно сделать, но в МТ внешние эксперты это "честные" ex4-файлы и их загрузка и связывания выполняется (я так думаю) средствами самого МТ.
Наверно самое простое решение это все таки предложение Integer-a: делаю пустышку с одной единственной функцией FunctionsExsist возвращающей false. Пустышка должна быть всегда. Если вместо нее сделано чтото "более содержательное" (в котором кроме самой FunctionsExsist есть еще куча других функций-плугинов), то там она возвращает true и тогда в коде основного эксперта можно просто прописать:
if(FunctionsExsist) // есть живые плугины - их функции можно вызывать { ... Check(.... ... TralingStop(.... ... } // плугинов нету - ничего не вызывается и эксперт не ломается на вызове несуществующих функций
Для надежности - можно (системными средствами) до вызова этого кода проверить наличие самого файла с плугинами "ex-TralingStop.ex4" и если его нет, эту проверку не делать (ибо как эксперт поламается на обращении к отсутвующей функции FunctionsExsist).
Не самое красивое решение - но достаточно простое и будет работать. Если кто найдет получше - поделитесь ;)
врядли вообще получится подменить библиотечный файл во время работы эксперта. Или файл занят будет или эксперт не будет его перечитывать.
Только через длл есть шанс реализовать загрузку времени выполнения.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Споткнулся об проблему: есть эксперт, хочу к нему написать несколько "плугинов" оформленных в виде внешних библиотек (чтобы не трогая самого эксперта компилить только их). Но вызывать их хочу только в том случае если они есть. Например: написал функцию трала -> получил ex4 с заданным именем (например ex-TralingStop). В эксперте включил описание:
Теперь хочу чтобы эксперт мог проверить: если такая функция ( TralingStop(); ) доступна - вызвать ее, если нет - то не вызывать. Нечто вроде:
Если просто вызвать функцию без проверки, или в результате перекомпиляции не получился файл ex4 из за ошибок в коде - эксперт останавливается с сообщением что TralingStop() не найден и больше не работает. А мне бы хотелось чтобы он дальше делал себе то что умеет, но пока без этой функции.
Знает ли кто какой нибудь работающий способ сделать такое?