错误、漏洞、问题 - 页 2180

 
Nikolai Semko:

很明显,是零。

用22秒的时间来决定在给定的时间框架内有零条,这样做可以吗?

显然是Bars内部实现中的一个算法错误。

而且我不明白你是如何将某个时间段的零条与这个零条 区分开的。

来自文档:如果在调用 Bars()函数 时指定参数的时间序列数据尚未在终端生成,或者在调用函数时时间序列数据没有与交易服务器同步,该函数将返回0值

换句话说,我怎样才能区分空结果和空错误?
 
A100:

而且我不明白你是如何区分某个时间框架内的零条和这个零条 的。

来自文档:如果在调用 Bars()函数 时,具有指定参数的时间序列的数据尚未在终端生成,或者在调用该函数时,时间序列数据没有与交易服务器同步,那么该函数将返回0值

在这个问题上,零点的起源并不重要,重要的是这个零点是由Bars函数以几十秒的形式永远诞生的。

 
A100:

而且我不明白你怎么能分辨出某个时间段内的零条和这个零条 之间的区别。

文档中提到:如果在调用 Bars()函数 时指定参数的时间序列数据尚未在终端生成,或者在调用函数的时刻时间序列数据没有与交易服务器同步,该函数将返回0

换句话说,我怎样才能区分空结果和空错误?

想一想吧。如果你的任务是创建一个类似于Bars的函数,并给你一个数组datetime,其元素的值随着数量的增加而减少,换句话说,这个数组是被排序的。

你认为实现一个在给定时间间隔内搜索这样一个排序数组的元素数的算法会很困难吗?如果在给定的区间内没有一个酒吧,或者数组还没有被初始化,我们应该返回0。

不--该算法足够简单。它能运行22秒的是什么?

 
Nikolai Semko:

在这个问题上,零点的起源并不重要,重要的是这个零点是由Bars函数诞生的,以几十秒的形式存在,历时很长。

准确地说,原点很重要,因为如果::Bars()在历史错误 的情况下返回-1而不是0(像现在这样),就不会发生延迟。但现在0被解释为一个错误,延迟是由于内部重复https://www.mql5.com/ru/forum/1111/page2200#comment_6955559

此外,假设我们引入一个额外的检查,延迟就会消失。然后发生了什么?你已经得到了零。这是一个结果还是一个错误?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.03.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Vitaly Muzichenko:

这很可能是由于历史原因造成的加载

因此,有趣的是,第一个Print的处理没有延迟,即H4的历史已经被加载。

而如果你把CopyTime H4改为W1,就不会有任何延迟。这意味着W1的历史也已经被加载。

只是,Bars被CurrentTime()和零点开盘时间 之间的时间间隔所抑制。

 
A100:

重要的是原点,因为如果::Bars()在历史错误 的情况下返回-1而不是0(就像现在这样),就根本不会有延迟。但现在0被解释为一个错误,并且由于内部重复而发生延迟https://www.mql5.com/ru/forum/1111/page2200#comment_6955559。

此外,假设引入一个额外的检查,延迟就会消失。然后发生了什么?你已经得到了零。这是一个结果还是一个错误?

在我所有的算法中,零的结果是在给定的区间内没有打出一个条形,还是没有这样的数组,这并不重要。

你在引导人们远离问题。

 
Nikolai Semko:

你正在从问题中抽身。

我在陈述问题的本质,你却固执于你的特定案例。从你之前的帖子 来看,你还是不明白什么时候会出现延迟(这除了原因之外),尽管前面的页面已经详细解释了这一切。

也许这个脚本可以帮助你理解

void OnStart()
{
        Print( "begin" );
        ::Bars( _Symbol, PERIOD_W1, D'2018.03.20', D'2018.03.23' );
        Print( "end" );
}
 
A100:
我在陈述问题的本质,而你却固守在你的特定案例上。从你之前的留言 来看,你还是不明白什么时候会出现延迟(这除了原因之外),虽然前面的页面详细解释了这一点。

我在上面已经阐述了我对延迟发生时间的看法。

再一次。
如果start_time在所请求的TF的零条开盘时间到TimeCurrent()的范围内,Bars就会挂起。(只是一个假设,但在实践中进行了检查)
是的,错误发生在一个特殊情况下。但是,私人案件不应该出现在标准的内置编程语言函数中。

而你的 "观点 "并不是重点,因为你只是引用了巴斯命令的参考文献,而我对这一点完全熟悉。在Bars函数中没有错误代码,因为不需要它。

在这种情况下,我们处理的是完全形成的时间序列数组,更是如此。

这可以从我的脚本中稍加修改的代码中清楚地看到。

void OnStart()
  {
   datetime Arr[];
   if(CopyTime(_Symbol,PERIOD_W1,0,1,Arr)<0) Print("Ошибка");
   Print("Время открытия нулевого бара W1 = "+TimeToString(Arr[0]));
   ArraySetAsSeries(Arr,true);
   if(CopyTime(_Symbol,PERIOD_H4,0,100,Arr)<0) Print("Ошибка");
   Print("1 "+"CurrentTime = "+TimeToString(TimeCurrent()));
   int Res=Bars(_Symbol,PERIOD_W1,Arr[99],TimeCurrent());  // выполняется быстро   
   Print("2 Время открытия 99 бара H4 = "+TimeToString(Arr[99])+"  Номер бара W1= " +IntegerToString(Res)); 
   Res=Bars(_Symbol,PERIOD_W1,Arr[0],TimeCurrent());       // выполнение происходит более 10 секунд!!!   
   Print("3 Время нулевого бара H4 = "+TimeToString(Arr[0])+"  Номер бара W1= " +IntegerToString(Res));
  }

结果。

2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     Время открытия нулевого бара W1 = 2018.03.25 00:00
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     1 CurrentTime = 2018.03.30 23:54
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     2 Время открытия 99 бара H4 = 2018.03.08 20:00  Номер бара W1= 3
2018.03.30 23:39:47.176 BagBars (EURUSD,H4)     3 Время нулевого бара H4 = 2018.03.30 20:00  Номер бара W1= 0
 
A100:

也许这个脚本会有助于理解

你的脚本证明了这个问题--挂起。

因为start_time - stop_time的时间范围是在周线内。

如果你超出了周线的范围,那么就不会有冻结。

Bars( _Symbol, PERIOD_W1, D'2018.03.12', D'2018.03.23' );

谢谢你提供的更清晰的例子

 

在MT4的CopyHigh、CopyLow功能中(没有看其他功能),当测试器中没有历史记录时,会引起一个关键错误。EA在H1上被测试,请求来自M1

1 15:14:35.410 2017.01.04 19:54:24  Access violation read to 0x0A971FE8 in 'C:\Users\Halyna\AppData\Roaming\MetaQuotes\Terminal\287469DEA9630EA94D0715D755974F1B\MQL4\Experts\____________.ex4'

3 15:14:35.465 2017.01.04 19:54:24 由于EA中的一个关键错误,测试通道停止了。