使用iClose/iOpen时间序列访问等工作时的MQL5错误。 - 页 4

 
Renat Fatkhullin:

直接在代码和工作上。

  1. 指标中的CopyXXX函数并不等待数据的完全同步下载,而是给出可用的内容。否则,指标就真的会变慢。

  2. 如果第一次没有同步所有的数据,那么后续工作似乎就有问题了。
    有必要改成 "我将仔细等待成功下载 "的温和模式。例如,OnCalculate没有被调用。

  3. 糟糕的是,具有最大负荷的全局初始化被放在OnInit中,在那里指标计数和等待的时间非常长。
    在这种情况下,这个符号的图表更新被阻止,许多其他参与者不得不等待,无法收到新鲜数据。该指标不应长期占用资源。最好是在OnCalculate中一步一步地拉伸长的初始化/符号初始化,一步一步地计数。

  4. 我曾让这个指标通过网络抽出约800MB的历史数据进行同步

  5. 该指标有512条画线,是明确分配的内存。这是很昂贵的。只用了100行。

  6. 代码的可读性很差

1.是的,这就是为什么我不得不多次暂停调用它们,或者多次手动重启指标,但即使这样也不一定有用,指标在一段时间后就停止计算了。

2.我承认目前的版本不是最优的;我尝试了不同的变体,包括文档中推荐的函数("组织对数据的访问 "一节);在最后一个版本中,我把它简化了一些,多次调用iBarShift函数可能也不是最优的,但另一方面,如果你拒绝它们,你需要创建一个特殊的函数来准备同步数据,我还不能写,这非常麻烦,而且没有标准函数,此外如果语言有一个标准功能来请求时间 n

3.OnInit只定义组合和分配缓冲区,OnInit中没有请求。 我尝试在后台打开所有M1工具的图表,以防止缓存消失,这似乎有帮助,当然在最大负载下,这一切都很糟糕,28个图表...对数据的第一个请求是在OpsCalculate中,我在循环中调用CopyClose,暂停(RequestData函数)以缓存数据,并收集所有工具的系列,然后调用(SetupIntervals,CalculateEquity和其他),我认为所有数据将准备好,所有调用iBarShift和iClose以及其他有用的函数将返回缓存的数据,但不知何故并不总是工作

4.这必须是800 mb的tick数据...?但我不知道我还能怎样用28种工具组成一堆投资组合,无论如何都应该要求它们,在MT4中没有任何问题(可能是因为在MT4中所有时间段都是单独存在的)。

5.事情是这样的,指标假设可能涉及很多组合,现在有一个预设的组合,有420条线+服务线(各种魔杖、通道等),理论上用户可能要求所有512条线,缓冲区的数量不能事先用#属性 indicators_buffers来限制,因为不知道用户会要求多少,在mt4中它在最大负荷时是滞后的,但可以使用

6.如有必要,我将对其进行评论。


P.S. 我想也许你下载了错误的版本,因为我第一次犯了一个错误,发布了另一个版本,然后纠正了附件。

P.P.S. 我想利用这个机会澄清一下合成图表的功能,这个功能会不会以某种方式被开发出来? 例如我不仅想做公式指数,还想模拟一组工具的买/卖头寸,现在这很难做到,因为我必须为点值和合约大小写一个繁琐的公式,而点值在历史上并没有变化...

 

Renat Fatkhullin:

该指标不应长期占用资源。最好是在OnCalculate中把长的初始化均匀地拉长到分步/字符初始化,通过分块计算。

这很清楚,为了不拖累终端的其他程序,但有一个矛盾:当计算投资组合的模型时,指标需要一次性的所有行的数据,因为投资组合的权益是由它们计算的,也就是说,没有准备好的数据,它不能计算任何东西,而投资组合需要一次性的所有组成部分,如果有几个投资组合,如果要做投资组合的比较或求和,那么它需要所有的投资组合,然后它就没有多少伸缩性--它不是一个滑动窗口,可以分部分计算,这里首先计算的是- 这就是为什么我提出了关于一个通用标准函数的问题,这个函数可以正确地准备一个同步数据 的数组进行计算。

 
Vladimir Karputov:

下载自

现在是18.10,一切正常。


我祝贺你,你很幸运,你没有合适的CPU、内存、操作系统或其他东西......但这并不意味着这个错误不是真的。

它是真实的,它不只是发生在我身上。

 
transcendreamer:

这是可以理解的,为了不拖累终端的其他程序,但有一个矛盾:在计算投资组合模型时,指标将需要所有行的数据,因为投资组合的权益是用它们来计算的,也就是说,没有准备好的数据,就不可能计算出任何东西,而投资组合需要所有的组成部分,如果有几个投资组合,如果有投资组合之间的比较或求和,那么对于几个投资组合,然后它不能伸展,因为它不是一个滑动窗口,可以分部分计算,这里首先进行了计算- 这就是为什么我提出了关于一个通用标准函数的问题,这个函数可以正确地准备一个同步数据的 数组进行计算。

这就是关键的缺陷。我有同样的问题。

计算和显示在mt4中即时生效,但在mt5中指标没有问题,而我需要获取价格的所有图表都是开放的。事实证明,我只能写简单的指标,比如单缓冲区的MAs(

 

肯定有一个bug在。

1) Server 2012 (build 9200) on Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memory: 3033 / 3839 Mb, Disk: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU 虚拟版本 (cpu64-rhel6), 内存: 1340 / 2047 Mb, 磁盘: 15 / 28 Gb, GMT+2


 
Stanislav Dray:

肯定有一个bug在。

1) Server 2012 (build 9200) on Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memory: 3033 / 3839 Mb, Disk: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU 虚拟版本 (cpu64-rhel6), 内存: 1340 / 2047 Mb, 磁盘: 15 / 28 Gb, GMT+2

我已经有了。

Windows 7 Service Pack 1 (build 7601) x64, IE 11, Intel Core i5-2400 @ 3.10GHz, Memory: 469 / 8182 Mb, Disk: 96 / 148 Gb, GMT+2

 
transcendreamer:

这是可以理解的,为了不拖累终端的其他程序,但有一个矛盾:在计算投资组合模型时,指标将需要所有行的数据,因为投资组合的权益是用它们来计算的,也就是说,没有准备好的数据,就不可能计算出任何东西,而投资组合需要所有的组成部分,如果有几个投资组合,如果有投资组合之间的比较或求和,那么对于几个投资组合,然后它不能伸展,因为它不是一个滑动窗口,可以分部分计算,这里首先进行了计算- 这就是为什么我提出了关于一个通用标准函数的问题,这个函数可以正确地准备一个同步数据的 数组进行计算。

你在写指标时应该清楚地认识到,你不会一下子得到所有东西。

在OnInit中,你应该通过单次调用CopyXXX来刺激加载所需仪器的历史记录,但你必须在OnCalculate中等待完全初始化。

你的初始化阶段似乎有一个错误--你不正确地等待数据和阻塞。

 
Renat Fatkhullin:

将代码用于工作。到目前为止还不错。

顺便说一下,没有身体的文件。

2小时后一切正常,计时器在评论中滴答作响,日期正确。
 
Vitaly Muzichenko:

这就是关键的缺陷。我有同样的问题。

在mt4中,计算和显示立即生效,但在mt5中,尽管你想获得价格的所有图表总是打开的,但指标却完全没有问题。事实证明,我只能写简单的指标,比如单缓冲区的MAs(

如果我在寻找一种不同的方式来获得你所需要的图表,我看不到一种普遍而舒适的方式。 我明白,一切都为了加快终端和其中的程序。

 
Vitaly Muzichenko:

这就是关键的缺陷。我有同样的问题。

在mt4中,计算和显示立即生效,但在mt5中,尽管所有你想接收价格的图表总是开放的,但指标却完全没有问题。事实证明,我只能写简单的指标,如单缓冲区的MAs(

我必须看一下代码。

在上面的代码中,显然有一堆逻辑和资源问题。