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.