//+------------------------------------------------------------------+
//|                                                   CustomRSI.mq5  |
//|                        Copyright 2024, Your Name                 |
//|                                         https://www.mql5.com     |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Violet
#property indicator_color2 Yellow
#property indicator_color3 Red
#property indicator_color4 Green

// Inputs
input int rsiLengthInput = 14;
input ENUM_APPLIED_PRICE rsiSourceInput = PRICE_CLOSE;
input ENUM_MA_METHOD maTypeInput = MODE_SMA;
input int maLengthInput = 14;
input double bbMultInput = 2.0;
input bool showDivergence = false;

// Buffers
double rsiBuffer[];
double rsiMABuffer[];
double bbUpperBandBuffer[];
double bbLowerBandBuffer[];

int OnInit() {
    SetIndexBuffer(0, rsiBuffer);
    SetIndexBuffer(1, rsiMABuffer);
    SetIndexBuffer(2, bbUpperBandBuffer);
    SetIndexBuffer(3, bbLowerBandBuffer);

    IndicatorShortName("Relative Strength Index");
    SetIndexLabel(0, "RSI");
    SetIndexLabel(1, "RSI-based MA");
    SetIndexLabel(2, "Upper Bollinger Band");
    SetIndexLabel(3, "Lower Bollinger Band");

    return INIT_SUCCEEDED;
}

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 < rsiLengthInput + maLengthInput)
        return 0;

    for (int i = prev_calculated; i < rates_total; i++) {
        double rsi = iRSI(NULL, 0, rsiLengthInput, rsiSourceInput, i);
        rsiBuffer[i] = rsi;

        rsiMABuffer[i] = iMAOnArray(rsiBuffer, rates_total, maLengthInput, 0, maTypeInput, i);

        if (maTypeInput == MODE_SMA) {  // Bollinger Bands
            double stddev = iStdDevOnArray(rsiBuffer, rates_total, maLengthInput, 0, MODE_SMA, i);
            bbUpperBandBuffer[i] = rsiMABuffer[i] + bbMultInput * stddev;
            bbLowerBandBuffer[i] = rsiMABuffer[i] - bbMultInput * stddev;
        } else {
            bbUpperBandBuffer[i] = 0;
            bbLowerBandBuffer[i] = 0;
        }
    }

    // Divergence detection (this part requires additional logic to implement fully)
    if (showDivergence) {
        // Implement divergence detection logic here
    }

    return rates_total;
}
