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

时间:2018-03-29 07:15:01

标签: c# mql5 metatrader5

检查此程序我正在尝试获取Stochastic

的值
#include <Lib CisNewBar.mqh>

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将成为下一张打印件的前一张,并将放置在下一张打印件的1st位置。
但我看到价值观发生了变化并且变得非常激烈。

以前iStochastic()提供了正确且正确的值。但它正在工作OnTick(),因此每次更改都会提供输出。我只需要栏完成时或分钟后的值。所以,我尝试了社区的解决方案。这是链接:solution for 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);
}

0 个答案:

没有答案