文章 "自己动手开发多线程异步 MQL5 WebRequest" - 页 3 1234567 新评论 Реter Konow 2018.11.12 12:14 #21 Stanislav Korotky:WebRequest 在指标中不起作用(该库允许您绕过这一限制)。MT 中的一个单独线程只分配给专家和脚本,但脚本不能与事件一起工作。我明白了,谢谢。我还不知道。 fxsaber 2018.11.12 15:44 #22 Stanislav Korotky:在 MT4 1146 中,资源功能齐全。这个想法可以安全地移植到第四个版本中。 Stanislav Korotky 2018.11.14 00:23 #23 fxsaber:是的,就是这个意思。但它只适用于 MT5。我已经实现了这个想法(使用图表对象)。 使用 iCustom-indicator 作为管理器,它将在其脚本中为每个 WebRequestAsync 启动 WebRequest。 这样的设计应该更简单、更可靠,因为不会出现额外的窗口。结果如下。 脚本无法运行,因为我无法在启动时向它们传递参数--看来脚本对图表模板一点也不友好。事实上,在 Expert.mqh 库的帮助下(虽然没有参数),脚本也能运行,这与智能交易系统(Expert Advisors)类似,似乎是个意外。 如果不是在脚本中,而是在智能交易系统中执行网络请求,该方案就会成功一半。也就是说,输入参数工作正常,我们可以将带有数据的资源名称传递给专家顾问。但由于某些原因,在图表对象中启动的智能交易系统只触发 OnInit 事件,而 OnTick 或 OnTimer 等事件则不会触发。在 OnInit 事件中执行网络请求不太好,但这是可能的。不过,所有这些逻辑都会大大降低运行速度,因为为每个请求打开一个图表对象 会造成大量开销。 fxsaber 2018.11.14 02:10 #24 Stanislav Korotky:实现了这一想法(使用图表对象)。结果如下。 脚本不起作用,因为我无法在启动脚本时为其传递参数--看来脚本对图表模板根本不友好。使用 Expert.mqh 库可以启动脚本(虽然不带参数),这与智能交易系统(Expert Advisors)类似,似乎是个意外。 我不得不研究一下这个问题。脚本通过模板在常规图表上运行,但无法设置输入参数。因此,PlaySound 方法肯定会起作用。 如果我们不在脚本中,而是在智能交易系统中执行网络查询,该方案就会半途而废。也就是说,输入参数可以正常工作,我们可以将带有数据的资源名称传递给智能交易系统。但由于某些原因,在图表对象中启动的智能交易系统只触发 OnInit 事件, 而 OnTick 或 OnTimer 等事件则不会触发。在 OnInit 事件中执行网络请求不太好,但这是可能的。不过,所有这些逻辑都会大大降低运行速度,因为每次请求都要打开一个图表对象,这将带来大量开销。对我来说,这一切都行不通。 Stanislav Korotky 2018.11.14 10:46 #25 fxsaber:我不得不研究这个主题。脚本由模板和常规图表运行,但无法设置输入参数。因此,PlaySound 方法肯定会起作用。对我来说没有任何效果。我在私人信息中发送的指令集 可以通过 Expert Advisor 中的 OnInit 运行。这可以从日志中看到。把你的日志发给我。 Stanislav Korotky 2018.11.14 14:20 #26 我现在发布的是启动网络请求的另一种变体--借助图表对象,其中应用 了带有专家助手的模板。它既可用于专家,也可用于指标。依赖关系与文章中的相同。实现方法的直接新文件: multiwebobjectworker.mqh - 包含常用类的头文件;multiwebobjectworker.mq5 - 在对象图形内执行网络查询的专家顾问;multiwebindicator.mq5 - 演示启动网络查询的无缓冲指标; 每次查询都会创建一个对象,并在其中创建一个专家顾问,查询结束后删除该对象。查询数据和结果通过资源交换,如文章所述。 从日志来看,这种机制并不能提供完全并行的查询执行,因为对象可能共享一个共同的事件队列。日志示例 2018.11.14 15:11:58.492 multiwebindicator (EURUSD,H1) 129912254742671348: Starting chart object WRS1 129912254742671349 2018.11.14 15:11:58.694 multiwebindicator (EURUSD,H1) 129912254742671348: Starting chart object WRS2 129912254742671350 2018.11.14 15:11:58.819 multiwebindicator (EURUSD,H1) 129912254742671348: Starting chart object WRS3 129912254742671351 2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1) 129912254742671349: OnInit 2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1) 129912254742671349: Reading request \Indicators\multiwebindicator.ex5::WRS_0_129912254742671348 2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1) 129912254742671349: Got 64 bytes in request 2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1) 129912254742671349: GET https://google.com/ User-Agent: n/a 5000 2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1) 129912254742671350: OnInit 2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1) 129912254742671350: Reading request \Indicators\multiwebindicator.ex5::WRS_1_129912254742671348 2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1) 129912254742671350: Got 60 bytes in request 2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1) 129912254742671350: GET https://ya.ru User-Agent: n/a 5000 2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1) 129912254742671351: OnInit 2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1) 129912254742671351: Reading request \Indicators\multiwebindicator.ex5::WRS_2_129912254742671348 2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1) 129912254742671351: Got 72 bytes in request 2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1) 129912254742671351: GET https://www.startpage.com/ User-Agent: n/a 5000 2018.11.14 15:11:59.162 multiwebobjectworker (EURUSD,H1) 129912254742671350: Done in 187 ms 2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1) 129912254742671348: Result code 200 2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1) 129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671350 2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1) 129912254742671348: Got 16592 bytes in response 2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1) GET https://ya.ru 2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1) Received 3734 bytes in header, 12775 bytes in document 2018.11.14 15:11:59.256 multiwebobjectworker (EURUSD,H1) 129912254742671350: OnDeinit 2018.11.14 15:11:59.272 multiwebobjectworker (EURUSD,H1) 129912254742671349: Done in 297 ms 2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1) 129912254742671348: Result code 200 2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1) 129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671349 2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1) 129912254742671348: Got 12688 bytes in response 2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1) GET https://google.com/. 2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1) Received 790 bytes in header, 11813 bytes in document 2018.11.14 15:11:59.350 multiwebobjectworker (EURUSD,H1) 129912254742671349: OnDeinit 2018.11.14 15:11:59.833 multiwebobjectworker (EURUSD,H1) 129912254742671351: Done in 749 ms 2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1) 129912254742671348: Result code 200 2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1) 129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671351 2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1) 129912254742671348: Got 45212 bytes in response 2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1) GET https://www.startpage.com/ 2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1) Received 822 bytes in header, 44307 bytes in document 2018.11.14 15:11:59.849 multiwebindicator (EURUSD,H1) > > > Async WebRequest workers finished 3 tasks in 1357 ms 2018.11.14 15:11:59.880 multiwebobjectworker (EURUSD,H1) 129912254742671351: OnDeinit 附加的文件: multiwebobject.zip 15 kb fxsaber 2018.12.09 00:52 #27 Stanislav Korotky:试试更新后的 Resource_Data.mqh,传输网页时的延迟现象应该会消失。 #include <fxsaber\TradeTransactions\ResourceData.mqh> //https://www.mql5.com/zh/code/22166 #define BENCH(A) \ { \ const ulong StartTime = GetMicrosecondCount(); \ A; \ Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \ } const RESOURCEDATA<uchar> Resource("::" + __FILE__); // 数据传输资源(字节) uchar BytesIn[]; const int Init = ArrayResize(BytesIn, 1000000); void TestResource() { uchar BytesOut[]; Resource = BytesIn; Print(Resource.Get(BytesOut)); } void OnStart() { BENCH(TestResource()); } 旧版本 1000000 Time[TestResource()] = 103746 新版本 1000000 Time[TestResource()] = 5222 Stanislav Korotky 2018.12.10 10:09 #28 fxsaber:试试更新后的 Resource_Data.mqh,传输网页时的延迟应该会消失。旧版本新版本加速 20 倍需要做些什么?与旧代码的兼容性保持不变,客户端调用无需更改? fxsaber 2018.12.10 10:24 #29 Stanislav Korotky:你需要做什么才能将速度提高 20 倍?与旧代码的兼容性保持不变,客户端调用无需更改?兼容性保持不变。 交易、自动交易系统和交易策略测试论坛。 库:TradeTransactions fxsaber, 2018.12.09 01:23 pm. 在库源中有一个Convert.mqh,可以快速将 一种类型的数组转换 为另一种类型的数组。TypeToBytes 在大型数组上运行缓慢(现在只在两种数组类型都不是对方的倍数时使用)。 TypeToBytes 不用于 uchar[]。 Mohammad Hossein Sadeghi 2019.01.10 21:27 #30 文章不错,谢谢。WinINet 异步模式如何? 1234567 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
WebRequest 在指标中不起作用(该库允许您绕过这一限制)。MT 中的一个单独线程只分配给专家和脚本,但脚本不能与事件一起工作。
我明白了,谢谢。我还不知道。
在 MT4 1146 中,资源功能齐全。这个想法可以安全地移植到第四个版本中。
是的,就是这个意思。但它只适用于 MT5。
我已经实现了这个想法(使用图表对象)。
使用 iCustom-indicator 作为管理器,它将在其脚本中为每个 WebRequestAsync 启动 WebRequest。
这样的设计应该更简单、更可靠,因为不会出现额外的窗口。
结果如下。
脚本无法运行,因为我无法在启动时向它们传递参数--看来脚本对图表模板一点也不友好。事实上,在 Expert.mqh 库的帮助下(虽然没有参数),脚本也能运行,这与智能交易系统(Expert Advisors)类似,似乎是个意外。
如果不是在脚本中,而是在智能交易系统中执行网络请求,该方案就会成功一半。也就是说,输入参数工作正常,我们可以将带有数据的资源名称传递给专家顾问。但由于某些原因,在图表对象中启动的智能交易系统只触发 OnInit 事件,而 OnTick 或 OnTimer 等事件则不会触发。在 OnInit 事件中执行网络请求不太好,但这是可能的。不过,所有这些逻辑都会大大降低运行速度,因为为每个请求打开一个图表对象 会造成大量开销。
实现了这一想法(使用图表对象)。
结果如下。
脚本不起作用,因为我无法在启动脚本时为其传递参数--看来脚本对图表模板根本不友好。使用 Expert.mqh 库可以启动脚本(虽然不带参数),这与智能交易系统(Expert Advisors)类似,似乎是个意外。
我不得不研究一下这个问题。脚本通过模板在常规图表上运行,但无法设置输入参数。因此,PlaySound 方法肯定会起作用。
如果我们不在脚本中,而是在智能交易系统中执行网络查询,该方案就会半途而废。也就是说,输入参数可以正常工作,我们可以将带有数据的资源名称传递给智能交易系统。但由于某些原因,在图表对象中启动的智能交易系统只触发 OnInit 事件, 而 OnTick 或 OnTimer 等事件则不会触发。在 OnInit 事件中执行网络请求不太好,但这是可能的。不过,所有这些逻辑都会大大降低运行速度,因为每次请求都要打开一个图表对象,这将带来大量开销。
对我来说,这一切都行不通。
我不得不研究这个主题。脚本由模板和常规图表运行,但无法设置输入参数。因此,PlaySound 方法肯定会起作用。
对我来说没有任何效果。
我在私人信息中发送的指令集 可以通过 Expert Advisor 中的 OnInit 运行。这可以从日志中看到。把你的日志发给我。
我现在发布的是启动网络请求的另一种变体--借助图表对象,其中应用 了带有专家助手的模板。它既可用于专家,也可用于指标。依赖关系与文章中的相同。实现方法的直接新文件:
每次查询都会创建一个对象,并在其中创建一个专家顾问,查询结束后删除该对象。查询数据和结果通过资源交换,如文章所述。
从日志来看,这种机制并不能提供完全并行的查询执行,因为对象可能共享一个共同的事件队列。日志示例
试试更新后的 Resource_Data.mqh,传输网页时的延迟现象应该会消失。
旧版本
新版本
试试更新后的 Resource_Data.mqh,传输网页时的延迟应该会消失。
旧版本
新版本
加速 20 倍需要做些什么?与旧代码的兼容性保持不变,客户端调用无需更改?
你需要做什么才能将速度提高 20 倍?与旧代码的兼容性保持不变,客户端调用无需更改?
兼容性保持不变。
交易、自动交易系统和交易策略测试论坛。
库:TradeTransactions
fxsaber, 2018.12.09 01:23 pm.
在库源中有一个Convert.mqh,可以快速将 一种类型的数组转换 为另一种类型的数组。
TypeToBytes 在大型数组上运行缓慢(现在只在两种数组类型都不是对方的倍数时使用)。
TypeToBytes 不用于 uchar[]。