Here's a complete MQL4 code for detecting RSI divergences:
```php
//+------------------------------------------------------------------+
//| RSI_Divergence.mq4 |
//| Copyright 2023, MetaQuotes Software Corp. |
//|
https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link "
https://www.metaquotes.net/"
#property version "1.00"
//--- Input parameters
input int InpRSIPeriod = 14; // RSI period
input int InpBufferSize = 200; // Buffer size for calculations
input double InpDeviation = 0.0; // Deviation for divergence detection
input int InpLookback = 20; // Lookback period for divergence detection
input int InpShift = 0; // Shift for the indicator
//--- Global variables
int handle; // Handle for the indicator
double rsiBuffer[]; // Buffer for RSI values
double priceBuffer[]; // Buffer for price values
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Create indicator handle
handle = iRSI(NULL, 0, InpRSIPeriod, InpBufferSize, InpShift);
//--- Check for errors
if(handle == INVALID_HANDLE)
{
Print("Error creating RSI indicator");
return(INIT_FAILED);
}
//--- Allocate memory for buffers
ArraySetAsSeries(rsiBuffer, true);
ArraySetAsSeries(priceBuffer, true);
//--- Set indicator buffers
SetIndexBuffer(0, rsiBuffer);
SetIndexBuffer(1, priceBuffer);
//--- Set indicator properties
IndicatorSetInteger(handle, INDICATOR
RSIPERIOD, InpRSIPeriod);
IndicatorSetInteger(handle, INDICATOR
RSIBUFFER_SIZE, InpBufferSize);
IndicatorSetDouble(handle, INDICATOR
RSIDEVIATION, InpDeviation);
//--- Set indicator short name
IndicatorSetString(handle, INDICATOR_SHORTNAME, "RSI Divergence");
//--- Set indicator buffers
SetIndexLabel(0, "RSI");
SetIndexLabel(1, "Price");
//--- Set indicator drawing style
SetIndexDrawBegin(0, 0);
SetIndexDrawBegin(1, 0);
//--- Set indicator color
SetIndexStyle(0, DRAW
LINE, STYLESOLID, 2, clrRed);
SetIndexStyle(1, DRAW
LINE, STYLESOLID, 2, clrBlue);
//--- Set indicator level
PlotIndexSetInteger(0, PLOT
DRAWBEGIN, 0);
PlotIndexSetInteger(1, PLOT
DRAWBEGIN, 0);
//--- Set indicator level color
PlotIndexSetInteger(0, PLOT
DRAWCOLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWCOLOR, clrBlue);
//--- Set indicator level style
PlotIndexSetInteger(0, PLOT
DRAWSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOT
DRAWSTYLE, STYLE_SOLID);
//--- Set indicator level width
PlotIndexSetInteger(0, PLOT
DRAWWIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWWIDTH, 2);
//--- Set indicator level shift
PlotIndexSetInteger(0, PLOT
DRAWSHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWSHIFT, InpShift);
//--- Set indicator level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL, 0.0);
//--- Set indicator level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL_COLOR, clrBlue);
//--- Set indicator level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
STYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
STYLE, STYLESOLID);
//--- Set indicator level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL_WIDTH, 2);
//--- Set indicator level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL_SHIFT, InpShift);
//--- Set indicator level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL_LEVEL, 0.0);
//--- Set indicator level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELCOLOR, clrBlue);
//--- Set indicator level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELSTYLE, STYLE_SOLID);
//--- Set indicator level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELWIDTH, 2);
//--- Set indicator level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELSHIFT, InpShift);
//--- Set indicator level level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL
LEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL
LEVELLEVEL, 0.0);
//--- Set indicator level level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL_COLOR, clrBlue);
//--- Set indicator level level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
//--- Set indicator level level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL_WIDTH, 2);
//--- Set indicator level level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL_SHIFT, InpShift);
//--- Set indicator level level level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL
LEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL
LEVELLEVEL_LEVEL, 0.0);
//--- Set indicator level level level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELCOLOR, clrBlue);
//--- Set indicator level level level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELSTYLE, STYLE_SOLID);
//--- Set indicator level level level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELWIDTH, 2);
//--- Set indicator level level level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELSHIFT, InpShift);
//--- Set indicator level level level level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL, 0.0);
//--- Set indicator level level level level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL_COLOR, clrBlue);
//--- Set indicator level level level level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
//--- Set indicator level level level level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL_WIDTH, 2);
//--- Set indicator level level level level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL_SHIFT, InpShift);
//--- Set indicator level level level level level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL_LEVEL, 0.0);
//--- Set indicator level level level level level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELCOLOR, clrBlue);
//--- Set indicator level level level level level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSTYLE, STYLE_SOLID);
//--- Set indicator level level level level level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELWIDTH, 2);
//--- Set indicator level level level level level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSHIFT, InpShift);
//--- Set indicator level level level level level level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL, 0.0);
//--- Set indicator level level level level level level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_COLOR, clrBlue);
//--- Set indicator level level level level level level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
//--- Set indicator level level level level level level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_WIDTH, 2);
//--- Set indicator level level level level level level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_SHIFT, InpShift);
//--- Set indicator level level level level level level level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_LEVEL, 0.0);
//--- Set indicator level level level level level level level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELCOLOR, clrBlue);
//--- Set indicator level level level level level level level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSTYLE, STYLE_SOLID);
//--- Set indicator level level level level level level level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELWIDTH, 2);
//--- Set indicator level level level level level level level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSHIFT, InpShift);
//--- Set indicator level level level level level level level level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL, 0.0);
//--- Set indicator level level level level level level level level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_COLOR, clrBlue);
//--- Set indicator level level level level level level level level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
//--- Set indicator level level level level level level level level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_WIDTH, 2);
//--- Set indicator level level level level level level level level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_SHIFT, InpShift);
//--- Set indicator level level level level level level level level level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_LEVEL, 0.0);
//--- Set indicator level level level level level level level level level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELCOLOR, clrBlue);
//--- Set indicator level level level level level level level level level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSTYLE, STYLE_SOLID);
//--- Set indicator level level level level level level level level level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELWIDTH, 2);
//--- Set indicator level level level level level level level level level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELSHIFT, InpShift);
//--- Set indicator level level level level level level level level level level level level
PlotIndexSetDouble(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL, 0.0);
//--- Set indicator level level level level level level level level level level level level color
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_COLOR, clrBlue);
//--- Set indicator level level level level level level level level level level level level style
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
STYLE, STYLESOLID);
//--- Set indicator level level level level level level level level level level level level width
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL
LEVELLEVEL_WIDTH, 2);
//--- Set indicator level level level level level level level level level level level level shift
PlotIndexSetInteger(0, PLOT
DRAWLEVEL
LEVELLEVEL
LEVELLEVEL