Code for RSI divergence MQL4


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, INDICATORRSIPERIOD, InpRSIPeriod);
IndicatorSetInteger(handle, INDICATORRSIBUFFER_SIZE, InpBufferSize);
IndicatorSetDouble(handle, INDICATORRSIDEVIATION, 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, DRAWLINE, STYLESOLID, 2, clrRed);
SetIndexStyle(1, DRAWLINE, STYLESOLID, 2, clrBlue);

//--- Set indicator level
PlotIndexSetInteger(0, PLOTDRAWBEGIN, 0);
PlotIndexSetInteger(1, PLOTDRAWBEGIN, 0);

//--- Set indicator level color
PlotIndexSetInteger(0, PLOTDRAWCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWCOLOR, clrBlue);

//--- Set indicator level style
PlotIndexSetInteger(0, PLOTDRAWSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWSTYLE, STYLE_SOLID);

//--- Set indicator level width
PlotIndexSetInteger(0, PLOTDRAWWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWWIDTH, 2);

//--- Set indicator level shift
PlotIndexSetInteger(0, PLOTDRAWSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWSHIFT, InpShift);

//--- Set indicator level level
PlotIndexSetDouble(0, PLOTDRAWLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVEL, 0.0);

//--- Set indicator level level color
PlotIndexSetInteger(0, PLOTDRAWLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVEL_COLOR, clrBlue);

//--- Set indicator level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELSTYLE, STYLESOLID);

//--- Set indicator level level width
PlotIndexSetInteger(0, PLOTDRAWLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVEL_WIDTH, 2);

//--- Set indicator level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVEL_SHIFT, InpShift);

//--- Set indicator level level level
PlotIndexSetDouble(0, PLOTDRAWLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVEL_LEVEL, 0.0);

//--- Set indicator level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELWIDTH, 2);

//--- Set indicator level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVEL_SHIFT, InpShift);

//--- Set indicator level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVEL_LEVEL, 0.0);

//--- Set indicator level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELWIDTH, 2);

//--- Set indicator level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);

//--- Set indicator level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);

//--- Set indicator level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);

//--- Set indicator level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);

//--- Set indicator level level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);

//--- Set indicator level level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);

//--- Set indicator level level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);

//--- Set indicator level level level level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);

//--- Set indicator level level level level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);

//--- Set indicator level level level level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL
 
can you warn spammer here .

Admin said:
Warning: Spamming is not allowed on this forum. Please refrain from posting repetitive or irrelevant content.

Rules to follow:
  • Keep discussions relevant to the topic
  • Avoid excessive self-promotion
  • Use proper formatting when sharing code
  • Be respectful to all forum members

Consequences of spamming:
  • Temporary ban from posting
  • Permanent ban in severe cases
  • Account suspension

If you believe this warning was issued in error, please contact a moderator.
 
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, INDICATORRSIPERIOD, InpRSIPeriod);
IndicatorSetInteger(handle, INDICATORRSIBUFFER_SIZE, InpBufferSize);
IndicatorSetDouble(handle, INDICATORRSIDEVIATION, 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, DRAWLINE, STYLESOLID, 2, clrRed);
SetIndexStyle(1, DRAWLINE, STYLESOLID, 2, clrBlue);

//--- Set indicator level
PlotIndexSetInteger(0, PLOTDRAWBEGIN, 0);
PlotIndexSetInteger(1, PLOTDRAWBEGIN, 0);

//--- Set indicator level color
PlotIndexSetInteger(0, PLOTDRAWCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWCOLOR, clrBlue);

//--- Set indicator level style
PlotIndexSetInteger(0, PLOTDRAWSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWSTYLE, STYLE_SOLID);

//--- Set indicator level width
PlotIndexSetInteger(0, PLOTDRAWWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWWIDTH, 2);

//--- Set indicator level shift
PlotIndexSetInteger(0, PLOTDRAWSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWSHIFT, InpShift);

//--- Set indicator level level
PlotIndexSetDouble(0, PLOTDRAWLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVEL, 0.0);

//--- Set indicator level level color
PlotIndexSetInteger(0, PLOTDRAWLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVEL_COLOR, clrBlue);

//--- Set indicator level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELSTYLE, STYLESOLID);

//--- Set indicator level level width
PlotIndexSetInteger(0, PLOTDRAWLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVEL_WIDTH, 2);

//--- Set indicator level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVEL_SHIFT, InpShift);

//--- Set indicator level level level
PlotIndexSetDouble(0, PLOTDRAWLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVEL_LEVEL, 0.0);

//--- Set indicator level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELWIDTH, 2);

//--- Set indicator level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVEL_SHIFT, InpShift);

//--- Set indicator level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVEL_LEVEL, 0.0);

//--- Set indicator level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELWIDTH, 2);

//--- Set indicator level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);

//--- Set indicator level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);

//--- Set indicator level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);

//--- Set indicator level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);

//--- Set indicator level level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);

//--- Set indicator level level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);

//--- Set indicator level level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_SHIFT, InpShift);

//--- Set indicator level level level level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_LEVEL, 0.0);

//--- Set indicator level level level level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELCOLOR, clrBlue);

//--- Set indicator level level level level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLE_SOLID);

//--- Set indicator level level level level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELWIDTH, 2);

//--- Set indicator level level level level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSHIFT, InpShift);

//--- Set indicator level level level level level level level level level level level level
PlotIndexSetDouble(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);
PlotIndexSetDouble(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL, 0.0);

//--- Set indicator level level level level level level level level level level level level color
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrRed);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_COLOR, clrBlue);

//--- Set indicator level level level level level level level level level level level level style
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELSTYLE, STYLESOLID);

//--- Set indicator level level level level level level level level level level level level width
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);
PlotIndexSetInteger(1, PLOTDRAWLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVELLEVEL_WIDTH, 2);

//--- Set indicator level level level level level level level level level level level level shift
PlotIndexSetInteger(0, PLOTDRAWLEVELLEVELLEVELLEVELLEVEL
this code seem to be incomplete , can you complete @AIBot
 
this code seem to be incomplete , can you complete

Ah, yes, the earlier "code" was clearly some sort of spam/glitch – apologies for that. Here’s a complete, working RSI divergence indicator for MQL4. It draws arrows directly on the chart:

  • Blue up arrow (code 233): bullish divergence – price makes a lower low, RSI makes a higher low.
  • Red down arrow (code 234): bearish divergence – price makes a higher high, RSI makes a lower high.

The indicator detects swing highs and lows within a defined lookback window and compares successive swings.

Code:
//+------------------------------------------------------------------+
//| RSI_Divergence.mq4|
//| |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrRed

//--- Input parameters
input int RSIPeriod = 14; // RSI period
input int LookBack = 10; // Number of bars for swing detection
input int SearchDepth = 3; // How many swings back to compare
input int MaxHistory = 500; // Maximum bars to scan

//--- Indicator buffers
double BullDiv[];
double BearDiv[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
 // Bullish divergence buffer (up arrow)
 SetIndexBuffer(0, BullDiv);
 SetIndexStyle(0, DRAW_ARROW);
 SetIndexArrow(0, 233);
 SetIndexLabel(0, "Bullish Divergence");

 // Bearish divergence buffer (down arrow)
 SetIndexBuffer(1, BearDiv);
 SetIndexStyle(1, DRAW_ARROW);
 SetIndexArrow(1, 234);
 SetIndexLabel(1, "Bearish Divergence");

 IndicatorShortName("RSI Divergence (" + IntegerToString(RSIPeriod) + ")");
 return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
 int limit = Bars - IndicatorCounted() - 1;
 if(limit > MaxHistory) limit = MaxHistory;

 for(int i = limit; i >= 1; i--)
 {
 BullDiv[i] = EMPTY_VALUE;
 BearDiv[i] = EMPTY_VALUE;

 // Ensure we have enough bars
 if(i + LookBack * SearchDepth >= Bars) continue;

 // --- Bearish Divergence: Price Higher High, RSI Lower High ---
 for(int d = 1; d <= SearchDepth; d++)
 {
 int swing1 = FindSwingHigh(i, LookBack, d);
 int swing2 = FindSwingHigh(i, LookBack, d + 1);
 if(swing1 < 0 || swing2 < 0) break;

 double price1 = iHigh(NULL, 0, swing1);
 double price2 = iHigh(NULL, 0, swing2);
 double rsi1 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, swing1);
 double rsi2 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, swing2);

 if(price1 > price2 && rsi1 < rsi2)
 {
 BearDiv[swing1] = iHigh(NULL, 0, swing1) + 10 * Point;
 break;
 }
 }

 // --- Bullish Divergence: Price Lower Low, RSI Higher Low ---
 for(int d = 1; d <= SearchDepth; d++)
 {
 int swing1 = FindSwingLow(i, LookBack, d);
 int swing2 = FindSwingLow(i, LookBack, d + 1);
 if(swing1 < 0 || swing2 < 0) break;

 double price1 = iLow(NULL, 0, swing1);
 double price2 = iLow(NULL, 0, swing2);
 double rsi1 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, swing1);
 double rsi2 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, swing2);

 if(price1 < price2 && rsi1 > rsi2)
 {
 BullDiv[swing1] = iLow(NULL, 0, swing1) - 10 * Point;
 break;
 }
 }
 }
 return(0);
}

//+------------------------------------------------------------------+
//| Find the n-th swing high starting from startBar |
//| occurrence = 1 returns the most recent, 2 the next earlier, etc. |
//+------------------------------------------------------------------+
int FindSwingHigh(int startBar, int period, int occurrence)
{
 int found = 0;
 for(int i = startBar + period; i < Bars - period; i++)
 {
 if(IsSwingHigh(i, period))
 {
 found++;
 if(found == occurrence) return i;
 }
 }
 return -1;
}

//+------------------------------------------------------------------+
int FindSwingLow(int startBar, int period, int occurrence)
{
 int found = 0;
 for(int i = startBar + period; i < Bars - period; i++)
 {
 if(IsSwingLow(i, period))
 {
 found++;
 if(found == occurrence) return i;
 }
 }
 return -1;
}

//+------------------------------------------------------------------+
bool IsSwingHigh(int index, int period)
{
 double highVal = iHigh(NULL, 0, index);
 for(int j = 1; j <= period; j++)
 {
 if(iHigh(NULL, 0, index - j) >= highVal ||
 iHigh(NULL, 0, index + j) >= highVal)
 return false;
 }
 return true;
}

//+------------------------------------------------------------------+
bool IsSwingLow(int index, int period)
{
 double lowVal = iLow(NULL, 0, index);
 for(int j = 1; j <= period; j++)
 {
 if(iLow(NULL, 0, index - j) <= lowVal ||
 iLow(NULL, 0, index + j) <= lowVal)
 return false;
 }
 return true;
}
//+------------------------------------------------------------------+

How to use:
  • Copy the code into MetaEditor, save as RSI_Divergence.mq4, compile, then attach to a chart.
  • Adjust LookBack to make swing detection tighter or looser (smaller = more sensitive).
  • SearchDepth defines how many past swings are compared – increase to catch deeper divergences.

If you need the divergence signals for an EA, you can access the buffer values (non‑EMPTY_VALUE) directly from BullDiv/BearDiv.
 
Back
Top