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 to_copy = (rates_total - prev_calculated) * (prev_calculated < rates_total) + (1) * (prev_calculated == rates_total);
CopyBuffer(RSIHandle, 0, 0, to_copy, ExtRSIBuffer);
//--- ZigZagExtremaOnBuffer.mqh calculation function
ZZOnBuffer(rates_total, prev_calculated, ExtRSIBuffer, ExtOutputBuffer, InpSearchMode, InpDepth, InpDeviation, InpBackstep);
return(rates_total);
}
To get only highs or only lows there is an additional input of type EnSearchmode:
//+------------------------------------------------------------------+
//| ZigZag calculation |
//+------------------------------------------------------------------+
int ZZOnBuffer(const int rates, //On a non indicator array, Arraysize can be used as 'rates_total'
const int calculated,
const double &src[], //source buffer for calculation
double &dst[], //destination buffer for calculation buffer
EnSearchMode mode_search, //Set output buffer to High only, Low only or both in
const int &depth,
const int &deviation,
const int &backstep //ZZ input parameters
) { ...
...
Only Highs:
Only Lows:
Both highs and lows in one buffer:
It is not restricted to indicator buffers, you can use it on any array, just set "rates" to the length of the array instead of rates_total.
The absolute minimum number of bars that this function can hadle is 100. So although you can use this calculation function on an array of a few hundred bars, in indicator buffers, rates_total is usually a few thousand.