您现在的位置是:主页 > MT4交易平台 >
如果一个EA交易要实时处理新的分时2025/1/1外盘交
2025-01-01 15:30MT4交易平台 人已围观
简介如果一个EA交易要实时处理新的分时2025/1/1外盘交易平台 为了简化开荒,创筑一个 multiweb.mqh 头文献,咱们正在此中声明一切的类: 它们中的少少对客户端和 供职器 都是通用的, 而其它少...
如果一个EA交易要实时处理新的分时2025/1/1外盘交易平台为了简化开荒,创筑一个 multiweb.mqh 头文献,咱们正在此中声明一切的类: 它们中的少少对客户端和 供职器 都是通用的, 而其它少少是经受的而区别针对这些脚色。
让咱们从生存资源、ID和每个元素变量的类开首。从它派生出的类的实例将能够用正在管制器、助手和客户中。正在客户和助手中,如许的对象厉重是用于生存“通过贯串转达的“资源,此外,要留神的是正在客户端中要创筑几个实例来同时推行众个web哀告。是以,认识现时哀告的状况 (起码是如许的对象是繁冗如故空闲) 该当正在客户中广大被操纵。正在管制器中,这些对象是用于达成助手状况的识别和跟踪的。下面便是基类。
您应当显露,正在MetaTrader中,每个EA交往都运转正在独立的图外中。因此,创筑辅助EA交往也须要它们的图外,人工来做很不简单,是以,把一切的旧例操作放到一个特定的管制器中就很合理了 - 一个管制辅助图外和EA池的EA交往,而且它供应了一个入口点用于注册来自客户圭臬的新哀告。正在某种水准上,这种架构能够被称为三层架构,与客户端-供职器架构雷同,此中EA管制器行动供职器:
管制器会创筑所央求数目的辅助窗口 (能够正在筑立中设定) 并正在它们中运转它本身的实例,它们能够通过独特的“同意”觉察它们自身是助手状况 (正在达成局限有仔细先容)。
任何助手正在闭塞时城市通过特定事情来知照管制器,这对管制器保卫相干可用的助手列外是必要的。雷同地,管制器闭塞时也能够知照助手,然后,助手就会中断管事并闭塞它们的窗口。助手脱离管制器是无法管事的,而从新运转管制器会不行避免地从新创筑助手 (比方,假设您正在筑立中删改了助手的数目)。
2.管制器正在池中寻找未被占用的助手EA并向其发送资源的贯串;这个实例就会姑且符号为被占用而正在随后的哀告中不行被拣选,直到现时哀告被照料完毕;
3.当辅助EA收受到自界说事情的光阴,来自客户的web哀告参数就从外部资源中解开,
4.辅助EA再移用尺度的阻碍式 WebRequest 并恭候答复(头部以及/或者web文档);
比方,假设一个EA交往要及时照料新的分时,也要间断查抄一个或者众个网站上的经济音信,就不恐怕达成这两个需求而使它们不相互影响。一朝 WebRequest 正在代码中推行,EA 交往就会正在函数移用序列中依旧“冻结”状况,而新的分时事情就会跳过。就算能够操纵 CopyTicks 函数恐怕能够读取到跳过的分时,而做出交往决定的机会一经错过了。这里是操纵UML顺次图外来分析的这种状况:
5.辅助EA再把哀告的结果打包到当地资源中,并向管制器发送包罗这个贯串的自界说事情;
正在第5步和第6步结果恶果能够进一步进步,由于辅助EA能够直接向客户窗口发送结果而绕过管制器。
前面五个参数是输入参数,它们是从移用代码转达到中枢的,界说了哀告的实质。后面两个参数是输出参数,它们是从中枢转达到移用代码,包罗了查问的结果。很明白,把这个函数造成两个异步函数现实上要把它分成两个组件:初始化查问和赢得结果:
咱们不须要存眷这些辅助类的内部布局,厉重的事宜便是咱们能够把做好的 RESOURCEDATA 类作为 “黑盒”,再操纵它的构制函数和咱们须要的少少门径,晚些光阴咱们将仔细考虑。现正在,让咱们看看完全的观点。
1.为了实行异步的 web 哀告,客户 MQL 圭臬该当操纵咱们开荒的类来把哀告的参数封装到当地资源中,并向管制器操纵资源的贯串发送一个自界说事情,资源是正在客户圭臬中创筑的,直到赢得结果之前都不会被删除(当不须要时删除);
那么正在客户端、管制器和助手之间毕竟是若何转达新闻的呢?为清晰解这个,让咱们认识 WebRequest 函数,
您要显露,MetaTrader 5 含有两种 WebRequest 函数的选项,咱们将商榷讨操纵第二种,它是最通用的。
上面所描摹的步伐与照料HTTP哀告的厉重阶段相闭,现正在,是光阴说一下怎样把分散的局限贯串成一个完全架构了,它也是局限依赖于用户事情。
架构的核心贯串 — 管制器 — 是人工运转的,您该当只消做一次。和任何其它运转的EA雷同,正在终端从新启动时它会与图外一齐主动复原,终端中只许诺有一个 web 哀告管制器。
助手的窗口,和辅助EA本身雷同,老是由管制器主动创筑的,是以咱们的圭臬该当“拔除它们”。不要人工运转助手EA - 输入参数与管制器状况错误应的话会被圭臬当成舛错。
正在它载入的光阴,客户 MQL 圭臬该当侦测终端窗口监视理器是否存正在,它是把它的图外ID行动参数然后操纵动静来探查的。管制器 (假设被觉察) 该当把它的窗口ID返回给客户,之后,客户和管制器就能相易动静了。
函数的名称和原型是由要求的,现实上,咱们须要正在差异的MQL圭臬之间转达这个新闻,通俗的函数移用对此并不适合。为了使 MQL 圭臬互相之间不妨“联络”,MetaTrader 5 有咱们将要操纵的 自界说事情相易编制。事情的相易是依照收受者ID 实行的,操纵的是 ChartID — 它对每个图外都是独一的。一张图外上只许诺有一个EA交往,然则目标的话操纵起来没有束缚。这意味着用户该当确保每个图外中与管制器通讯的目标不行越过一个。
然则为了简化,管制器和辅助EA能够操纵不异的代码样式来达成 (圭臬)。如许一个 通用 EA 的两种脚色之一 - 管制器或是助手 - 将会由优先级准则来判定。第一个运转的实例会把它自身声明为一个管制器,它能够掀开此外的图外并以助手的脚色运转肯定数目的本身。
交往算法的达成每每须要认识来自种种外部起原、征求互联网的数据,MQL5 供应了 WebRequest 函数来发送 HTTP 哀告到 外部天下, 然而不幸的是,它有一个明白的毛病。这个函数是同步的,也便是说它会正在推行哀告的全面阶段禁绝 EA 的运转。对待每个 EA, MetaTrader 5 都为它们分拨了一个稀少的线程,正在代码中推行已有的 API(操纵圭臬接口) 函数,以及推行到来的事情照料函数 (比方分时,墟市深度蜕变的事情,计时器,交往操作,图外事情等等)。一次只推行一个代码片断,而一切残剩的“使命”都列队等待,直到现时片断把把持权还给内核。
所供应的链接指向的源代码 — TradeTransactions 开荒库与现时著作的要旨没相闭系,然则正在辩论 (俄语) 中包罗了一个通过操纵资源来作数据存储和相易的例子。由于开荒库能够删改,此外为了简单读者操纵,一切本文操纵的文献都不才面的附件中,然则它们的版本只是对应着写这篇著作的时期,恐怕与以上链接中确当前版本不雷同。此外,所说的资源类正在它们的管事中还操纵了另一个开荒库 — TypeToBytes,它的版本也附加正在本文之后了。
正在这一点上,最好能创筑一个器械用于 HTTP 哀告的异步推行,相当于一种 WebRequestAsync,很明白,咱们须要为此操纵特殊的线程。正在 MetaTrader 5 中如许做的最简易门径便是运转此外的EA,然后您能够正在此中发送此外的 HTTP 哀告。此外, 您能够正在那里移用 WebRequest 并随后赢得结果,当哀告正在如许的辅助EA交往中照料的光阴,咱们的主EA交往如故能够用于急速和交互的操作。对待这种状况,UML 顺次图外恐怕看起来是如许的:
为了使数据相易可行,您须要把一切的“函数”参数都封装到用户事情参数中。哀告参数和结果都包罗了斗劲洪量的新闻,而无法容纳正在事情有限的空间中,比方,就算要把 HTTP 门径和URL放到字符串类型的事情参数中,63个字符的束缚正在群众半现实状况下都有贫乏。这就意味着事情相易编制须要有少少共享数据的存放空间,而只正在事情参数中发送这个存放空间的链接。侥幸的是,MetaTrader 5 以自界说资源的体式供应了如许的存储。现实上,从MQL中动态创筑的资源都是图片,然则图片能够行动二进制新闻的容器,咱们能够正在内中记实咱们思要的任何实质。
广告位 |