expert stopped

 

Работает эксперт, к эксперту прикручена левая 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 в терминале в настройках стоит, все работает, но иногда получается вот такая вот загагулина.

 

critical error означает караул - а именно дллка повесилась вместе с ней и эксперт

Видать функция

'mysql_num_rows вызванная из libmysql.dll - дала критическую ошибку.

 

Скорее всего, проблема возникает не столько внутри длл, сколько при её взаимодействии с терминалом, чему может быть тысяча и одна причина. Навскидку назову четыре, на мой взгляд, важнейших:

1 ) некорректная работа со строками 'как они есть' в МТ ( ИМХО - про строки лучше вообще забыть как 'туда', так и 'оттуда' );

2 ) некорректное возвращение результатов расчётов из длл ( ИМХО - избегать возвращения результатов по ссылке );

3 ) некорректная арифметика в длл ( переполнение, выход за границы массива, обращение к нераспределённому массиву и т.п. );

4 ) некорректный атрибут передачи параметров при экспорте функций - он должен быть явно указан как stdcall, и не иначе.

Как правило, новые сборки МТ4, в отличие от старых, не падают вместе с дефектной длл, но и особенно с ней не церемонятся. При малейшем подозрении на 'неправильное поведение' - немедленно стоп.

 
alexjou:

Скорее всего, проблема возникает не столько внутри длл, сколько при её взаимодействии с терминалом, чему может быть тысяча и одна причина. Навскидку назову четыре, на мой взгляд, важнейших:

1 ) некорректная работа со строками 'как они есть' в МТ ( ИМХО - про строки лучше вообще забыть как 'туда', так и 'оттуда' );

2 ) некорректное возвращение результатов расчётов из длл ( ИМХО - избегать возвращения результатов по ссылке );

3 ) некорректная арифметика в длл ( переполнение, выход за границы массива, обращение к нераспределённому массиву и т.п. );

4 ) некорректный атрибут передачи параметров при экспорте функций - он должен быть явно указан как stdcall, и не иначе.

Как правило, новые сборки МТ4, в отличие от старых, не падают вместе с дефектной длл, но и особенно с ней не церемонятся. При малейшем подозрении на 'неправильное поведение' - немедленно стоп.

1) отлично передаются, в крайнем случае передавать массивом с указанием размера

4) 409 мгновенно падает без указания причин, и краш репорта.

 

1 ) так и передаю массивом, только в числовом представлении; оттуда получаю так же;

4 ) когда как.

Вообще, на чисто академические исследования тонких причин обрушения терминала просто нет времени - когда-то и торговать надо. Поэтому делаю может грубо и некрасиво, но зато максимально надёжно. Особенно если в длл засунуты какие-нибудь зверские матричные расчёты с индексной эквилибристикой. :)

 

Похожая проблема, но еще интереснее: ДЛЛ вызывается из одной и той же MQL-функции в индюкаторе и эксперте, только вот в индюке все нормально, а советник слетает.

Есть у кого-нибудь идеи?

 
Есть, конечно: как только прозвучит первая версия, похожая на правду, тему ликвидируют.
 
Кстати, насчет индикатора и советника. В mql4 допустимо количество индикаторов 400, работают в одном потоке. Эксперт - один, в другом потоке. Естественно, интерпретатор по-разному обрабатывает деструкцию. Проверить, думаю, можно на скрипте :) Должен упасть, как и эксперт, imho.
 
tara:
Кстати, насчет индикатора и советника. В mql4 допустимо количество индикаторов 400, работают в одном потоке. Эксперт - один, в другом потоке. Естественно, интерпретатор по-разному обрабатывает деструкцию. Проверить, думаю, можно на скрипте :) Должен упасть, как и эксперт, imho.
Такие вот пироги получаются. Оказывается, падает то,которое запущено позже))) Т.е. если терминал только запущен, то кидай хоть индюк, хоть советник - все работает нормально. Но если после этого запустить "оппонента" - валится. Причем независимо от того, удалена предыдущая программа или нет. Кстати, если запускать-удалять много раз только индикатор или только эксперт, то все нормально, т.е. падают последовательности эксперт, потом индикатор и индикатор, потом эксперт.
 
alsu:
Такие вот пироги получаются. Оказывается, падает то,которое запущено позже))) Т.е. если терминал только запущен, то кидай хоть индюк, хоть советник - все работает нормально. Но если после этого запустить "оппонента" - валится. Причем независимо от того, удалена предыдущая программа или нет. Кстати, если запускать-удалять много раз только индикатор или только эксперт, то все нормально, т.е. падают последовательности эксперт, потом индикатор и индикатор, потом эксперт.

Ну дык, доведите до конца, попробовав последовательности "индикатор-скрипт" и "эксперт-скрипт",- а вдруг?
 
tara:

Ну дык, доведите до конца, попробовав последовательности "индикатор-скрипт" и "эксперт-скрипт",- а вдруг?
... вдруг разверзнутся небеса и на меня высыплются миллиарды, украденные компанией MQ и спрятанные в коде вызова DLL? Пойду попробую)))
Причина обращения: