isNewBar()没有产生正确的时间随机值onTick MQL5

检查这个程序我试图获得Stochastic的值

 #include  CisNewBar current_chart; // instance of the CisNewBar class: // detect new tick candlestick void OnTick() { if ( current_chart.isNewBar() > 0 ) { int stoch = iStochastic(_Symbol,PERIOD_M1,5,3,3,MODE_SMA,STO_LOWHIGH); double K[],D[]; ArraySetAsSeries(K,true); ArraySetAsSeries(D,true); CopyBuffer(stoch,0,0,5,K); CopyBuffer(stoch,1,0,5,D); ArrayPrint(K); } } 

这是我得到的输出:

 95.97315 90.40000 74.11765 49.25373 25.00000 73.68421 81.87919 90.40000 74.11765 49.25373 74.34211 80.70175 81.87919 90.40000 74.11765 90.24390 78.94737 80.70175 81.87919 90.40000 78.33333 84.05797 78.94737 80.70175 81.87919 

上述值表示数组元素为0th, 1st,2nd,3rd & 4th
初始打印中的0th将成为下一个打印的0th ,并将放置在下一个打印的1st位置。
但我看到价值观发生了变化,而且非常激烈。

以前iStochastic()给出了正确的值。 但它正在使用OnTick() ,因此每次更改都会提供输出。 我只需要在条形图完成时或分钟后的值。 所以,我尝试了社区的解决方案。 这是链接: newbar的解决方案

但是产出是正面的,正在改变我的交易方程,这就是我失去它的原因。

请帮我。 我怎么能让它适合我?

以下是所需文件: Lib CisNewBar.mqh

 //+------------------------------------------------------------------+ //| Lib CisNewBar.mqh | //| Copyright 2010, Lizar | //| Lizar-2010@mail.ru | //| Revision 2010.09.27 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Class CisNewBar. | //| Appointment: Class with methods of detecting new bars | //+------------------------------------------------------------------+ class CisNewBar { protected: datetime m_lastbar_time; // Time of opening last bar string m_symbol; // Symbol name ENUM_TIMEFRAMES m_period; // Chart period uint m_retcode; // Result code of detecting new bar int m_new_bars; // Number of new bars string m_comment; // Comment of execution public: void CisNewBar(); // CisNewBar constructor //--- Methods of access to protected data: uint GetRetCode() const {return(m_retcode); } // Result code of detecting new bar datetime GetLastBarTime() const {return(m_lastbar_time);} // Time of opening new bar int GetNewBars() const {return(m_new_bars); } // Number of new bars string GetComment() const {return(m_comment); } // Comment of execution string GetSymbol() const {return(m_symbol); } // Symbol name ENUM_TIMEFRAMES GetPeriod() const {return(m_period); } // Chart period //--- Methods of initializing protected data: void SetLastBarTime(datetime lastbar_time){m_lastbar_time=lastbar_time; } void SetSymbol(string symbol) {m_symbol=(symbol==NULL || symbol=="")?Symbol():symbol; } void SetPeriod(ENUM_TIMEFRAMES period) {m_period=(period==PERIOD_CURRENT)?Period():period; } //--- Methods of detecting new bars: bool isNewBar(datetime new_Time); // First type of request for new bar int isNewBar(); // Second type of request for new bar }; //+------------------------------------------------------------------+ //| CisNewBar constructor. | //| INPUT: no. | //| OUTPUT: no. | //| REMARK: no. | //+------------------------------------------------------------------+ void CisNewBar::CisNewBar() { m_retcode=0; // Result code of detecting new bar m_lastbar_time=0; // Time of opening last bar m_new_bars=0; // Number of new bars m_comment=""; // Comment of execution m_symbol=Symbol(); // Symbol name, by default - symbol of current chart m_period=Period(); // Chart period, by default - period of current chart } //+------------------------------------------------------------------+ //| First type of request for new bar | //| INPUT: newbar_time - time of opening (hypothetically) new bar| //| OUTPUT: true - if new bar(s) has(ve) appeared | //| false - if there is no new bar or in case of error | //| REMARK: no. | //+------------------------------------------------------------------+ bool CisNewBar::isNewBar(datetime newbar_time) { //--- Initialization of protected variables m_new_bars = 0; // Number of new bars m_retcode = 0; // Result code of detecting new bar: 0 - no error m_comment =__FUNCTION__+" Successful check for new bar"; //--- //--- Just to be sure, check: is the time of (hypothetically) new bar m_newbar_time less than time of last bar m_lastbar_time? if(m_lastbar_time>newbar_time) { // If new bar is older than last bar, print error message m_comment=__FUNCTION__+" Synchronization error: time of previous bar "+TimeToString(m_lastbar_time)+ ", time of new bar request "+TimeToString(newbar_time); m_retcode=-1; // Result code of detecting new bar: return -1 - synchronization error return(false); } //--- //--- if it's the first call if(m_lastbar_time==0) { m_lastbar_time=newbar_time; //--- set time of last bar and exit m_comment =__FUNCTION__+" Initialization of lastbar_time = "+TimeToString(m_lastbar_time); return(false); } //--- //--- Check for new bar: if(m_lastbar_time<newbar_time) { m_new_bars=1; // Number of new bars m_lastbar_time=newbar_time; // remember time of last bar return(true); } //--- //--- if we've reached this line, then the bar is not new; return false return(false); } //+------------------------------------------------------------------+ //| Second type of request for new bar | //| INPUT: no. | //| OUTPUT: m_new_bars - Number of new bars | //| REMARK: no. | //+------------------------------------------------------------------+ int CisNewBar::isNewBar() { datetime newbar_time; datetime lastbar_time=m_lastbar_time; //--- Request time of opening last bar: ResetLastError(); // Set value of predefined variable _LastError as 0. if(!SeriesInfoInteger(m_symbol,m_period,SERIES_LASTBAR_DATE,newbar_time)) { // If request has failed, print error message: m_retcode=GetLastError(); // Result code of detecting new bar: write value of variable _LastError m_comment=__FUNCTION__+" Error when getting time of last bar opening: "+IntegerToString(m_retcode); return(0); } //--- //---Next use first type of request for new bar, to complete analysis: if(!isNewBar(newbar_time)) return(0); //---Correct number of new bars: m_new_bars=Bars(m_symbol,m_period,lastbar_time,newbar_time)-1; //--- If we've reached this line - then there is(are) new bar(s), return their number: return(m_new_bars); }