Ошибки, баги, вопросы - страница 3079

 
В маркете скриншот не загружается. Пробовал с двух браузеров.
 
Dmitry Fedoseev #:
В маркете скриншот не загружается. Пробовал с двух браузеров.

У меня тоже..

 

Добрый день! В чем может быть ошибка? Использую dll для записи в SQL Server (пример из статьи https://www.mql5.com/ru/articles/2895 ).

Если использую до 5 потоков, то данные корректно записываются. Использую больше потоков, сразу ошибка "Unhandled exception 0xE0434352"

Интеграция эксперта на MQL и базы данных (SQL Server, .NET и C#)
Интеграция эксперта на MQL и базы данных (SQL Server, .NET и C#)
  • www.mql5.com
Статья описывает, как добавить в экспертов на MQL5 возможность работы с сервером баз данных Microsoft SQL Server. Используется импорт функций из DLL. Для создания DLL применяется платформа Microsoft .NET и язык C#. Используемые в статье методы с незначительными изменениями подходят и для экспертов, написанных на MQL4.
Файлы:
SQL.mqh  19 kb
OHLC_1.mq5  5 kb
 
SEM #:

Добрый день! В чем может быть ошибка? Использую dll для записи в SQL Server (пример из статьи https://www.mql5.com/ru/articles/2895 ).

Если использую до 5 потоков, то данные корректно записываются. Использую больше потоков, сразу ошибка "Unhandled exception 0xE0434352"

ВСЁ во всех функциях интерфейсных DLL завернуть в try catch, поймать что там за "unhandled exception" и записать в журнал..

это вообще хороший тон - вылавливать все исключения, оборачивать в try все вызовы плюсов. Даже в документации MQL прямо написано - DLL-ки не должны кидать исключений, не C++ 

в частности в статье conn.Close и new SqlConnection не попадают под "вылов исключений" и потенциально могут его кинуть

 
Dmitry Fedoseev #:
В маркете скриншот не загружается. Пробовал с двух браузеров.
Yury Emeliyanov #:

У меня тоже..

Простым перетаскиванием картинки не пробовали?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Маркет и математика

Alexey Viktorov, 2021.08.19 21:01

Попробуйте вставить картинку простым перетаскиванием изображения в текст.

Я сейчас попробовал внести изменения в скрытый с витрины советник, перетащил первое попавшееся изображение, получилось.



 
Alexey Viktorov #:

Простым перетаскиванием картинки не пробовали?


из 5 картинок только одна добавляется

 
Andrei Trukhanovich #:

Так уже давно. mql строки очень не любят нуль символы внутри строки и в литералах, в функциях тоже.

Единственный нормальный способ - переводить в массив три строки с завершающим нулем.

Т.е. такое поведение как сейчас было сделано намеренно несколько лет назад. Причин не знаю.

Кругом враги

 
Maxim Kuznetsov #:

ВСЁ во всех функциях интерфейсных DLL завернуть в try catch, поймать что там за "unhandled exception" и записать в журнал..

это вообще хороший тон - вылавливать все исключения, оборачивать в try все вызовы плюсов. Даже в документации MQL прямо написано - DLL-ки не должны кидать исключений, не C++ 

в частности в статье conn.Close и new SqlConnection не попадают под "вылов исключений" и потенциально могут его кинуть

Спасибо! Проверил, ошибка доступа к общим переменным. Автор тоже об этом писал

Надо отметить, что демо-проект имеет очень существенное ограничение: позволяет запускать только одного эксперта, работающего с БД, в одном терминале MetaTrader. Дело в том, что все эксперты используют один экземпляр загруженной DLL. Поскольку наш класс сделан статическим, то он будет один для всех запущенных экспертов. Переменные тоже будут общими. Если запустить нескольких экспертов, то все они будут использовать одно и то же подключение и один объект команды на всех.  Если к этим объектам попытаются одновременно обращаться сразу несколько экспертов — могут возникнуть проблемы.


Вопрос: Как можно реализовать многопоточный доступ к dll (отдельный экземпляр для каждого вызова функции и переменные локальные для каждого вызова)?

 
2020.08.17 01:22:44   9842:0.8953065>0.92137
2020.08.17 01:22:44   9843:0.8953065>0.92106
2020.08.17 01:22:44   9844:0.8953065>0.92075
2020.08.17 01:22:44   9845:0.8953065>0.92045
2020.08.17 01:22:44   9846:0.8953065>0.92014
2020.08.17 01:22:44   9847:0.8953065>0.91983
        

2020.08.17 01:22:48   9842:0.8953065>0.92137
2020.08.17 01:22:48   9843:0.8953065>0.92106
2020.08.17 01:22:48   9844:1.7189865>0.92075
2020.08.17 01:22:48   Create GlobalVariables for SELL 1.7189865>0.92075
2020.08.17 01:22:48   9845:0.8953065>0.92045
2020.08.17 01:22:48   9846:0.8953065>0.92014
2020.08.17 01:22:48   9847:0.8953065>0.91983

Проблему наблюдаю в MT5 тестере.

Работая с несколькими валютами, переодически происходит подмена данных с другой валюты. Проверьте тестер. Поправте, пожалуйста.

Первое значение это SymbolInfoDouble(symbol,SYMBOL_BID);

2020.08.17 01:11:38   9877(EURGBP):0.8952471000000001>0.91079
2020.08.17 01:11:38   9878(EURGBP):0.8952471000000001>0.91048
2020.08.17 01:11:38   9879(EURGBP):0.8952471000000001>0.91017
2020.08.17 01:11:38   9880(EURGBP):1.7184123>0.90987
2020.08.17 01:11:38   Create GlobalVariables for SELL 1.7184123>0.90987
2020.08.17 01:11:38   9881(EURGBP):0.8952471000000001>0.90956
2020.08.17 01:11:38   9882(EURGBP):0.8952471000000001>0.90925
2020.08.17 01:11:38   9883(EURGBP):0.8952471000000001>0.90894
2020.08.17 01:11:38   9884(EURGBP):0.8952471000000001>0.90864

Как будто в моменте он не может получить цены SymbolInfoDouble(EURGBP,SYMBOL_BID); и берет значение с другой пары которая в работе. Есть способ проверки на коректность котировки?

 
SEM #:

Спасибо! Проверил, ошибка доступа к общим переменным. Автор тоже об этом писал

Надо отметить, что демо-проект имеет очень существенное ограничение: позволяет запускать только одного эксперта, работающего с БД, в одном терминале MetaTrader. Дело в том, что все эксперты используют один экземпляр загруженной DLL. Поскольку наш класс сделан статическим, то он будет один для всех запущенных экспертов. Переменные тоже будут общими. Если запустить нескольких экспертов, то все они будут использовать одно и то же подключение и один объект команды на всех.  Если к этим объектам попытаются одновременно обращаться сразу несколько экспертов — могут возникнуть проблемы.


Вопрос: Как можно реализовать многопоточный доступ к dll (отдельный экземпляр для каждого вызова функции и переменные локальные для каждого вызова)?

В .NET почти никак. Класс сделан статическим не потому что автор статьи злой, а потому что классы шарпа так импортируются.

На мой взгляд путей два: 1) (писать долго, работает быстро) переписать на С++ и больше не трогать .NET  2) (довольно механично, но скорость упадёт и могут быть сайд-эффекты) вдумчиво оборачивать вызовы в Critical Section чтобы две нити одновременно не обращались

если шарп принципиален, то ещё вариант - переписать чтобы на уровне DLL контролировать пулы подключений, чтобы запоминать связку советник<->connection_id и каждый советник работал со своим подключением;
Тут за .net не подскажу - можно ли получать и хранить ссылку на объект шарпа в какой-либо структуре или скаляре MQL и передавать её туда-сюда. То есть оперировать как с обычным указателем С++. Если можно, то всё упрощается. 

Причина обращения: