如何检测一个新酒吧 - 页 2

 
Ian Harris:

嗨,oneillj。

我想我已经回复过了,但它似乎已经消失在互联网上了。

你提供的代码片段几乎就是我最初抱怨的那个。为什么这么复杂?我只是觉得一定有一个更简单的方法。我想出了这个办法,它似乎是有效的。如果我说错了,请纠正我。(我也尝试过使用BarsCalculated,但它总是等于Bars,所以测试结果总是错误的)。

static int LastBarCount = 0;
如果(Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
否则
返回。

;-)伊恩

我完全同意,我们需要尽可能简单的东西。

遗憾的是,这段代码在MQL5中似乎并不适合我。

 
RoboSpider:
遗憾的是,这在MQL5中似乎不起作用。

不管怎么说,条形图将是检测新条形图的一个糟糕的方法。

唯一可靠的方法是使用时间来检查 新的条形图。不是成交量,不是价格,也不是条形图。

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
 
honest_knave:

不管怎么说,条形图将是检测新条形图的一个糟糕的方法。

唯一可靠的方法是使用时间来检查新的条形图。不是成交量,不是价格,也不是条形图。

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }
你是我的英雄!
 
honest_knave Bars无论如何都是一个检测新蜡烛的坏方法。唯一可靠的方法是使用时间来检查一个新的蜡烛。不是成交量,不是价格,不是条形。
  1. Bars是不可靠的(刷新/重新连接可以改变图表上的条数,)volume是不可靠的(错过ticks,)Price是不可靠的(重复的价格和==操作数。 - MQL4论坛。)总是使用时间。新的蜡烛 - MQL4论坛
 
honest_knave:

不管怎么说,条形图将是检测新条形图的一个糟糕的方法。

唯一可靠的方法是使用时间来检查新的条形图。不是成交量,不是价格,也不是条形图。

static datetime LastBar = 0;
datetime ThisBar = (datetime)SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_LASTBAR_DATE);
if(LastBar != ThisBar)
  {
   printf("New bar: %s",TimeToString(ThisBar));
   LastBar = ThisBar;
  }

仅供参考,我在我的参考文献中有如下说明。

//-- 有时SeriesInfoInteger与SERIES_LASTBAR_DATE 返回一个错误。

那是很久以前的事了,而且我已经很多年没有使用/测试这个函数了,所以也许这不是更多的情况。但如果你想用它来检测一个新条形图,最好还是检查一下;-)

 
Alain Verleyen:

仅供参考,我的参考资料中有如下说明。

//-- 有时SeriesInfoInteger与SERIES_LASTBAR_DATE 返回一个错误。

那是很久以前的事了,而且我已经很多年没有使用/测试这个函数了,所以也许这不是更多的情况。但如果你想用它来检测一个新的酒吧,最好还是检查一下;-)

这是非常隐蔽的,Alain!什么类型的错误?

在这种情况下,对于belts'n'braces,要么在调用前检查SeriesInfoInteger >0和/或ResetLastError,然后在调用后检查_LastError。

或者在其他地方获得时间源,例如,如果在OnCalculate中,则为time[],或者CopyTime等等等等。

 

为什么不简单地使用像这样的东西。

   static datetime prevTime=0;
          datetime lastTime[1];
          if (CopyTime(_Symbol,_Period,0,1,lastTime)==1 && prevTime!=lastTime[0])
          {
               prevTime=lastTime[0];
              
               // ...
          }
它应该在所有情况下都能工作(即使在CopyTime()出现错误时,它也能避免出现陷阱)
 
honest_knave:

这是非常隐蔽的,阿兰!什么类型的错误?

在这种情况下,对于大括号,要么在调用前检查SeriesInfoInteger >0和/或ResetLastError,然后在调用后检查_LastError。

或者在其他地方获得时间源,例如,如果在OnCalculate中,则为time[],或者CopyTime等等等等。

我只是说,当我多年前使用SeriesInfoInteger()时,它并不真正可靠。由你来决定你如何处理这些信息 :-D
 
Alain Verleyen:
我只是说,当我多年前使用SeriesInfoInteger()时,它并不真正可靠。至于你如何处理这些信息,就看你自己了 :-D

不是很多TBH - 我不需要在MT5中检测一个新的酒吧 ,但感谢你的分享 - 我会记住它为未来。

我只是想简化一些人们似乎过于复杂的东西。

尽管如此,原则仍然是:使用时间。注意:考虑到Alain的不完整的历史笔记,选择你获得时间的方法是你自己的危险(顺便说一下,XP Service Pack 1看起来怎么样?)

 
honest_knave:

不多,TBH - 我不需要在MT5中检测一个新的酒吧,但感谢你的分享 - 我会记住它,为未来。

我只是想简化一些人们似乎过于复杂的东西。

尽管如此,原则仍然是:使用时间。注意:考虑到Alain的不完整的历史记录,选择获取时间的方法是你自己的风险(顺便说一下,XP Service Pack 1看起来怎么样?)