Wrong Parameters

 

 Tried coding a script in mq5. But it is giving me 2 errors .

1. 'iRSI' - wrong parameters count SPIKE CATCHER.mq5 57 25

   built-in: int iRSI(const string,ENUM_TIMEFRAMES,int,int) SPIKE CATCHER.mq5 57 25

 

2. 'iRSI' - wrong parameters count SPIKE CATCHER.mq5 91 30

   built-in: int iRSI(const string,ENUM_TIMEFRAMES,int,int) SPIKE CATCHER.mq5 91 30

    


here is the code


//+------------------------------------------------------------------+
//|                                                     SpikeCatcher.mq5|
//|                        Copyright 2024, Mainokai                  |
//|                                    https://www.mainokai.com    |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

// Indicator buffers
double SpikeBuffer[];
double SignalBuffer[];

// Input parameters
input int RSI_Period = 14;                 // RSI period
input int Volume_Period = 20;              // Volume period for moving average
input double VolumeThreshold = 50.0;       // Threshold for low volume (percentage)
input int DivergenceDepth = 5;             // Lookback depth for divergence
input int RSI_Level = 30;                  // RSI level to confirm oversold conditions

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   // Set indicator buffers
   SetIndexBuffer(0, SpikeBuffer);
   SetIndexBuffer(1, SignalBuffer);
   
   IndicatorSetString(INDICATOR_SHORTNAME, "SpikeCatcher");
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);

   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[])
  {
   if(rates_total < RSI_Period + DivergenceDepth)
      return(0);
   
   int limit = rates_total - prev_calculated;
   for(int i = limit - 1; i >= 0; i--)
     {
      // Calculate RSI
      double rsiValue = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, i);
      
      // Calculate Volume Moving Average
      double avgVolume = 0;
      for(int j = 0; j < Volume_Period; j++)
         avgVolume += (double)tick_volume[i + j];
      avgVolume /= Volume_Period;
      
      // Check for RSI divergence and low selling volume
      if(CheckDivergence(i, rsiValue) && (double)tick_volume[i] < avgVolume * VolumeThreshold / 100.0)
        {
         SpikeBuffer[i] = low[i];  // Mark spike on the indicator buffer
         SignalBuffer[i] = RSI_Level; // Display RSI level on the indicator window
        }
      else
        {
         SpikeBuffer[i] = 0;
         SignalBuffer[i] = 0;
        }
     }
   
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Check for RSI divergence                                         |
//+------------------------------------------------------------------+
bool CheckDivergence(int i, double rsiValue)
  {
   if(i < DivergenceDepth)
      return(false);
   
   // Get the current and previous lows and corresponding RSI values
   double currentLow = iLow(NULL, 0, i);
   double previousLow = iLow(NULL, 0, i + DivergenceDepth);
   double previousRsiValue = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, i + DivergenceDepth);
   
   // Check for bullish divergence (price making lower lows, RSI making higher lows)
   if(currentLow < previousLow && rsiValue > previousRsiValue && rsiValue < RSI_Level)
      return(true);
   
   return(false);
  }
//+------------------------------------------------------------------+

 
innocent Orapeleng: 1. 'iRSI' - wrong parameters count SPIKE CATCHER.mq5 57 25
      double rsiValue = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, i);

That is a MT4 call, not MT5.

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.

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)

 

Rushing too far ahead. In programming, you have to get one thing working at a time. Once you have a valid handle, and you are able to print one RSI value (let's say the latest value), only then should you continue.

You can't write a full script before checking that everything is working correctly from bottom to top. You have to learn how to read an API as well. No programmer can escape that.


Let's break down the important details from the programmers manual:

iRSI
The function returns the handle of the Relative Strength Index indicator. It has only one buffer.

int  iRSI(
   string              symbol,            // symbol name
   ENUM_TIMEFRAMES     period,            // period
   int                 ma_period,         // averaging period
   ENUM_APPLIED_PRICE  applied_price      // type of price or handle
   );


First important point: 

It has only one buffer.


Next important detail:

int  iRSI(
   string            
   ENUM_TIMEFRAMES     
   int                
   ENUM_APPLIED_PRICE  
   );

I see the types that are valid arguments for iRSI. 1. String 2. ENUM_TIMEFRAMES 3. int 4. ENUM_APPLIED_PRICE



Next important detail:

Return Value

Returns the handle of a specified technical indicator,  in case of failure returns INVALID_HANDLE. The computer memory can be freed from an indicator that is no more utilized, using the IndicatorRelease() function, to which the indicator handle is passed.


I now know that this function returns a handle code, it does not return the RSI value.


So how do you get RSI values into an array? 

Pay attention to the example given in the manual



https://www.mql5.com/en/docs/indicators/irsi


Don't feel stupid, we all tried to jump the bandwagon once or twice, but the result of doing so is a lot of pain and headache if you don't follow the correct approach. By writing this, I'm (hopefully) saving you from future mistakes like this

 
Documentation on MQL5: Timeseries and Indicators Access / IndicatorRelease
Documentation on MQL5: Timeseries and Indicators Access / IndicatorRelease
  • www.mql5.com
The function removes an indicator handle and releases the calculation block of the indicator, if it's not used by anyone else. Return Value Returns...