Buffer won't fully load independently from tick.

To add comments, please log in or register
Axel D
37
Axel D  

Hello! I use a for loop on my indicator and I wonder if there is any way to run all the loops at once, instead of having to wait for every tick to update buffer value. As of this moment, the buffer plotted on chart don't fully load at once, only after a few ticks. Is there a way to have it loaded independently from ticks? Thanks in advance!


#property copyright "user"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line
#property indicator_label1  "line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- indicator buffers

double         line[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

for(int i=0;i<rates_total-10;i++)
     {
      line[i]=Open[i];
      if(0<1)
        {
         if(line[i]>line[i+10])
           {
            line[i]=Open[i];
           }
         else
           {
            if(Open[i]>Open[i+5])
              {
               line[i]=line[i+1];
              }
           }
        }
  }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
//+------------------------------------------------------------------+
Konstantin Nikitin
11950
Konstantin Nikitin  
Why use Open[]? When there is open[]. And also why on every tick count all the bars.
#property copyright "user"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line
#property indicator_label1  "line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- indicator buffers

double         line[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
#ifdef __MQL5__
   ArraySetAsSeries(line,true);
#endif
   SetIndexBuffer(0,line);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
#ifdef __MQL5__
   ArraySetAsSeries(open,true);
#endif

   int limit = prev_calculated==0 || prev_calculated>rates_total ? rates_total-10 : rates_total-prev_calculated;
   if(limit==0)
     limit++;
   for(int i=0;i<limit;i++)
     {
      line[i]=open[i];
      if(0<1)
        {
         if(line[i]>line[i+10])
           {
            line[i]=open[i];
           }
         else
           {
            if(open[i]>open[i+5])
              {
               line[i]=line[i+1];
              }
           }
        }
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

  }
//+------------------------------------------------------------------+

What is it

if(0<1)

Zero is always less than one. Why is this necessary???

William Roeder
18697
William Roeder  
Axel D: instead of having to wait for every tick to update buffer value.
Previously asked and answered.
Axel D
37
Axel D  

Thank you for the answer!

But the problem is still there, the blue line has many gaps when plotted first. It will only get all the missing values after many ticks. How to get all values plotted at once?

https://pasteboard.co/IeZa3Vl.png

Mladen Rakic
136279
Mladen Rakic  
Axel D:

Thank you for the answer!

But the problem is still there, the blue line has many gaps when plotted first. It will only get all the missing values after many ticks. How to get all values plotted at once?

https://pasteboard.co/IeZa3Vl.png

Of course that it has many gaps when you are trying to read future values of open (less problem) and the line buffer (which is casing you the gaps)

Change your code and there will be no gaps

Axel D
37
Axel D  

You mean future values of open by

(open[i]>open[i+5])

I though open[i+5] means five candles back from candle "i", shouldn't that be a past value?

Mladen Rakic
136279
Mladen Rakic  
Axel D:

You mean future values of open by

I though open[i+5] means five candles back from candle "i", shouldn't that be a past value?

See your loop direction (from future to past)

No gaps code :

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   int limit=rates_total-prev_calculated+1; if (limit>=rates_total) limit=rates_total-1; 
   for(int i=limit;i>=0;i--)
   {
      line[i]=Open[i];
      if (i<rates_total-10)
         if(line[i]>line[i+10])
               line[i]=Open[i];
         else
            if(Open[i]>Open[i+5])
               line[i]=line[i+1];
   }
   return(rates_total);
}
William Roeder
18697
William Roeder  
  1. Axel D: I though open[i+5] means five candles back from candle "i", shouldn't that be a past value?
    Think again. There is a difference between the arrays passed to OnCalculate (e.g. low[]) and the MT4 predefined variables (e.g. Low[].) The predefined variables are all ordered AsSeries. The passed arrays have no default direction.
    To determine the indexing direction of time[], open[], high[], low[], close[], tick_volume[], volume[] and spread[], call ArrayGetAsSeries(). In order not to depend on default values, you should unconditionally call the ArraySetAsSeries() function for those arrays, which are expected to work with.
              Event Handling Functions - Functions - Language Basics - MQL4 Reference

  2. line[i]=Open[i];
    Why did you post your MT4 question in the Root / MT5 General section instead of the MQL4 section, (bottom of the Root page?)
              General rules and best pratices of the Forum. - General - MQL5 programming forum
    Next time post in the correct place. The moderators will likely move this thread there soon.

  3. Please don't post a link to or attach an image, just insert the image.
              Messages Editor

Konstantin Nikitin
11950
Konstantin Nikitin  

If he carefully looked at my code, he should see

#ifdef __MQL5__
   ...;
#endif
P.S. I honestly. Didn't quite understand he wants to count. It seems simple. Somehow wisely
Logic, let him correct how he wants.
To add comments, please log in or register