0

Check this program I am trying to get the values of the 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);
     }
}

Here is the output I got:

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

The above values represents Array elements as 0th, 1st,2nd,3rd & 4th
What is the 0th in the initial print will become the previous for the next and will be placed at the 1st position in the next print.
But I see the values has changed and is drastic.

Previously the iStochastic() was giving the right and correct values. But it was working OnTick() and hence was giving the output for every change. I only need the values when the bar is complete or after minute. So, I tried the solution from the community. Here is the link: solution for newbar

But the output is infront and is changing the equation of my trade which is why I am losing it.

Please help me. How I can make it work for me?

Here are the files needed: 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);
}
user3666197
  • 1
  • 6
  • 50
  • 92
Jaffer Wilson
  • 7,029
  • 10
  • 62
  • 139
  • How did you initialize it, what is in the OnInit() and what timeframe,symbol in the tester is used? Also looks like you've edited the code from the newbar paper a little. have you checked the original newbar code? Have you tried to copyRates and match time[i] with K[i] or D[i] – Daniel Kniaz Mar 29 '18 at 09:44
  • I am using `M1` and `EURUSD` pair in testing. I do not need rates at the moment, what I am trying to achieve is get the values of the stochastic. The value at `0th` position is not what is right, as you see in the output. There is nothing in the `OnInit` I am making it done `OnTick()`. As you see in the program – Jaffer Wilson Mar 29 '18 at 09:55
  • @DanielKniaz Where I can find the original code for the isnewBar? Can you get me reference for it for MQL5? – Jaffer Wilson Mar 29 '18 at 10:02
  • You provided a link on MQL5.com articles, the original code is there. – Daniel Kniaz Mar 29 '18 at 10:39
  • If you do not have OnInit() then your code is not initialized I am afraid. you must initialize it somehow I believe, otherwise it might misunderstand the fields. If you use the rates structure, you would be able to see which stoch is referring to which value, and debug the problem – Daniel Kniaz Mar 29 '18 at 10:40
  • Have you check the link I have shared in the question? I guess that is what I am using. – Jaffer Wilson Mar 29 '18 at 11:08
  • @DanielKniaz Can you show me the way for debug? I have tried many things and what you are saying is something new to me. Can you help me with that? – Jaffer Wilson Mar 29 '18 at 11:10

0 Answers0