If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.
//+------------------------------------------------------------------+//| 如果符号/周期对出现了新的条形图,则返回 true。//+------------------------------------------------------------------+bool isNewBar()
{
//--- 在静态变量中记住最后一小节的开启时间staticlong last_time=0;
//--- 当前时间long lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);
//--- 如果这是函数的第一次调用if(last_time==0)
{
//--- 设置时间并退出
last_time=lastbar_time;
return(false);
}
//--- 如果时间不同if(last_time!=lastbar_time)
{
//--- 记住时间并返回 true
last_time=lastbar_time;
return(true);
}
//--- if we passed to this line, then the bar is not new; return falsereturn(false);
}
Prival:
这种情况很少见,但有时会出现某一货币对的报价长时间冻结的情况(我在日元交易中就遇到过这种情况)。如果您没有将所有代码都翻译成OnTime(),那么如果 Expert Advisor 在该货币对上挂起,您就有麻烦了。
利扎:
可以使用 TimeCuurent() 接收这样的事件,但如何进一步处理它、如何同步它是个问题。
TimeCuurent() 和这个有什么关系?
帮助中说
在OnTick() 处理程序中,该函数将返回接收到的已处理刻度的时间。在其他情况下(例如,在 OnInit()、OnDeinit()、OnTimer()处理程序 等中调用),这是 "市场观察 "窗口中任何 可用符号 的最后报价到达 时间,与该窗口标题中显示的时间相同。
大纲内容如下
在OnTick() 处理程序中,该函数将返回正在处理的跳动点的到达时间。在其他情况下(例如,在处理程序 OnInit()、OnDeinit()、OnTimer() 等中调用),这是 "市场观察 "窗口中任何 可用符号 的最后报价的到达 时间,与该窗口标题中显示的时间相同。
只有把它放在 OnTime 中,我们才能每分钟更新不超过一次时间,而如果把它放在当前的 OnTick() 中,我们就有可能错过某些货币对(多头)的跳动点。
而在处理块中要做的事情也很清楚(对于 mults)--我们获取一个新值,将其与现有值进行比较,然后得出是否有新刻度的结论。
但是告诉我,为什么要在 Expert Advisor 中这样做?
大纲内容如下
错误。以下是帮助说明https://www.mql5.com/zh/docs/basis/function/events
只有当 Expert Advisor 所连接的图表上的符号收到新的刻度线时,才会为 Expert Advisor 生成NewTick 事件。
再说一遍。我们说的是挂在某个符号上的智能交易系统。它由以下事件触发
void OnTick(){}
如果您在该函数中,而该货币对在一个多小时内没有任何点差,那么您就无法在一个小时内做任何事情。到目前为止,唯一的办法就是在定时器中进行操作,无论交易品种上是否出现刻度线,定时器都会启动。
但是,如果我们将其放在 OnTime 中,时间的更新就不能超过每分钟一次,而如果我们将其放在当前的 OnTick() 中,就有可能丢失某些时间对的刻度(以倍数为单位)。
错误。以下是帮助说明https://www.mql5.com/zh/docs/basis/function/events。
再说一遍。我们讨论的是挂在某个符号上的智能交易系统。它由以下事件启动
void OnTick(){}
如果您在该函数内,而该交易对上没有任何 ticks 超过一小时,您就无法在一小时内做任何事情。到目前为止,唯一的办法就是在定时器中进行操作,无论交易品种上是否出现刻度线,定时器都会启动。
是的,如果我们在https://www.mql5.com/zh/docs/basis/function/events 的框架内行事,我同意现在看来最好的选择是 OnTime。但它只能让我们免于依赖刻度线的到来。而且,它也无法避免单线程问题:当我们在处理一个仪器的信号时,有可能会错过或延迟其他仪器的处理。当 "处理交易订单的时间为 2 至 7 秒 "+ 重新报价时,情况尤其如此。
我之所以想起 TimeCuurent(),是因为Interesting 开始在市场评论中讨论所有货币对的实时刻度。
非常有趣的文章。感谢您分享这一切。
不过,我想说几句:
在谈到这个功能 时,您说......:
If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.
你用一个全局变量替换了一个静态局部变量,而全局变量是一样的,你并没有解决你的问题。
尽管如此,你的 文章还是值得一读 ,它 推动了 思考, 提供了 有趣的想法。
好文章,感谢分享!所有内容都非常有用!
无论如何,我使用了你的 isNewBar 函数,但在编译时出现了以下信息:"类型转换可能 导致数据丢失"。
因此,我将 var 类型从 datetime 改为 long:
现在编译时没有任何提示,而且似乎可以正常工作了。谢谢!