资料库: IsNewBar

 

IsNewBar:

CIsNewBar 类可用来判断柱线变化的时刻。

作者: Nikolay Kositsin

 
我不是专家,但我认为这段代码是错误的。Recount 变量始终为真。因此,每个刻度线都将被视为一个新的条形图。为什么要有这个变量?为什么要调用 CopyClose?发布的代码是否检查过操作是否正确?如果我说错了,请更正并解释。
 
lordlev:
我不是专家,但我认为这段代码是错误的。Recount 变量始终为真。因此,每个刻度线都将被视为一个新的条形图。为什么要有这个变量?为什么要调用 CopyClose?发布的代码是否检查过操作是否正确?如果我错了,请纠正并解释。
我再次仔细检查了所有内容,发现了一个错误。在附件中没有将 Recount 赋值为 false,但在示例代码中一切都是正确的。
 
lordlev:
我又重新检查了一遍,发现了一个错误。在附件中,没有将 Recount 赋值为 false,但在示例代码中一切正常。
嗯,可以解决这个问题!
 

也许我错了,但我认为这是正确的方法。

if(TNew>m_TOld)

否则在分页(历史编辑)时就会不准确。

你能解释一下这是什么原因吗?

if(...  && TNew)

我不明白。这个条件什么时候为真,什么时候为假?谢谢。

 
Prival:

您能解释一下这是什么,为什么要插入这个检查吗?

我不明白。这个条件什么时候为真,什么时候为假?谢谢。

我认为,它检查 TNew 不等于 m_TOld,同时不等于零(即 D'1970.01.01.01 00:00:00:00')....

第二个条件在我看来也是检查函数

datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));

返回的结果与零不同

现在,我用这个函数运行了脚本--它返回的结果正好是 0。也许是因为周末的缘故。

 
Prival:

您能解释一下这是什么,为什么要插入这个检查吗?

我不明白。这个条件什么时候为真,什么时候为假?谢谢。

为了避免在条件的开始和第一次检查时出现新条形图 的开头(无论该条形图 的开头经过了多长时间),必须进行零检查。
 
Prival:

也许我错了,但我认为这样做是正确的。

否则,在分页(历史编辑)过程中会出现误差。

你能解释一下这是什么原因吗?

我不明白。这个条件什么时候为真,什么时候为假?谢谢。

我认为作为一种预防措施,这样做更符合逻辑。

if(TNew>m_TOld && TNew)

虽然在交换历史记录时,TNew 仍然为零。任何时候 TNew 变量中都可能出现零,所以应该一直检查是否为零。

 
Automated-Trading:

IsNewBar

作者: Nikolay KositsinNikolay Kositsin

你的类中有一个小错误(就像 我看到的大多数 函数 代码 一样 )。第一次调用 IsNewBar 方法时, 无论是否存在 真正的 新条形图 ,它总是返回 true

但这样的函数包含一个静态变量,因此我们不能多次调用该函数。

我们还可以使用一个二维数组来保存最后一棒的打开时间。

 
我做了一个 CIsNewBar 的替代版本,没有任何静态变量。我只是用 Tick.time_msc 来做一个幂等函数:


class CIsNewBar{
private:
   long checkedMs;
   datetime lastBarOpenedAt;
   bool lastValue;
   CTickUtils tickUtils;
public:
   CIsNewBar(){}
   ~CIsNewBar(){}

   bool isNewBar(){
      MqlTick tick;
      SymbolInfoTick(_Symbol, tick);
      long tickMs = tick.time_msc;

      
      if(checkedMs >= tickMs){ // 是否已经在此刻度上处理了此函数?
         return lastValue;     //因此,返回缓冲值
      }

      datetime time[1];
      CopyTime(_Symbol, _Period, 0, 1, time);


      if(lastBarOpenedAt != time[0]){
         lastBarOpenedAt = time[0];
         lastValue = true;
      } else {
         lastValue = false;
      }

      checkedMs = tickMs;
      return lastValue;
   }
 

我认为这是一个可以快速解决上述问题的轻量级类。

这个版本

  • 不会在首次调用 .isNewBar()函数 时发出错误警报。
  • 不使用静态变量,消除了每次调用函数时不断重新初始化新变量的问题,从而加快了执行速度。
  • 每个条形图只返回一次 true。
  • 占用内存少。
class CIsNewBar{
        private:
                datetime lastBarOpenedAt;
                datetime time[1];
        public:
                CIsNewBar(){CopyTime(_Symbol, _Period, 0, 1, time);lastBarOpenedAt = time[0];}
                ~CIsNewBar(){}
                bool isNewBar(){
                        CopyTime(_Symbol, _Period, 0, 1, time);
                        if(lastBarOpenedAt < time[0]){
                                lastBarOpenedAt = time[0];
                                return(true);
                                }
                        else { return(false);}
                        }
        };

实现该类

CIsNewBar someName;

void OnTick(){
        if(someName.isNewBar()){
                /// 调用新的条形图事件处理程序或
                /// 为新栏工作。 
                }
        }
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
Documentation on MQL5: Constants, Enumerations and Structures / Named Constants / Predefined Macro Substitutions
  • www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5