错误、漏洞、问题 - 页 2723

 
Aleksey Mavrin:

你能告诉我出了什么问题,如何加快图表的更新速度?C hartRedraw函数是由专家顾问调用的,但仍有几分钟的延迟。

ChartRedraw只需要用于绘制(更新)图形对象,对于通过指标缓冲区 绘制的普通指标,我们不需要ChartRedraw。

我认为你应该寻找指标中的问题,也许每一个刻度的缓冲区计算是不正确的,有的 "作者 "每一个刻度都计算整个历史。

ZZY:我不能确认,但也许ChartRedraw用同步的历史记录更新整个图表,如果是这样,你实际上每次都要重新启动指标,对整个历史记录进行全面计算。

UPD:尝试将图表上的历史记录限制在较少的条数上,10 000条就足够了,在MT4中曾出现过这样的情况:一个重的指标 "吞噬 "了所有的内存,然后寻找EA不能正常工作的原因(它工作后又不工作了)。尽管在MT5中,所有的内存都被使用的可能性不大,....,但这种情况还是发生了。

 
Igor Makanu:

ChartRedraw仅在绘制(更新)图形对象时需要,对于通过指标缓冲区 绘制的普通指标,你不需要ChartRedraw。

我认为你应该寻找指标中的问题,也许每一个刻度的缓冲区计算是不正确的,有的 "作者 "每一个刻度都计算整个历史。

ZZY:我不能确认,但也许ChartRedraw用同步的历史记录更新整个图表,如果是这样,那么每次你重启指标时都会对整个历史记录进行全面计算

UPD:尝试将图表上的历史记录限制在较少的条数上,10 000条就足够了,在MT4中曾出现过这样的情况:一个重的指标 "吞噬 "了所有的内存,然后寻找EA不能正常工作的原因(它工作后又不工作了)。虽然在MT5中,所有的内存都被使用的可能性不大,....,但也可能发生。

我已经试图优化计算,并测试了以前版本的指标。我以前每1000个柱子就计算一次,现在我在等待新的柱子打开。

如果这就是原因,我应该还是很惊讶的。1千条不是很强的计算会使图表绘制速度减慢2分钟?

 
Aleksey Mavrin:

如果是这个原因,还是值得大吃一惊的。1条不是很强的计算,会使图表绘制速度减慢2分钟?

在我看来,这是不可能的,终端会卸载这样的指标,并发出 "xxx指标的计算 时间太长 "的信息。

MT的运行时间(4/5)非常快,当然你可以多次计算相同的数据,但我认为,你必须努力尝试。

我认为该指标的作者不熟悉指标缓冲区的经济计算,忘记了正确计算最后的条数......去QB研究一下指标是怎么写的吧;)

 
Slava :

这两个程序是在同一个终端还是在两个不同的终端?

重现该问题的代码发布在这里。https://www.mql5.com/en/forum/332849

你需要至少运行2次代码来重现它。

File-Sharing ... my next "Sometimes-Bug" in MT5?
File-Sharing ... my next "Sometimes-Bug" in MT5?
  • 2020.02.16
  • www.mql5.com
FILE_SHARE_READ and FILE_SHARE_WRITE do not work proper. MQL creates buffers with different contents for the same file. Please watch the example...
 
Alexey Navoykov:

完全没有必要。为什么是C,C#怎么样?- 从意义上讲,它更接近于C#。

可能是因为µl c++是类似的,结构是从c中来的。

所有关于被动结构的谈论都是过时的观念,我认为。

如果你需要构造函数,请使用类或去找夏普。我们为什么要剥夺结构的这种内涵呢?这只会使程序更具表现力。我可能会拿着某人的代码,看到他/她有一个结构而不是一个类,并从一个词中得到很多信息。你将一无所获,你将勤奋地研究源代码以获得同样的结果,而我在一眨眼的功夫就得到了。在我的经验中--这种结构的惯例得到了尊重,好吧,也许是某种发条式的虚无主义的边缘化。

我相信,至少每个类型都应该有一个构造函数。未初始化的字段是邪恶的,应该避免。

在你看来,那里没有邪恶。Vaughn甚至拖入了标准:读取未初始化的unsigned char和std::byte不是未定义的行为。你可以为POD使用聚合初始化。而且不要忘记--所有这些初始化都不是免费的,它是真正的资源消耗(CPU、内存、可执行文件的大小)。如果你对你的数字计算机不屑一顾,在一些微控制器的情况下,它可能是重要的。毕竟,C/C++并不像夏普那样只是一个Windows的洗牌。

unsigned char fn() {unsigned char q; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1121:       83 c0 02                add    $0x2,%eax
    1124:       5 d                      pop    %rbp
    1125:       c3                      retq           

unsigned char fn2() {unsigned char q = 5; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn2>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       c6 45 ff 05             movb   $0x5,-0x1(%rbp)
    1121:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1125:       83 c0 02                add    $0x2,%eax
    1128:       5 d                      pop    %rbp
    1129:       c3                      retq
仅仅一个变量的初始化就使指令大小增加了30%。
 
Stanislav Korotky:

在一个终端。专家写数据,指标读数据。挂在不同的图表上,但显然可能是在同一个图表上(如果这很重要的话)。建2380。

读取该文件的专家顾问必须保持该文件的关闭。

在MQL5中实现文件的特殊性是,它们将来自文件的数据最大限度地保留在自己的缓冲区中。如果信息量大到无法容纳在缓冲区内,那么你把指针移到文件的开头,然后再移到文件的结尾的把戏就能奏效。

所以在这一点上,打开文件,检查内容,然后再次关闭它

 
Slava :

读取文件的专家顾问必须保持这个文件的关闭。

MQL5中文件实现的特殊性在于,它们尽可能地将来自文件的数据保存在自己的缓冲区中。如果信息量大到无法容纳在缓冲区内,那么你把指针移到文件的开头,然后再移到文件的结尾的技巧可能会奏效。

所以在这一点上,打开文件,检查内容,然后再次关闭它

所以,FileFlush()是无用的?
 
Alain Verleyen:
所以,FileFlush()是无用的?

不,如果你想让其他人能够读到修改过的文件,必须进行FileFlush

问题是,MQL5程序在打开文件时将其读入自己的缓冲区。它不会知道文件中的任何变化,直到它再次读取文件。只有通过关闭然后再打开文件才能再次读取该文件

 
Slava:
不,如果你想让其他人能够读到修改过的文件,必须进行FileFlush。

即使你关闭了文件

 
Andrey Barinov:

即使你关闭了文件

这正是我所说的。关闭,然后重新打开

或者你是指在关闭文件之前的FileFlush?