Function to get highest OBV value within 1000bars. Please help

 

Hi, I wrote a function to get the highest obv value for the last  1000 bars. 
However, I got an incorrect return. (It's returning 0)


Can anyone see the issue? Please help :


void OnStart()
  {
//---
//      
      string            symbol         = "EURUSD";
      ENUM_TIMEFRAMES   timeframe      = PERIOD_M1;
      
   
       double answer = GetHighestOBV(symbol,timeframe,1000);
       Print("Highest OBV is ", answer);
//      

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


//+------------------------------------------------------------------+
//| A function to find the highest OBV over the last 1000 bars.      |
//| It returns the highest value, or 0 on error.                     |
//+------------------------------------------------------------------+
double GetHighestOBV(string symbol, ENUM_TIMEFRAMES timeframes,int totalBars)
{
   int obv_handle;
   

   obv_handle = iOBV(symbol,timeframes, VOLUME_REAL);
   
   if(obv_handle == INVALID_HANDLE)
   {
      Print("OBV handle creation error. Error code: ", GetLastError());
      return 0; // Return 0 to indicate an error
   }
   
   double obv_data[];
   ArraySetAsSeries(obv_data, true);
   

   int datacopied = CopyBuffer(obv_handle, 0, 1, totalBars, obv_data);
   

   IndicatorRelease(obv_handle);
   
   if(datacopied <= 0)
   {
      Print("Error: No data was copied from the OBV buffer. Copied: ", datacopied);
      return 0; // Return 0 to indicate an error
   }
   
   Print("Total data points copied from OBV indicator: ", datacopied);
   

   double max_obv = ArrayMaximum(obv_data, 0, datacopied);
   

   return max_obv;
}
 
DebblieLoganCan anyone see the issue? .

Perhaps you should read the manual, especially the examples.
   How To Ask Questions The Smart Way. (2004)
      How To Interpret Answers.
         RTFM and STFW: How To Tell You've Seriously Screwed Up.

  1.   obv_handle = iOBV(symbol,timeframes, VOLUME_REAL);
       double obv_data[];
       ArraySetAsSeries(obv_data, true);
       int datacopied = CopyBuffer(obv_handle, 0, 1, totalBars, obv_data);
       IndicatorRelease(obv_handle);

    They all (including iCustom) return a handle (an int). You get that in OnInit. In OnTick/OnCalculate/OnStart (after the indicator has updated its buffers), you use the handle, shift and count to get the data.
              Technical Indicators - Reference on algorithmic/automated trading language for MetaTrader 5
              Timeseries and Indicators Access / CopyBuffer - Reference on algorithmic/automated trading language for MetaTrader 5
              How to start with MQL5 - General - MQL5 programming forum - Page 3 #22 (2020)
              How to start with MQL5 - MetaTrader 5 - General - MQL5 programming forum - Page 7 #61 (2020)
              MQL5 for Newbies: Guide to Using Technical Indicators in Expert Advisors - MQL5 Articles (2010)
              How to call indicators in MQL5 - MQL5 Articles (2010)

  2.    double max_obv = ArrayMaximum(obv_data, 0, datacopied);
    

    ArrayMaximum does not return a double.