文章 ""New Bar" (新柱)事件处理程序" - 页 2

[删除]  

Prival:

这种情况很少见,但有时会出现某一货币对的报价长时间冻结的情况(我在日元交易中就遇到过这种情况)。如果您没有将所有代码都翻译成OnTime(),那么如果 Expert Advisor 在该货币对上挂起,您就有麻烦了。

如果您使用的是 OOP 或某些算法,则无需翻译代码。但我同意,更方便的做法是在概览中获取所有交易对的实时刻度(而不是自己发明一些东西)....。

利扎

可以使用 TimeCuurent() 接收这样的事件,但如何进一步处理它、如何同步它是个问题。

TimeCuurent() 与此有关吗?
 
Interesting:
TimeCuurent() 和这个有什么关系?

帮助中说

OnTick() 处理程序中,该函数将返回接收到的已处理刻度的时间。在其他情况下(例如,在 OnInit()、OnDeinit()、OnTimer()处理程序 等中调用),这是 "市场观察 "窗口中任何 可用符号最后报价到达 时间,与该窗口标题中显示的时间相同。

[删除]  
Lizar:

大纲内容如下

OnTick() 处理程序中,该函数将返回正在处理的跳动点的到达时间。在其他情况下(例如,在处理程序 OnInit()、OnDeinit()、OnTimer() 等中调用),这是 "市场观察 "窗口中任何 可用符号最后报价的到达 时间,与该窗口标题中显示的时间相同。

只有把它放在 OnTime 中,我们才能每分钟更新不超过一次时间,而如果把它放在当前的 OnTick() 中,我们就有可能错过某些货币对(多头)的跳动点。

而在处理块中要做的事情也很清楚(对于 mults)--我们获取一个新值,将其与现有值进行比较,然后得出是否有新刻度的结论。

但是告诉我,为什么要在 Expert Advisor 中这样做?

 
Lizar:

大纲内容如下

错误。以下是帮助说明https://www.mql5.com/zh/docs/basis/function/events

只有当 Expert Advisor 所连接的图表上的符号收到新的刻度线时,才会为 Expert Advisor 生成NewTick 事件

再说一遍。我们说的是挂在某个符号上的智能交易系统。它由以下事件触发

void OnTick(){}

如果您在该函数中,而该货币对在一个多小时内没有任何点差,那么您就无法在一个小时内做任何事情。到目前为止,唯一的办法就是在定时器中进行操作,无论交易品种上是否出现刻度线,定时器都会启动。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Interesting:

但是,如果我们将其放在 OnTime 中,时间的更新就不能超过每分钟一次,而如果我们将其放在当前的 OnTick() 中,就有可能丢失某些时间对的刻度(以倍数为单位)。

这就是问题所在,我们可以获取事件,但无法使用它。
 
Prival:

错误。以下是帮助说明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 开始在市场评论中讨论所有货币对的实时刻度。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
[删除]  
好文章,谢谢。
 
谢谢
 

非常有趣的文章。感谢您分享这一切。

不过,我想说几句:

在谈到这个功能 时,您说......:

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() 这样的函数是不好的做法。只调用一次,并将结果保存在一个变量中。
  • 问题是你提供的解决方案,即使用一个没有静态变量的类,并不能解决你所强调的问题。现在的情况更糟。您必须将类的实例声明为全局变量(对象),还必须在 OnInit() 时对其进行初始化。 使用你的类的 必须知道 这个操作
  1. 始终使用 全局变量
  2. 即使 符号周期 是默认的(对于时间图表),一定要 初始化
  • 最后,"如果我们想在同一个计算循环的另一个地方再次使用这个函数"。它仍然总是返回 FALSE。

你用一个全局变量替换了一个静态局部变量,而全局变量是一样的,你并没有解决你的问题。


尽管如此,你的 文章还是值得一读 推动了 思考, 提供了 有趣的想法。

[删除]  

好文章,感谢分享!所有内容都非常有用!

无论如何,我使用了你的 isNewBar 函数,但在编译时出现了以下信息:"类型转换可能 导致数据丢失"。

因此,我将 var 类型从 datetime 改为 long:

//+------------------------------------------------------------------+
//| 如果符号/周期对出现了新的条形图,则返回 true。
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- 在静态变量中记住最后一小节的开启时间
   static long 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 false
   return(false);
  }

现在编译时没有任何提示,而且似乎可以正常工作了。谢谢!


Documentation on MQL5: Language Basics / Data Types / Typecasting
  • www.mql5.com
Language Basics / Data Types / Typecasting - Documentation on MQL5