Спасибо, проверим.
Я собрал 64-битную dll-ку. Она работает.
Но в случае обращения к ней (вызова функции из dll) в тот момент когда в окне графика видно сообщение "Ожидание обновления" терминал падает.
Падает в OnCalculate() индикатора. Обращение к dll в OnInit() проходят нормально.
Использую MetaTrader 5 build 1755
- 2018.01.18
- MetaQuotes Software Corp.
- www.metatrader5.com
Так и что? Проблему решили?
Я собрал 64-битную dll-ку. Она работает.
Но в случае обращения к ней (вызова функции из dll) в тот момент когда в окне графика видно сообщение "Ожидание обновления" терминал падает.
Падает в OnCalculate() индикатора. Обращение к dll в OnInit() проходят нормально.
Использую MetaTrader 5 build 1755
А последний билд 1795 от 3 апреля
А последний билд 1795 от 3 апреля
Обновился до MetaTraider 5 build 1795 - проблема актуальна. Терминал падает.
Кроме того я выяснил, что связано это с передачей параметра в функцию.
Если совпадают 2 фактора:
1) я передаю строку которую хочу заполнить текстом;
2) на экране графика светится надпись "Ожидание обновления"
#import "Libra.dll"
void FillReport(string symbol, ENUM_TIMEFRAMES timeframe, string &report);
#import
а в OnCalculate() следующее:
string report = "";
FillReport(_Symbol, _Period, report);
Comment(report);
Если надпись "Ожидание обновления" не появляется, то всё отрабатывает корректно.
Такая надпись появляется когда переключаешь таймфрейм на графике.
Если же я передаю параметры не по ссылке, а по значению, то есть ничего не возвращаю в индикатор из DLL'ки, то такой метод в ситуации "Ожидание обновления" отрабатывает корректно.
Есть какой-либо способ узнать что на момент выполнения OnCalculate() график находится в состоянии Ожидание обновления" ?
Обновился до MetaTraider 5 build 1795 - проблема актуальна. Терминал падает.
Кроме того я выяснил, что связано это с передачей параметра в функцию.
Если совпадают 2 фактора:
1) я передаю строку которую хочу заполнить текстом;
2) на экране графика светится надпись "Ожидание обновления"
#import "Libra.dll"
void FillReport(string symbol, ENUM_TIMEFRAMES timeframe, string &report);
#import
а в OnCalculate() следующее:
string report = "";
FillReport(_Symbol, _Period, report);
Comment(report);
Если надпись "Ожидание обновления" не появляется, то всё отрабатывает корректно.
Такая надпись появляется когда переключаешь таймфрейм на графике.
Если же я передаю параметры не по ссылке, а по значению, то есть ничего не возвращаю в индикатор из DLL'ки, то такой метод в ситуации "Ожидание обновления" отрабатывает корректно.
Есть какой-либо способ узнать что на момент выполнения OnCalculate() график находится в состоянии Ожидание обновления" ?
https://www.mql5.com/ru/forum/622
https://www.mql5.com/ru/articles/18
Тут поищите ответ на свой вопрос.
- 2010.03.07
- www.mql5.com
https://www.mql5.com/ru/forum/622
https://www.mql5.com/ru/articles/18
Тут поищите ответ на свой вопрос.
да и вообще, выложите весь проект длл
мне лично он даром не нужен, утомили секретчики
выложите и мы быстро найдем баг
https://www.mql5.com/ru/forum/622
https://www.mql5.com/ru/articles/18
Тут поищите ответ на свой вопрос.
К сожалению, эти ссылки мне бесполезны.
Потому что как я выше писал:
1. Мой код работает. Он работает бесконечно долго, но лишь
до момента появления надписи: "Ожидание обновления", - в окне
терминала;
2. Терминал падает. А терминал не должен падать, потому что он отлавливает все не перехваченные исключения при вызовах любых функций из внешний dll. Терминал максимум должен выгрузить индикатор, но не упасть.
3. Я лишь спросил есть ли способ определить, что терминал находится в состоянии "Ожидание обновления"?
Советник содержит код
библиотека Wrapper.dll
при запуске советника падает Meta Trader 5
Это полный код?
Если не полный, то разобраться нельзя, так как у вас тысяча возможностей завалить систему из dll.
да и вообще, выложите весь проект длл
мне лично он даром не нужен, утомили секретчики
выложите и мы быстро найдем баг
Алексей, спасибо что откликнулись.
Специально для Вас и для чистоты эксперимента, сегодня я написал аналог моей dll-ки на C++.
Результат тот же:
1. Код работает.
2. Терминал падает.
Изначально dll-ка была
написана на C# под .NET Framework 4.7.
Всё что делает индикатор, так это считает как часто был вызван метод OnInit() на каждом из таймфреймов и выводит эту информацию в верхний левый угол окна графика.
Исходник на .NET (LibraDLL_SourceCode.zip) здесь:
https://yadi.sk/d/REPNNBBu3UQhc5
Исходник на C++ (LibraDLL_SourceCode_C++.zip) здесь:
https://yadi.sk/d/zFrl2muT3URaDV
Исходник индикатора (IndicatorEventTest.mq5) здесь:
https://yadi.sk/d/qVXKaqvM3URbJd
Скомпилированная библиотечка под .NET (Libra.dll_C#.NET.zip) здесь:
https://yadi.sk/d/NbUvvDpk3URbAT
Скомпилированная native библиотечка (Libra.dll_C++.zip) здесь:
https://yadi.sk/d/LNeeMekU3URbGj
Отличие native библиотеки от .NET библиотеки в том, что в последней реализовано логирование.
Libra.dll (под .NET) пишет лог в папку C:\Program Files\MetaTrader 5\Logs\
И из совокупных логов видно, что такие методы языка MQL5 как Alert или Print идущие до обращения к функции в DLL в момент проблемного выполнения OnCalculate() не отрабатывают, зато сама функция в DLL отрабатывает полностью.
Прежде чем вызывать метод из DLL, который заполняет строку (приёмный буфер) текстом, следует явно задать размер этого приёмного буфера функцией StringInit.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Советник содержит код
библиотека Wrapper.dll
при запуске советника падает Meta Trader 5