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

 

新文章 自己动手开发多线程异步 MQL5 WebRequest已发布:

本文介绍了一个可以在 MQL5 中提高 HTTP 请求操作效率的开发库。它在另外的线程中实现 WebRequest 在非阻塞模式下的执行,并且可以用于辅助图表和EA交易,交换自定义事件以及读取共享资源。也提供了源代码。

交易算法的实现经常需要分析来自各种外部来源、包括互联网的数据,MQL5 提供了 WebRequest 函数来发送 HTTP 请求到 "外部世界", 然而不幸的是,它有一个明显的缺点。这个函数是同步的,也就是说它会在执行请求的整个阶段阻止 EA 的运行。对于每个 EA, MetaTrader 5 都为它们分配了一个单独的线程,在代码中执行已有的 API(应用程序接口) 函数,以及执行到来的事件处理函数 (例如分时,市场深度变化的事件,计时器,交易操作,图表事件等等)。一次只执行一个代码片段,而所有剩余的“任务”都排队等候,直到当前片段把控制权还给内核。

例如,如果一个EA交易要实时处理新的分时,也要间断检查一个或者多个网站上的经济新闻,就不可能实现这两个需求而使它们不互相影响。一旦 WebRequest 在代码中执行,EA 交易就会在函数调用序列中保持“冻结”状态,而新的分时事件就会跳过。就算可以使用 CopyTicks 函数可能可以读取到跳过的分时,而做出交易决策的时机已经错过了。这里是使用UML顺序图表来阐述的这种情况:

事件处理序列图是在一个线程中的阻塞式代码

图1. 事件处理序列图是在一个线程中的阻塞式代码

作者:Stanislav Korotky

 

一如既往的强大!如果能将该库通用化,就能创建一个现成的工具包,轻松创建任何函数的异步。同时还能实现跨平台。

例如,这种方法可用于为 MT4 创建OrderSendAsync

感谢您的文章!

 
fxsaber:

一如既往的强大!如果能将该库通用化,就能创建一个现成的工具包,轻松创建任何函数的异步。同时还能实现跨平台。

例如,使用这种方法,您可以为 MT4 创建 OrderSendAsync。

是的,很久以前我就开始为 MT4 创建一个带有消息插件命令的组订单管理系统,但没有完成。我还没有检查过 MT4 中的资源是如何工作的,不过从文档来看应该与 MT5 相同。

 
Stanislav Korotky:

我还没有检查过 MT4 中资源是如何工作的,不过根据文档,它应该与 MT5 相同。

是的,一切都与 MT5 相同。只是在当前的 MT4 版本中存在一个错误,导致无法进行交换

关于交易、自动交易系统和测试交易策略的论坛

错误、错误、问题

fxsaber, 2018.09.17 18:38

MT4 中的ResourceReadImage 存在无法读取资源的错误
#property strict

class RESOURCE
{
public:
  const string Name;

  RESOURCE( const string sName = __FILE__ ) : Name("::" + sName )
  {
  }

  ~RESOURCE( void)
  {
    ::ResourceFree(this.Name);
  }

  virtual bool Set( const uint &Data[], const uint Width = 1, const ENUM_COLOR_FORMAT ColorFormat = COLOR_FORMAT_XRGB_NOALPHA ) const
  {
    return(::ResourceCreate(this.Name, Data, Width, (Width == 0) ? ::ArraySize(Data) : ::ArraySize(Data) / Width, 0, 0, Width, ColorFormat));
  }

  int Get( uint &Data[] ) const
  {
    uint Width;
    uint Height;

    return(::ResourceReadImage(this.Name, Data, Width, Height) ? ::ArraySize(Data) : 0);
  }
};

void OnStart()
{
  RESOURCE Resource;
  
  uint DataIn[] = {0};  
  Resource.Set(DataIn);
   
  uint DataOut[];
  Resource.Get(DataOut);
  
  Print(DataOut[0]); // MT5x64(1881 版)- 0,MT4(1126 版)- 4278190100(随机值)
}


ResourceSave 写入正确,但 ResourceReadImage 是一个大错误。有可能修复吗?我还没有在 MT5x32.... 中检查过。


也许 此方法 有助于在 MT4 中正确读取资源。我还没有测试过。

 

顺便说一下,你可以不用完整的图表 - OBJ_CHART。脚本可以加载在图表上。WebRequest 和 OrderSend 也在其中工作。

我举例说明了如何在没有额外图表的情况下进行指标交易。

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

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

 
fxsaber:

顺便说一下,你可以不用完整的图表 - OBJ_CHART。脚本可以加载在图表上。WebRequest 和 OrderSend 也可以在上面运行。

我举例说明了如何在没有额外图表的情况下进行指标交易。

因此,您可以使用 iCustom-indicator 作为管理器,它将在其脚本中为每个 WebRequestAsync 运行 WebRequestAsync。

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

您能链接到这个示例吗?

 
Maxim Kuznetsov:

能给我这个例子的链接吗?

这里这里


ZY 如果市场指标开始交易,用户可能会大吃一惊....。

 
fxsaber:

这里这里


ZY 如果 Market-indicator 开始交易,用户可能会大吃一惊...

哎呀,我还以为只是事件转移.... :-)

 
Maxim Kuznetsov:

妈的,我还以为只是个活动.... :-)

没有什么活动。

 
fxsaber:

没有事件。

执行命令的是脚本。

至于如何获得指令,那是另一回事。

 
Maxim Kuznetsov:

脚本就会执行命令。

至于如何接收订单则是另一回事。

脚本并不接收订单,而是由任意数量的指标触发。