Статья описывает, как добавить в экспертов на MQL5 возможность работы с сервером баз данных Microsoft SQL Server. Используется импорт функций из DLL. Для создания DLL применяется платформа Microsoft .NET и язык C#. Используемые в статье методы с незначительными изменениями подходят и для экспертов, написанных на MQL4.
市场不加载屏幕截图。从两个浏览器尝试。
我也是...
下午好,可能是什么问题?我使用 dll 写入 SQL 服务器(例子来自文章https://www.mql5.com/ru/articles/2895)。
如果我最多使用5个线程,数据就能正确写入。如果我使用更多的线程,就会出现错误 "未处理的异常0xE0434352"。
下午好,可能是什么问题?我使用 dll 写入 SQL 服务器(例子来自文章https://www.mql5.com/ru/articles/2895)。
如果我最多使用5个线程,数据就能正确写入。如果我使用更多的线程,就会出现 "未处理的异常0xE0434352 "的错误。
在接口DLL的所有函数中,我们应该使用try catch,捕获 "未处理的异常 "并将其写入日志。
捕捉所有的异常,并尝试所有的调用,这是一个好主意。甚至在MQL文档中也清楚地写着--DLL不应该抛出异常,而不是C++。
特别是在文章中,conn.Close 和new SqlConnection 不属于 "异常捕捉",有可能抛出异常。
该截图在市场上没有加载。我用两个浏览器试了一下。
我也是...
你试过简单地拖放图片吗?
关于交易、自动交易系统和策略测试的论坛
市场和数学
Alexey Viktorov, 2021.08.19 21:01
试着用简单的拖放方式在文本上插入图片。
我现在试图在隐藏的专家顾问中进行修改,并拖动了我看到的第一张图片。
你试过简单地拖放图片吗?
5张图片中只有一张被添加
mql字符串真的不喜欢字符串中的空字符,也不喜欢字面意义上的空字符,在函数中也是如此。
唯一正常的方法是将三个字符串转换为一个带终结零的数组。
也就是说,现在的这种行为是几年前故意 为之的。我不知道原因是什么。到处都有敌人
在所有的接口DLL函数中,用try catch包住一切,捕捉 "未处理的异常 "并记录下来。
捕捉所有的异常,并将所有对pluses的调用包裹在try中,是一个好主意。甚至在MQL文档中也清楚地写着--DLL不应该抛出异常,而不是C++。
特别是conn.Close 和new SqlConnection 没有抛出异常,有可能会抛出一个
谢谢!检查了一下,共享变量访问错误。作者也写到了这一点。
必须指出的是,该演示项目有一个非常重要的限制:它只允许在一个MetaTrader终端上运行一个使用DB的专家顾问。问题是,所有的EA都使用一个加载的DLL的实例。由于我们的类是静态的,它对所有运行中的专家顾问都是一样的。变量也将是常见的。如果你运行几个专家,他们都将使用同一个连接和一个命令对象。 如果几个专家试图同时访问这些对象,可能会出现问题。
问:如何实现对dll的多线程访问(每个函数调用都有独立的实例,每个调用都有本地变量)?
我在MT5测试器中遇到了这个问题。
与多种货币一起工作,数据偶尔会从另一种货币中调换出来。检查测试器。请纠正它。
第一个值是SymbolInfoDouble(symbol,SYMBOL_BID)。
就像它不能接收价格一样SymbolInfoDouble(EURGBP,SYMBOL_BID);并从另一个正在工作的货币对中取值。有什么方法可以检查报价是否正确?
谢谢你!检查了一下,共享变量访问错误。作者也写到了这一点
应该注意的是,该演示项目有一个非常重要的限制:它只允许在一个MetaTrader终端上运行一个与DB合作的专家顾问。问题是,所有的EA都使用一个加载的DLL的实例。由于我们的类是静态的,它对所有运行中的专家顾问都是一样的。变量也将是常见的。如果你运行几个专家,他们都将使用同一个连接和一个命令对象。 如果几个专家试图同时访问这些对象,可能会出现问题。
问:如何实现对dll的多线程访问(每个函数调用都有独立的实例,每个调用都有本地变量)?
在.NET中几乎没有办法做到这一点。这个类被做成静态的,并不是因为文章的作者是邪恶的,而是因为尖锐的类就是这样被导入的。
我认为有两种方法:1)(编写时间长,工作速度快)用C++重写,不再碰.NET 2)(相当机械,但速度会下降,而且可能有副作用)深思熟虑地将调用包在关键部分,以避免两个线程同时访问。
如果sharping很重要,另一个选择是在DLL级别重写连接池控制,记住EA<->connection_id的映射,每个EA都与它的连接一起工作;
,我不能说.net - 是否有可能在一些MQL结构或标量中获取和存储sharp对象的引用,并来回传递它。也就是像普通的C++指针一样操作。如果有可能,那么一切都会简化。