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

 
例如,鉴于开发者显然是专业人士,是架构和速度优化方面的专家,他们以正确的方式编写这样一个函数并将其纳入标准库 应该不是什么难事,对此,心怀感激的用户会非常感激。
 
Renat Fatkhullin:

想一想,当你的指标巨大缓慢地接收/铺设刻度线,为一个刻度线花费数百毫秒甚至数秒时,数据(越是这样越有保证)将在哪里出现。因此,在时间上没有足够的CPU来处理这些刻度线,这就转化为一个不断累积的赤字,并在图表历史中出现相应的停滞。

当你要求 "保证给予 "时,很可能是 "什么都不想知道,想继续按我的意愿写作,不想考虑性能和锁,只要给予 "的要求?


当你有数以百万计的条条框框可用时,想想你和其他人的指标的表现。一个写得不好的、昂贵的指标很容易使其符号的图表更新停滞。

首先测量OnCalculate的响应时间(微秒)。然后用1秒除以平均tick响应时间,得到指标的最大tick吞吐量,单位为每秒tick。

这让人立刻清醒过来。

让我们在建议的版本中只为指标的新型数据处理留下一个刻度(新条)。 那些喜欢对零条和零条中的圣杯进行多次重新计算的人应该享受现有版本。在OnInit中添加一个新函数--iOnCalculate--一个指向指标中TF函数/OnCalculate的句柄,就像iCustom一样,但它稍微接近,OnCalculate上的指标缓冲区 应该绑定到句柄iOnCalculate上。在像OnCalculate这样的指标函数中,只发送一个新的tick bar。对于终端来说,什么都不会改变,OnCalculate的基本逻辑将是相同的,指标的主体将被添加,例如OnMain。(现在所有的事情都是由指标完成的,作为资源附加到主指标上,并在新的条形图上被调用)。

 
transcendreamer:


你并不总是需要超级速度,可用性也很重要,现在写多货币指标 就像 "手定太阳",即使在MT4中也比较容易,因为你总是可以通过i-function得到它,即使很慢,但你可以得到它,但在MT5中,你可以有一些数据,也可以没有,你仍然需要自己制作特殊代码。

让我们跳过这些理论。

只要提交一个要复制的例子,我们就会看到你的案例周围有什么恐怖的东西。到目前为止,它看起来是完全无视性能,隐藏杀手弱智指标并试图投下阴影。

 
Renat Fatkhullin:

让我们跳过这些理论。

只要提供一个例子来重现,我们就会看到你的案子周围有什么恐怖的东西。到目前为止,它看起来完全无视性能,隐藏了杀手级的迟钝指标,并试图给它加上阴影。


附件中的例子,不是完成的代码,有些地方不完整,但可以运行,为了方便,我还附了一个模板。

我马上告诉你,我不是一个程序员,肯定代码不是最佳的,我是一个人道主义的经济学家,我在MT5中真的很痛苦,我在MT4中的痛苦更少。

我真的希望有一个简单可靠的函数,能够按照上面的描述建立一个同步数组https://www.mql5.com/ru/forum/289897/page2#comment_9363454。

我不是在抱怨,我不是要求写我的指标,我只是希望(顺便说一下,不仅仅是我)有一个漂亮的标准函数。


编辑:纠正了附件的内容

Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.
Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.
  • 2018.11.14
  • www.mql5.com
Общее обсуждение: Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.
附加的文件:
 
Renat Fatkhullin:

请按我的建议去做。

否则,你需要完整的材料来实现100%的播放。

你对错误报告的态度很奇怪。我又不是拿钱来证明什么。我尽我所能描述了这种情况。

我不是唯一有这个问题的人。 这个问题发生在你的第30次更新之后,但你仍然影射我是个白痴,是一些行动缓慢的指标造成的。

在这之前,他们不是已经慢了一年了吗?

下面是一个代码的例子,它在M30上25分钟后挂起。

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

结果是这样的。

1

 
transcendreamer:


附件中的例子,还不是完整的代码,有些地方没有写,但你可以运行它,为了方便,我还附了一个模板。

我可以保证,我不是一个程序员,代码肯定不是最佳的,我是一个人道主义的经济学家,我在MT5中真的很痛苦,我在MT4中的痛苦更少。

我真的希望有一个简单可靠的函数,能够按照上面的描述建立一个同步数组https://www.mql5.com/ru/forum/289897/page2#comment_9363454。

我不是在抱怨,我不是在自找麻烦。

我不是在抱怨,也不是要求为我写指标,我只是希望(顺便说一下,不仅仅是我)有一个漂亮的标准函数。


编辑:纠正了附件的内容

谢谢你,我们现在就去检查。
 
Stanislav Dray:

你对错误报告的态度很奇怪。我又不是拿钱来证明什么。我已经尽我所能描述了这种情况。

我在这个主题中早先写的东西,无论如何都不符合错误报告的条件。

所有这些都是在没有任何技术细节的情况下进行的投诉模式。经过我的询问,细节才开始显现出来。

 
Stanislav Dray:

你对错误报告的态度很奇怪。我又不是拿钱来证明什么。我已经尽我所能描述了情况。

问题不仅是我,问题出现在你的第30次更新之后,但你仍然影射我是个傻瓜,并指责一些弱智的指标。

在这之前,他们不是已经慢了一年了吗?

下面是一个代码的例子,它在M30上25分钟后挂起。

结果是这样的。


上传了

2018.11.14 17:33:32.570 Experts expert Feezzzz (USDCHF,M30) loaded successfully

现在是18.10,一切都在工作。


 
transcendreamer:


例子附在后面,这还不是完整的代码,有些地方写得不够好,但可以运行,为了方便,我还附了一个模板。

我马上给你看代码和作品。

  1. 指标中的CopyXXX函数不等待完全同步的数据下载,而是给出可用的数据。否则指标会完全冻结一切。

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

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

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

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

  6. 代码的可读性很差


 
Stanislav Dray:

你对错误报告的态度很奇怪。我又不是拿钱来证明什么。我已经尽我所能描述了情况。

问题不仅是我,问题出现在你的第30次更新之后,但你仍然影射我是个傻瓜,并指责一些弱智的指标。

在这之前,他们不是已经慢了一年了吗?

下面是一个代码的例子,它在M30上25分钟后挂起。

结果是这样的。

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

顺便说一句,一个没有主体的文件。