在图形模式下为MQL创建一个GUI。 - 页 12

 
Yuriy Asaulenko:
事实上,我不知道。外部程序和MT中的程序之间没有区别。能力是一样的,互动是一样的。
当然没有足够的colbacs,但MT也没有。
但一般来说,这是可能的。第二个EA和mutexes或短的计时器。这很有效,但没有必要。

你根本就没有解释什么。如何在sharpe面板中获得MT*的数据?

我一直在通过内存映射与定时轮询进行反馈。面板只给我发送了不同的设置和缓慢的计算结果。

 
Renat Fatkhullin:
无知给人以信心。但知识会使人悲伤。

你会介意什么时候。
- 一个外来的、巨大的虚拟机 进入你的进程
- 劫持你的摘录并认为自己是主人
- 占用大量内存并认为自己是主人
- 运行一堆有自己生命的线程。
- 垃圾收集器增长到最大,限制了你的进程。
- 所有通过包装器的调用。

为了gui的缘故,这绝对是矫枉过正。

好吧,那我就把面板分开,通过内存映射进行通信。我在2000年代末曾经通过管道来做,但不喜欢这样。

虽然直接连接了,但没有注意到任何恐怖。

 
Maxim Kuznetsov:

终端的COM接口将是很酷的,尽管迅速变得过时了。

只是似乎与现实时间不相符 :-(。

COM接口 ,可能将无法使用。

但请问为什么会过时呢?

它也正在迅速变得过时。

 
Koldun Zloy:

COM接口 ,可能将无法使用。

但请问为什么会过时呢?

它也正在迅速变得过时。

它已经被.net的通信接口所取代。

 
Alexey Volchanskiy:

它已经被.net的通信接口所取代。

而在COM中,仅GUID就价值不菲

MS仍然以每10个一美元的价格回购未使用的GUID。如果你有一些以前遗留下来的东西,你可以赚到一笔不错的利润

 
Alexey Volchanskiy:

而在COM中,仅GUID就有很大的价值

MS仍然以一美元十元的价格回购未使用的GUID。如果你有一些以前遗留下来的东西,你可以赚取一笔不错的利润

我身边有一些 :-) 我会让你把它们寄给MS。

066cd265-e2fe-468e-9492-4228e9759e38
8e1040ba-dc3e-4e2a-9208-e3ea8da9ad05
03dcd7cd-4b9b-4ff7-bff0-e0839a0f9d8b
d69f2c8c-de51-4557-8188-4ebb870da7da
a79a8cc6-f785-4268-bc4e-2deda0f1ecd0
f4f59f52-1da8-4f74-a71e-9aec1992674d
85608797-6015-456d-af64-ad7890120372
9289991a-e287-47fb-b595-6d719c1b7dbd
63d3b953-3229-4045-a82a-fc9e7795bb01
c75c4e0f-8320-42df-943c-9aada54b60eb

如果还有别的东西,我也许能找到。

 

同事们。我认为,关于哪种开发环境更好,哪种代码更快,这种争论毫无意义。这完全是一个品味问题,取决于要解决的任务。无论开发环境如何,我们仍然有外部应用程序和MetaTrader工具之间的互动问题。让我们考虑一个简单的例子。你在一个本地dll中实现了一个复杂的数学计算 的算法。你把所需的参数从MT工具传给这个库,然后开始计算,工具继续工作,直到计算完成。再说一遍,这个问题并不取决于开发环境!

我看到有几个选择。

1.从程序外部调用OnChartEvent方法的可能性,例如,使用PostMessage

2.添加到МТ工具的新方法,如Renat提供的:OnExternal,指定事件类型或一般传输的数据,即在这个方法中你可以返回数据

3.在winocket的MT工具中实施。这与第二点类似,但允许MT工具连接到一个特定的端口以监听数据。

如果第一项和第二项将允许在单一机器层面上的互动,第三项将提供具有网络通信的MT工具。

下面是一个例子:https://www.mql5.com/ru/articles/2599

但在这里你又有一个问题,即必须检查插座上的数据是否一直可用。

所以回调问题在所有情况下都存在,而且没有得到解决。

计时器监控不是一个解决方案,而是一个拐杖。是的,在没有其他选择的情况下,我们现在就是这样解决的。

如果开发者能在平台层面实现这些问题的解决方案,那么就没有必要访问终端的API了。毕竟,这不是因为美好的生活而要求的,而是因为MT和正在创建的应用程序之间没有全面的互动。我再说一遍:无论选择什么样的外部应用开发环境,这个问题都存在。

Работа с сокетами в MQL, или Как стать провайдером сигналов
Работа с сокетами в MQL, или Как стать провайдером сигналов
  • 2016.07.12
  • ---
  • www.mql5.com
Сокеты… Что вообще сейчас в нашем информационном мире может без них существовать? Впервые появившиеся в 1982 г. и практически не изменившиеся до настоящего времени, они исправно работают на нас каждую секунду. Это основа сети, нервные окончания нашей Matrix, в которой мы живем. Утром вы включили терминал MetaTrader, и он сразу создал сокеты и...
 

关于使用净库的可能性的信息 )))https://www.mql5.com/ru/forum/13388

这个话题在原则上是非常古老的。开发者自己曾经宣布可以毫无困难地与网库合作......从那时起,很多水已经流过,但问题仍然没有解决......

或者在这里,来自Renat本人的信息:https://www.mql5.com/ru/forum/3153/page2#comment_298866

https://www.mql5.com/ru/forum/3153/page2#comment_298892

Встроенная поддержка .NET библиотек
Встроенная поддержка .NET библиотек
  • 2013.08.12
  • www.mql5.com
NET библиотеках функции могут быть только static методами или методами экземпляров класса.
 
Алексей Барбашин:

同事们。我认为,关于哪种开发环境更好,哪种代码更快,这种争论毫无意义。这完全是一个品味问题,取决于要解决的任务。无论开发环境如何,我们仍然有外部应用程序和MetaTrader工具之间的互动问题。让我们考虑一个简单的例子。你在一个本地dll中实现了一个复杂的数学计算 的算法。你把所需的参数从MT工具传给这个库,然后开始计算,工具继续工作,直到计算完成。而且,这个问题也是独立于开发环境的!

我看到有几个选择。

1.从程序外部调用OnChartEvent方法的可能性,例如,使用PostMessage

2.添加到МТ工具的新方法,如Renat提供的:OnExternal,指定事件类型或一般传输的数据,即在这个方法中你可以返回数据

3.在winocket的MT工具中实施。这与第二点类似,但允许MT工具连接到一个特定的端口以监听数据。

如果第一项和第二项将允许在单一机器层面上的互动,第三项将提供具有网络通信的MT工具。

下面是一个例子:https://www.mql5.com/ru/articles/2599

但在这里你又有一个问题,就是必须检查插座上的数据是否一直可用。

所以回调问题在所有情况下都存在,而且没有得到解决。

计时器监控不是一个解决方案,而是一个拐杖。是的,在没有其他选择的情况下,我们现在就是这样解决的。

如果开发者能在平台层面实现这些问题的解决方案,那么就没有必要访问终端的API了。毕竟,这不是因为美好的生活而要求的,而是因为MT和正在创建的应用程序之间没有全面的互动。我再说一遍:无论选择什么样的外部应用开发环境,这个问题都存在。

我补充一下关于监控和轮询的问题,只是不是每个人都知道--为了避免每次轮询都让DLL崩溃,你可以用int[]来 "共享 "标志。在DLL中,所有对它们的访问都是作为__atomic__。
原则上这是可行的,而且在资源上是相当经济的,但你必须依赖这样一个事实,即在MQL方面,增量/减量也是原子性的,而且优化器不对值进行假设。



int flags[1]={0};     // когда DLL досчитает она инкрементит флаг
handle=InitDLL(flags); //
...
// опрос типично выглядит так:
while ( flags[0] )   // проверить один int это очень быстро
{
   flags[0]--;
   ReadDataFromDLL(handle);
}

为了使事情变得真正好,原子(volatile?)属性和一组适当的基元就足够了。在我看来,这比在系统中建立一个新的机制要容易,而且不会改变现有的DLL协议。

 
Maxim Kuznetsov:

我补充一下关于监控和轮询的问题,不是每个人都知道的--不要每次轮询都麻烦DLL,你可以创建int[]来 "共享 "标志。在DLL中,所有对它们的访问都是作为__atomic__。
原则上这是可行的,而且在资源上是相当经济的,但你必须依赖这样一个事实,即在MQL方面,增量/减量也是原子性的,而且优化器不对值进行假设。



int flags[1]={0};     // когда DLL досчитает она инкрементит флаг
handle=InitDLL(flags); //
...
// опрос типично выглядит так:
while ( flags[0] )   // проверить один int это очень быстро
{
   flags[0]--;
   ReadDataFromDLL(handle);
}

为了使事情变得真正好,原子(volatile?)属性和一组适当的基元就足够了。在我看来,这比在系统中建立一个新的机制要容易,而且不会改变现有的DLL协议。

马克西姆,这个解决方案如何更好?毕竟,为了检查一个标志的状态,它也需要在MQL中定期检查。因此,事实证明,无论在哪里,你都需要不断地监测一些东西的状态变化,以了解是时候拿起数据了。而这个片段可以存储在dll本身,并在那里进行检查--我就是这么做的。在你的例子中,有一个隐含的对dll的调用来返回标志的状态。