[SERVICE DESK]在获取计时器中的高级TF的时间时出错! - 页 5

 
Vitaly Gorbunov:
iBarShift方法可以让你找到历史上的漏洞,但你必须每隔一段时间检查历史。我为自己写了一个程序来做这件事,之后我就忘记了MtF程序的差距。
这不是一个检测 "洞 "的问题。 这个人想得到历史上的最后一栏。 而这不一定是当前时间的一栏。
 
Vitaly Gorbunov:
数据加载时出现了4066的错误,然后就是methaquotovs的故障,很可能是收到的数据是针对这种情况处理的,错误没有被发明。而在这一点上,一切都有意义。

如果一个错误 "没有被发明",这并不意味着它不存在。

 
Alexey Navoykov:
这不是一个检测 "漏洞 "的问题。 这个人想得到历史上的最后一个时间段。 而这不一定是当前的时间段。

这与iBarShift()无关。它发送的错误与iTime()和SeriesInfoInteger()相同。这里的拐杖是在比较初始化期间获得的时间,然后将其与计时器的时间进行比较。这就是允许在加载终端时获得正确的实际数据,而不是IBarShift()。

是的,如果时间是15:00:45(例如),而15:00的条形图上还没有刻度,如果最后一个小时的条形图开放时间是 14:00--我想一切都正确。而如果系统返回13:00--那就是一个问题。

 
Alexey Kozitsyn:

1.伊戈尔,你看了代码了吗?在OnInit()中,我在哪里可以得到一些东西?

在你的案例中,一个或几个OnTimer调用在OnInit()之后被执行。目前还没有OnCalculate()事件。

2.什么检查?哪里写着指标必须至少使用 一次OnCalculate()才能正确工作?

这里我们需要了解终端的逻辑。在将指标连接到图表时,OnInit()被立即调用。当启动终端时,指标与图表的连接是在图表窗口创建后立即进行的。此刻,终端甚至还没有向服务器发送请求。

第一个OnCalculate()是在读取本地可用的报价后调用的。在一些罕见的情况下,会发生当地没有任何东西的情况。在这种情况下,当寻址到Time[0]时,指标会从数组中出来。因此,你最好使用iTime功能和其他类似功能。

第二个和下一个OnCalculate()发生在历史记录加载时或真正的ticks到达时。

 
Ihor Herasko:

第一个OnCalculate()在读取本地可用报价后被调用。在一些罕见的情况下,会发生当地没有任何东西的情况。在这种情况下,当引用Time[0]时,指标会从数组中出来。因此,你最好使用iTime功能或类似功能。

我想我们说的是MQL5,OHLC的准备与MT4不同。

长期以来,我一直在根据一个模板来写指标。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int i,limit;
   if(prev_calculated==0)
     {
      limit=rates_total-1;    //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
     }
   else limit=rates_total-prev_calculated+1;
   for(i=limit;i>=0;i--)      //---- Основной цикл расчета
     {                        
     }
   return(rates_total);
  }

我从来没有在MT4的OHLC数组 上遇到过 "指标崩溃",我认为MT4在第一次准备好图表之前不会运行OnCalculate(),如果历史记录被加载,我没有检查过,但是prev_calculated==0,在MT5会像你写的那样 - 你需要额外检查OHLC数据是否已经被准备好了。

 
Ihor Herasko:

在你的例子中,OnTimer的一个或几个调用是在OnInit()之后执行的。目前还没有OnCalculate()事件。

在这里,你需要了解终端的逻辑。在将指标连接到图表时,OnInit()被立即调用。当启动终端时,指标与图表的连接是在图表窗口创建后立即进行的。此刻,终端甚至还没有向服务器发送请求。

第一个OnCalculate()是在本地读取可用的报价后调用的。在一些罕见的情况下,会发生当地没有任何东西的情况。在这种情况下,当寻址到Time[0]时,指标会从数组中出来。因此,最好使用iTime功能或类似功能。

第二个和下一个OnCalculate()发生在历史记录加载时或真正的ticks到达时。

你有什么建议来解决这个问题(在你看来是有的)?等到OnCalculate()被调用 1-2次?

 
Alexey Kozitsyn:

你有什么建议来解决这个问题(在你看来是有的)?等到OnCalculate()被调用 1-2次?

你可以尝试prev_calculated==0 的值复制到全局范围的一个变量中,然后在OnTimer()中查看指标是否已经被计算。OnCalculate() - 在任何情况下都会被计算出来,我怀疑如果TF数据没有准备好,那么return(rate_total)将返回0,这将在下一次调用OnCalculate()时表明prev_calculated==0,大约如此

void OnTimer(){
   if(Global_prev_calculated==0)return;
}
 
Igor Makanu:

你可以尝试prev_calculated==0 的值复制到全局范围的一个变量中,然后在OnTimer()中查看指标是否被计算出来;我在上面写道,我从未在MT4中看到过任何计算错误 的错误。OnCalculate() - 在任何情况下都会被计算,我怀疑如果TF数据没有准备好,那么return(rate_total)将返回0,这将是在下一次调用OnCalculate()时的一个标志prev_calculated==0

看来,最可靠的解决方案是等待OnCalculate()的调用,并强制检查与交易服务器的连接。如果我们不检查连接(IsConnected()),那么即使在终端加载的OnCalculate()中,我们也会得到它。

2018.09.21 23:45:27.128 test_isNewDayInOnCalculate_iBarShift() EURGBP.e,M1: test_isNewDayInOnCalculate_iBarShift().mq4: Актуальное время открытия бара М15 = 2018.09.21 21:30. Ошибка #0
2018.09.21 23:45:25.990 test_isNewDayInOnCalculate_iBarShift() EURGBP.e,M1: initialized
2018.09.21 23:45:25.975 Custom indicator test_isNewDayInOnCalculate_iBarShift() EURGBP.e,M1: loaded successfully

然而,它并没有消除所有问题。

1.为什么在IsConnected()的文档中没有说必须在OnCalculate()中从高级TF接收数据(至少是)之前调用它?

2.为什么OnTimer()中的IsConnected()实际上不起作用?与贸易服务器建立连接的事实不是应该告诉我们可以获得数据吗?

3.一旦我们与交易服务器建立了连接,并试图在OnTimer()中接收数据,如果函数iTime()、iBarShift()、SeriesInfoInteger()以及与之类似的函数从该特定交易服务器获取的数据尚未同步,难道不应该返回错误?否则,它看起来是无稽之谈,就像我们返回一次错误4066,然后以任何你想要的方式使用现在的数据。

 
Alexey Kozitsyn:

然而,这并不能消除所有问题。

1.为什么IsConnected()的文档没有说它必须在OnCalculate()中从高级TF接收数据(至少是)之前调用?

2.为什么OnTimer()中的IsConnected()实际上不起作用?与贸易服务器建立连接的事实不是应该告诉我们可以获得数据吗?

3.一旦我们与交易服务器建立了连接,并试图在OnTimer()中接收数据,如果函数iTime()、iBarShift()、SeriesInfoInteger()以及与之类似的函数从该特定交易服务器获取的数据尚未同步,难道不应该返回错误?否则就显得很无厘头,就像我们返回一次4066错误,然后按照你的方式使用现有的数据。

1.好吧,没有人取消对历史数据的指标调用 的情况,如果你需要在线工作,那么检查连接,如果没有,或者说不重要,那么我的版本的模板就可以工作。 IsConnected()函数组实际上有点棘手,它们有时会跨越IsTradeContextBusy()和IsConnected()本身,以及IsTradeAllowed()...我认为他们在服务器端作弊,在新闻时间断开终端或其他一些操作。

2,3. 工作,但你忘了GetLastError()在调用后会重置其状态,也许更新GetLastError()的状态需要将控制权转移到终端,也许终端在你从定时器调用之前没有时间在GetLastError()中重新设置状态IsConnected()....我认为OnTimer()函数不是用来接收数据的。"MQL4参考/状态检查 - OnTimer()将被调用,但终端环境的变量不会被更新,而onCalculate()它保证在打勾时从终端准备所有数据

 
Igor Makanu:

1.嗯,没有人取消在历史数据上调用指标 的情况......

2,3.它是有效的,但你忘了GetLastError()在调用后会重置其状态,也许为了更新GetLastError()的状态,需要将控制权传递给终端,也许终端没有时间在你从定时器....,在GetLastError()中重新设置状态IsConnected()我认为OnTimer()函数不是用来接收数据的。"MQL4参考/状态检查 - OnTimer()将被调用,但终端环境的变量不会被更新,保证终端在打勾时准备所有的数据-OnCalculate()

1.你认为如果第0条的时间不正确,其余的历史会有正确的时间吗?)

2,3.如果数据访问函数没有足够的时间来设置一些有意义的错误--让它以某种方式报告,但肯定不是通过返回错误代码=0(没有错误)。其余的 "也许 "只是猜测。而没有证据就没有什么可谈的。

OnTimer()函数的目的不是为了获取数据...

没有评论。

OnTimer()将被调用,但终端环境变量不一定被更新。

我们需要4066号错误的原因是什么?