我不是专家,但我认为这段代码是错误的。Recount 变量始终为真。因此,每个刻度线都将被视为一个新的条形图。为什么要有这个变量?为什么要调用 CopyClose?发布的代码是否检查过操作是否正确?如果我说错了,请更正并解释。
lordlev:
我不是专家,但我认为这段代码是错误的。Recount 变量始终为真。因此,每个刻度线都将被视为一个新的条形图。为什么要有这个变量?为什么要调用 CopyClose?发布的代码是否检查过操作是否正确?如果我错了,请纠正并解释。
我再次仔细检查了所有内容,发现了一个错误。在附件中没有将 Recount 赋值为 false,但在示例代码中一切都是正确的。
我不是专家,但我认为这段代码是错误的。Recount 变量始终为真。因此,每个刻度线都将被视为一个新的条形图。为什么要有这个变量?为什么要调用 CopyClose?发布的代码是否检查过操作是否正确?如果我错了,请纠正并解释。
lordlev:
我又重新检查了一遍,发现了一个错误。在附件中,没有将 Recount 赋值为 false,但在示例代码中一切正常。
嗯,可以解决这个问题!
我又重新检查了一遍,发现了一个错误。在附件中,没有将 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:
也许我错了,但我认为这样做是正确的。
否则,在分页(历史编辑)过程中会出现误差。
你能解释一下这是什么原因吗?
我不明白。这个条件什么时候为真,什么时候为假?谢谢。
我认为作为一种预防措施,这样做更符合逻辑。
if(TNew>m_TOld && TNew) 虽然在交换历史记录时,TNew 仍然为零。任何时候 TNew 变量中都可能出现零,所以应该一直检查是否为零。
你的类中有一个小错误(就像 我看到的大多数 函数 代码 一样 )。第一次调用 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;
}
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
- www.mql5.com
Predefined Macro Substitutions - Named Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
IsNewBar:
作者: Nikolay Kositsin