mql5语言的特点、微妙之处以及技巧 - 页 102

 
阿列克谢-纳沃伊科夫

你走得太远了 ) 首先,它经过了消息队列。第二,你必须做一些额外的转换(来回)。另外,还有一些验证工作正在进行。

顺便说一下,你不应该明确指定结构的大小。有sizeof为它服务。

  • 你在那里看到了一个信息队列?
  • 没有往返的转换。与@fxsaber 的例子中使用的联盟相同
  • 也没有验证。
  • 当然,你可以使用sizeof(...),但由于这是一个具体任务的实现,而不是一个普遍的任务,我干脆把它写短为3位数。

也许你看了一些其他的代码。

HH我不喜欢我的版本的唯一一点是:我不得不把行的大小增加一倍以绕过零,因为零被认为是行的末端。我从骨子里觉得有一个更简单的解决方案,但还没有找到。但它仍然工作得更快。

 
尼古拉-森科

  • 你在哪里看到了一个消息队列?

SetWindowText/GetWindowText 不通过消息发送?


没有往返的转换。

当然是这样。大惊小怪的是什么呢?

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
阿列克谢-纳沃伊科夫

SetWindowText/GetWindowText 不通过消息发送?

而你说的是Windows信息......那又怎样?有没有一种更快的方法可以在windos中的不同程序之间交换数据,而不需要自制的dll?

我明白你被我的话冒犯了,我的变体是快速的。嗯,首先,我没有断言,我只是建议。其次,我用测试代码来 支持我的假设,将其与Memory Mapping 进行比较。
如果你试图反驳哪怕是假设,请不要把你的反驳仅仅建立在陈述性的声明上。如果你能劝阻我,并指出在没有任何自写的dll的情况下,终端之间的数据交换的更快实现,我将非常感激。

我不排除通过RAM磁盘的变体会快很多。但这是一个稍微不同的话题,因为它需要安装RAM磁盘及其配置。

阿列克谢-纳沃伊科夫

当然了。但这是什么与手鼓的舞蹈。

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];

手鼓的作用就这么大了。这是一种平庸的做法。顺便说一下,这种琐碎的工作是在50-60纳秒内完成的,而所有剔号结构的接收块是在90微秒(90 000纳秒)内完成的,也就是说,这些 "钻石 "只占用了数据块接收时间的0.06%。此外,我写道,这一点只有在考虑到记忆翻倍的情况下才会让我感到困惑。

因此,我的变体对于小数据结构的交换来说似乎非常方便、简单和智能

 
尼古拉-森科

  • 我对我的版本唯一不满意的地方是:我不得不把行的大小增加一倍,以绕过零,因为零被认为是行的末端。我从骨子里觉得有一个更简单的解决方案,但我没有找到。但无论如何,它的工作速度更快。

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

图书馆:HistoryTicks

Automated-Trading, 2018.03.29 11:09

  • 在源文件(Data_String.mqh 文件)中有一些跨平台的函数,允许你把任何数据放到/提取到一个字符串中。例如,它允许使用用户事件的 字符串参数(sparam)在任何MQL-程序之间轻松交换任何数据。
#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    const string Str = DATA_STRING::ToString(Tick);
    
    MqlTick Ticks[1];
    
    Ticks[0] = DATA_STRING::FromString<MqlTick>(Str);
    ArrayPrint(Ticks);
  }
}
 
fxsaber:

哇!
,我甚至不知道CryptEncode和CryptDecode 这样的函数。谢谢你!
我会看一看的。
但是,虽然乍一看这一切似乎是高科技,但却慢得惊人,因为CryptEncode函数的运行速度比这里被命名为手鼓的东西要慢两个数量级(微秒与几十纳秒)。

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
尼古拉-森科

我认为你因我说我的版本很快而被冒犯了。嗯,首先,我没有断言,我只是做了一个假设。其次,我用测试代码来 支持我的假设,将其与Memory Mapping 进行比较。

我的意思不是关于 "快速",而是关于"它可能比所有现有的解决方案更快",所以我已经说了几句话,没有任何攻击。 而且这些话是相当公平的。 但是你,出于某种原因,首先坚持否认("也许你一定看了一些其他的代码"),然后进入 "那又怎样!"的话题。因此,让我们把苍蝇和肉片分开

第二,关于MemoryMapping(更准确的说是它的MQL-wrapper),我从来没有说过它有多快 此外,在这个项目的讨论主题中 我已经指出了作者造成滞后的错误以及如何修复它们。因此,如果你要测试某个东西,就以它的原生形式 来测试,而不是以别人的错误决定的形式。

 
尼古拉-森科

ZZY但虽然乍一看都是高科技,但却慢得惊人,因为CryptEncode函数比这里所谓的手鼓慢了两个数量级(微秒与几十纳秒)。

速度是为了什么?

 
阿列克谢-纳沃伊科夫

我不是在谈论 "快速",而是在谈论"它可能比所有现有的解决方案更快",所以我做了一些评论,没有任何攻击。 而这些评论是相当公平的。 只是你先固执地否认了一些原因("也许你看了一些其他的代码"),然后你进入了 "那又怎样!"的状态。因此,让我们把苍蝇和肉片分开。

首先, 我的帖子是在你引用你的测试代码之前写的。 其次,关于MemoryMapping(更确切地说,是提到的MQL-wrapper),我从未声称它工作得很快 此外,在这个项目的讨论主题中 我已经指出了作者造成滞后的错误以及如何修复它们。因此,如果你要测试什么,就以原生的形式 测试,而不是某人的错误决定。

好的。同意。那太吵了。

我只是想说,可能使用user32.dll而不是kernel32.dll在通过WinAPI连接两个终端时可能会更快,因为我遇到的所有实现都使用kernel32.dll。

 
fxsaber:

速度是为了什么?

对不起,我没有理解这个问题。
你要问的是--为什么你需要终端之间的 桥接速度?

 
尼古拉-森科

对不起,我没有理解这个问题。
你在问--为什么你需要终端之间的桥梁数据交换速度?

是的。

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

mql5语言的特殊性,技巧和窍门

Nikolai Semko, 2018.09.21 13:20

但到目前为止,乍一看,这一切当然是高科技,但却慢得离谱,因为CryptEncode函数的执行速度比这里所说的手鼓慢两个数量级(微秒与几十纳秒)。