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:
妈的,我还以为只是个活动.... :-)
没有什么活动。
fxsaber:
没有事件。
执行命令的是脚本。
至于如何获得指令,那是另一回事。
Maxim Kuznetsov:
脚本就会执行命令。
至于如何接收订单则是另一回事。
脚本并不接收订单,而是由任意数量的指标触发。
新文章 自己动手开发多线程异步 MQL5 WebRequest已发布:
本文介绍了一个可以在 MQL5 中提高 HTTP 请求操作效率的开发库。它在另外的线程中实现 WebRequest 在非阻塞模式下的执行,并且可以用于辅助图表和EA交易,交换自定义事件以及读取共享资源。也提供了源代码。
交易算法的实现经常需要分析来自各种外部来源、包括互联网的数据,MQL5 提供了 WebRequest 函数来发送 HTTP 请求到 "外部世界", 然而不幸的是,它有一个明显的缺点。这个函数是同步的,也就是说它会在执行请求的整个阶段阻止 EA 的运行。对于每个 EA, MetaTrader 5 都为它们分配了一个单独的线程,在代码中执行已有的 API(应用程序接口) 函数,以及执行到来的事件处理函数 (例如分时,市场深度变化的事件,计时器,交易操作,图表事件等等)。一次只执行一个代码片段,而所有剩余的“任务”都排队等候,直到当前片段把控制权还给内核。
例如,如果一个EA交易要实时处理新的分时,也要间断检查一个或者多个网站上的经济新闻,就不可能实现这两个需求而使它们不互相影响。一旦 WebRequest 在代码中执行,EA 交易就会在函数调用序列中保持“冻结”状态,而新的分时事件就会跳过。就算可以使用 CopyTicks 函数可能可以读取到跳过的分时,而做出交易决策的时机已经错过了。这里是使用UML顺序图表来阐述的这种情况:
图1. 事件处理序列图是在一个线程中的阻塞式代码
作者:Stanislav Korotky