Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
int CatVector(double& a[] ...
А что у тебя представляет из себя double& a[]
Что это за массив? Таймсерии? И ещё у тебя вылетает сразу же или про прошествии какого-то времени?
Попробуй тот же код вызвать в скрипте если там не будет падать значит вероятно и правда длительный расчёт не навится эксперту он требует возврата из функции start через какое-то время. Хотя по документации к мт4 вроде и нет таких ограничений на выполнение функции start Но мне кажется что длительное выполнение нарушает работу или идёт принудительный возврат из старт. Если у тебя будет работать в скрипте - значит ты прав что эксперту не нравится что ты что то долго расчитываешь.
double& a[] - это одномерный массив цен.
В индюке никаких проблем. Работает нормально.
Попробуй вызывать в скрипте свою функцию и скажи так же без проблем работает как и в индикаторе?
Если тоже будет валится то напиши как ты таймсерии передаёшь? Случаем не таким ли способом
double a[][6];
ArrayCopyRates(a, ...
DLLFunc(a, ...
Если так то здесь могут быть проблемы. К примеру если ты делаешь в
init() {
ArrayCopyRates(a, ...
}
а в
strart() {
DLLFunc(a, ...
}
то в этом случае у тебя мт4 упадёт либо сразу либо спустя какое-то время потому что указатель на массивы таймсерий может поменятся а ты в dll продолжать будешь использовать старый указатель (ссылку если в MQL коде). У меня была такая проблема и нашёл только отлавливая системные исключения access violation и локализовал место падения. Возможно у тебя такая же проблема. В индикаторе ты не сможешь в init передать в функцию dll таймсерии и количество баров.
Если ты таким способом передаёшь массив таймсерий то попробуй так
double a[][6];
start() {
ArrayCopyRates(a, ...
DLLFunc(a, ...
}
Естественно вместо DllFunc у тебя будет другое имя функции но принцип тот же.
Есть нюанс. Индикатор работает в интерфейсном потоке, который существует всегда. А эксперты и скрипты работают в специально создаваемом потоке. Поток создаётся перед запуском эксперта, а потом убивается.
Обратите внимание на то, как в Вашей dll обрабатывается thread detach
stringo, не могли бы вы написать как именно надо обрабатывать сообщение DLL_THREAD_DETACH что бы dll не выгружалась после каждого тика из советника. У Дж. Рихтера сказано что "... Заметьте, что DLL может не дать потоку завершиться. Например, такое возможно, когда функция DllMain, получив уведомление DLL_THREAD_DETACH, входит в бесконечный цикл. " Ни это ли имелось ввиду. Если да, то приведите пример кода пожалуйста. Очень нужно. Моя dll достаточно долго загружает вспомогательные библиотеки и это критично для моей системы, как выйти из этой ситуации не знаю, вижу только один путь не дать dll выгружаться.
Нашел другой путь решения проблемы через обмен данными между процессами с помощью файлов отображаемых в память. Организую "канал связи" между процессами внутри dll-ки с помощью общей виртуальной памяти. Прикручиваю dll к индикатору (это принципиально), индикатор является поставщиком данных в dll. Подсоединяю советника к "каналу связи" на каждом тике, т.е. советник просто забирает информацию из dll, при этом dll постоянно загружена так как подключена к индикатору. Всё. "Дёшево и сердито" :-)
Спасибо ВСЕМ кто ответил.
Нашел другой путь решения проблемы через обмен данными между процессами с помощью файлов отображаемых в память. Организую "канал связи" между процессами внутри dll-ки с помощью общей виртуальной памяти. Прикручиваю dll к индикатору (это принципиально), индикатор является поставщиком данных в dll. Подсоединяю советника к "каналу связи" на каждом тике, т.е. советник просто забирает информацию из dll, при этом dll постоянно загружена так как подключена к индикатору. Всё. "Дёшево и сердито" :-)
Спасибо ВСЕМ кто ответил.
А можешь выложить сюда код DLL? Хочется посмотреть пример, как создавать DLL под DELPHI для MetaTrader.