//+------------------------------------------------------------------+
//|                                                 3D Oscillator.mq4|
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Author - Luis Damiani. Ramdass - Conversion only"

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_width1  3
#property indicator_color2 Red
#property indicator_width2  3
#property indicator_color3 Lime
#property indicator_width3  3
#property indicator_color4 Red
#property indicator_width4  3

// Add levels to the indicator
#property indicator_level1 0
#property indicator_levelcolor clrRed
#property indicator_width1 2
#property indicator_level2 50
#property indicator_level3 -50
#property indicator_level4 100
#property indicator_level5 -100

//---- input parameters
extern int D1RSIPer = 13;
extern int D2StochPer = 8;
extern int D3tunnelPer = 8;
extern double hot = 0.4;
extern int sigsmooth = 4;

//---- buffers
double sig1n[];
double sig2n[];
double upX[], dnX[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
    string short_name;
    //---- indicator line
    SetIndexStyle(0, DRAW_LINE);
    SetIndexStyle(1, DRAW_LINE);
    SetIndexBuffer(0, sig1n);
    SetIndexBuffer(1, sig2n);

    SetIndexStyle(2, DRAW_ARROW);
    SetIndexArrow(2, 159);
    SetIndexBuffer(2, upX);
    SetIndexStyle(3, DRAW_ARROW);
    SetIndexArrow(3, 159);
    SetIndexBuffer(3, dnX);
    //----
    SetIndexDrawBegin(0, D1RSIPer + D2StochPer + D3tunnelPer + hot + sigsmooth);
    SetIndexDrawBegin(1, D1RSIPer + D2StochPer + D3tunnelPer + hot + sigsmooth);
    SetIndexDrawBegin(2, D1RSIPer + D2StochPer + D3tunnelPer + hot + sigsmooth);
    SetIndexDrawBegin(3, D1RSIPer + D2StochPer + D3tunnelPer + hot + sigsmooth);

    //----
    return (0);
}
//+------------------------------------------------------------------+
//| 3D Oscillator                                                     |
//+------------------------------------------------------------------+
int start() {
    int i, i2, counted_bars = IndicatorCounted();
    double rsi, maxrsi, minrsi, storsi, E3D, sig1, sig2, sk, ss, sk2;
    double cs;
    bool init = true;

    //----
    cs = D1RSIPer + D2StochPer + D3tunnelPer + hot + sigsmooth;
    if (Bars <= cs) return (0);

    ss = sigsmooth;
    if (ss < 2) ss = 2;
    sk = 2 / (ss + 1);
    sk2 = 2 / (ss * 0.8 + 1);
    init = false;

    //---- initial zero
    if (counted_bars < 1) {
        for (i = 1; i <= cs; i++) sig1n[Bars - i] = 0.0;
        for (i = 1; i <= cs; i++) sig2n[Bars - i] = 0.0;
        for (i = 1; i <= cs; i++) upX[Bars - i] = 0.0;
        for (i = 1; i <= cs; i++) dnX[Bars - i] = 0.0;
    }

    i = Bars - cs - 1;

    if (counted_bars >= cs) i = 300;
    while (i >= 0) {
        rsi = iRSI(NULL, 0, D1RSIPer, PRICE_CLOSE, i);
        maxrsi = rsi;
        minrsi = rsi;

        for (i2 = i + D2StochPer; i2 >= i; i2--) {
            rsi = iRSI(NULL, 0, D1RSIPer, PRICE_CLOSE, i2);
            if (rsi > maxrsi) maxrsi = rsi;
            if (rsi < minrsi) minrsi = rsi;
        }

        storsi = ((rsi - minrsi) / (maxrsi - minrsi) * 200 - 100);
        E3D = hot * iCCI(NULL, 0, D3tunnelPer, PRICE_TYPICAL, i) + (1 - hot) * storsi;
        sig1n[i] = sk * E3D + (1 - sk) * sig1;
        sig2n[i] = sk2 * sig1 + (1 - sk2) * sig2;
        sig1 = sig1n[i];
        sig2 = sig2n[i];

        if (sig1n[i] > sig2n[i] && sig1n[i + 1] < sig2n[i + 1]) upX[i] = sig2n[i] - 15;
        if (sig1n[i] < sig2n[i] && sig1n[i + 1] > sig2n[i + 1]) dnX[i] = sig2n[i] + 15;

        i--;
    }

    return (0);
}
//+------------------------------------------------------------------+
