critical error означает караул - а именно дллка повесилась вместе с ней и эксперт
Видать функция
'mysql_num_rows вызванная из libmysql.dll - дала критическую ошибку.
Скорее всего, проблема возникает не столько внутри длл, сколько при её взаимодействии с терминалом, чему может быть тысяча и одна причина. Навскидку назову четыре, на мой взгляд, важнейших:
1 ) некорректная работа со строками 'как они есть' в МТ ( ИМХО - про строки лучше вообще забыть как 'туда', так и 'оттуда' );
2 ) некорректное возвращение результатов расчётов из длл ( ИМХО - избегать возвращения результатов по ссылке );
3 ) некорректная арифметика в длл ( переполнение, выход за границы массива, обращение к нераспределённому массиву и т.п. );
4 ) некорректный атрибут передачи параметров при экспорте функций - он должен быть явно указан как stdcall, и не иначе.
Как правило, новые сборки МТ4, в отличие от старых, не падают вместе с дефектной длл, но и особенно с ней не церемонятся. При малейшем подозрении на 'неправильное поведение' - немедленно стоп.
Скорее всего, проблема возникает не столько внутри длл, сколько при её взаимодействии с терминалом, чему может быть тысяча и одна причина. Навскидку назову четыре, на мой взгляд, важнейших:
1 ) некорректная работа со строками 'как они есть' в МТ ( ИМХО - про строки лучше вообще забыть как 'туда', так и 'оттуда' );
2 ) некорректное возвращение результатов расчётов из длл ( ИМХО - избегать возвращения результатов по ссылке );
3 ) некорректная арифметика в длл ( переполнение, выход за границы массива, обращение к нераспределённому массиву и т.п. );
4 ) некорректный атрибут передачи параметров при экспорте функций - он должен быть явно указан как stdcall, и не иначе.
Как правило, новые сборки МТ4, в отличие от старых, не падают вместе с дефектной длл, но и особенно с ней не церемонятся. При малейшем подозрении на 'неправильное поведение' - немедленно стоп.
1) отлично передаются, в крайнем случае передавать массивом с указанием размера
4) 409 мгновенно падает без указания причин, и краш репорта.
1 ) так и передаю массивом, только в числовом представлении; оттуда получаю так же;
4 ) когда как.
Вообще, на чисто академические исследования тонких причин обрушения терминала просто нет времени - когда-то и торговать надо. Поэтому делаю может грубо и некрасиво, но зато максимально надёжно. Особенно если в длл засунуты какие-нибудь зверские матричные расчёты с индексной эквилибристикой. :)
Похожая проблема, но еще интереснее: ДЛЛ вызывается из одной и той же MQL-функции в индюкаторе и эксперте, только вот в индюке все нормально, а советник слетает.
Есть у кого-нибудь идеи?
Кстати, насчет индикатора и советника. В mql4 допустимо количество индикаторов 400, работают в одном потоке. Эксперт - один, в другом потоке. Естественно, интерпретатор по-разному обрабатывает деструкцию. Проверить, думаю, можно на скрипте :) Должен упасть, как и эксперт, imho.
Такие вот пироги получаются. Оказывается, падает то,которое запущено позже))) Т.е. если терминал только запущен, то кидай хоть индюк, хоть советник - все работает нормально. Но если после этого запустить "оппонента" - валится. Причем независимо от того, удалена предыдущая программа или нет. Кстати, если запускать-удалять много раз только индикатор или только эксперт, то все нормально, т.е. падают последовательности эксперт, потом индикатор и индикатор, потом эксперт.
Ну дык, доведите до конца, попробовав последовательности "индикатор-скрипт" и "эксперт-скрипт",- а вдруг?
Ну дык, доведите до конца, попробовав последовательности "индикатор-скрипт" и "эксперт-скрипт",- а вдруг?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Работает эксперт, к эксперту прикручена левая DLL.
В работе эксперта возникает ситуация, что функция из DLL пишет:
2012.02.08 22:14:33 TestExpert EURUSD,M1: function 'mysql_num_rows' call from dll 'libmysql.dll' critical error
И следующая строчка в логах:
2012.02.08 22:14:33 TestExpert EURUSD,M1: expert stopped
Вопрос к разработчикам и к знающим людям, как отловить эту ошибку (expert stopped) или событие.
Это не распринтовка и в коде эксперта данной строчки нет, это выводит терминал, но вот код ошибки я так и не нашел.
Разрешение использовать DLL в терминале в настройках стоит, все работает, но иногда получается вот такая вот загагулина.