文章 "自己动手开发多线程异步 MQL5 WebRequest" - 页 3

 
Stanislav Korotky:

WebRequest 在指标中不起作用(该库允许您绕过这一限制)。MT 中的一个单独线程只分配给专家和脚本,但脚本不能与事件一起工作。

我明白了,谢谢。我还不知道。

 
Stanislav Korotky:

在 MT4 1146 中,资源功能齐全。这个想法可以安全地移植到第四个版本中。

 
fxsaber:

是的,就是这个意思。但它只适用于 MT5。

我已经实现了这个想法(使用图表对象)。

使用 iCustom-indicator 作为管理器,它将在其脚本中为每个 WebRequestAsync 启动 WebRequest。

这样的设计应该更简单、更可靠,因为不会出现额外的窗口。

结果如下。

脚本无法运行,因为我无法在启动时向它们传递参数--看来脚本对图表模板一点也不友好。事实上,在 Expert.mqh 库的帮助下(虽然没有参数),脚本也能运行,这与智能交易系统(Expert Advisors)类似,似乎是个意外。

如果不是在脚本中,而是在智能交易系统中执行网络请求,该方案就会成功一半。也就是说,输入参数工作正常,我们可以将带有数据的资源名称传递给专家顾问。但由于某些原因,在图表对象中启动的智能交易系统只触发 OnInit 事件,而 OnTick 或 OnTimer 等事件则不会触发。在 OnInit 事件中执行网络请求不太好,但这是可能的。不过,所有这些逻辑都会大大降低运行速度,因为为每个请求打开一个图表对象 会造成大量开销。

 
Stanislav Korotky:

实现了这一想法(使用图表对象)。

结果如下。

脚本不起作用,因为我无法在启动脚本时为其传递参数--看来脚本对图表模板根本不友好。使用 Expert.mqh 库可以启动脚本(虽然不带参数),这与智能交易系统(Expert Advisors)类似,似乎是个意外。

我不得不研究一下这个问题。脚本通过模板在常规图表上运行,但无法设置输入参数。因此,PlaySound 方法肯定会起作用。

如果我们不在脚本中,而是在智能交易系统中执行网络查询,该方案就会半途而废。也就是说,输入参数可以正常工作,我们可以将带有数据的资源名称传递给智能交易系统。但由于某些原因,在图表对象中启动的智能交易系统只触发 OnInit 事件, 而 OnTick 或 OnTimer 等事件则不会触发。在 OnInit 事件中执行网络请求不太好,但这是可能的。不过,所有这些逻辑都会大大降低运行速度,因为每次请求都要打开一个图表对象,这将带来大量开销。

对我来说,这一切都行不通。

 
fxsaber:

我不得不研究这个主题。脚本由模板和常规图表运行,但无法设置输入参数。因此,PlaySound 方法肯定会起作用。

对我来说没有任何效果。

在私人信息中发送的指令集 可以通过 Expert Advisor 中的 OnInit 运行。这可以从日志中看到。把你的日志发给我。

 

我现在发布的是启动网络请求的另一种变体--借助图表对象,其中应用 了带有专家助手的模板。它既可用于专家,也可用于指标。依赖关系与文章中的相同。实现方法的直接新文件:

  • 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
附加的文件:
 
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
 
fxsaber:

试试更新后的 Resource_Data.mqh,传输网页时的延迟应该会消失。

旧版本

新版本

加速 20 倍需要做些什么?与旧代码的兼容性保持不变,客户端调用无需更改?

 
Stanislav Korotky:

你需要做什么才能将速度提高 20 倍?与旧代码的兼容性保持不变,客户端调用无需更改?

兼容性保持不变。

交易、自动交易系统和交易策略测试论坛。

库:TradeTransactions

fxsaber, 2018.12.09 01:23 pm.

在库源中有一个Convert.mqh,可以快速将 一种类型的数组转换 为另一种类型的数组。

TypeToBytes 在大型数组上运行缓慢(现在只在两种数组类型都不是对方的倍数时使用)。

TypeToBytes 不用于 uchar[]。

 
文章不错,谢谢。WinINet 异步模式如何?