//+------------------------------------------------------------------+
//|                                                  LIT - Timing   |
//|                                             Generated by ChatGPT |
//+------------------------------------------------------------------+
#property indicator_chart_window

// Input parameters
input int HideTFAbove = 59; // Hide Boxes on TF above (Minutes)
input bool show_asia = true; // Show Asian Session
input bool show_lon = true;  // Show London Session
input bool show_nyt = true;  // Show NY Session

input color asia_color = Purple; // Asian Fill Color
input color asia_line_color = Violet; // Asian Line Color
input color lon_color = clrDarkGray;  // London Fill Color
input color nyt_color = clrDarkGray;  // NY Fill Color

// Global variables
datetime asia_time_start = 0;
datetime lon_time_start = 0;
datetime nyt_time_start = 0;

//+------------------------------------------------------------------+
//| Custom functions                                                 |
//+------------------------------------------------------------------+

// Function to get session highs and lows
void GetSessionHighLow(bool session_active, bool start, double &out high_session, double &out low_session)
{
    static double hh, ll;
    if (session_active)
    {
        if (High > hh || start)
            hh = High;
        if (Low < ll || start)
            ll = Low;
    }
    high_session = hh;
    low_session = ll;
}

// Function to create session boxes and lines
void CreateSessionBox(datetime start_T, int hours, bool session_active, double h, double l, color fillColor, bool drawLines, color lineColor)
{
    if (session_active)
    {
        int timeDelta = Time[0] - Time[1];
        int endShift = hours * 60 * 60;
        int box_dev = ObjectCreate(0, "box_dev", OBJ_RECTANGLE, 0, start_T, l, start_T + endShift, h);
        ObjectSetInteger(0, "box_dev", OBJPROP_COLOR, fillColor);
        if (ObjectFind("box_dev") != -1)
            ObjectDelete("box_dev");

        if (drawLines)
        {
            double m = (h + l) / 2;
            int h_line = ObjectCreate(0, "h_line", OBJ_TREND, 0, start_T, h, start_T + endShift * 2, h);
            int m_line = ObjectCreate(0, "m_line", OBJ_TREND, 0, start_T, m, start_T + endShift * 2, m);
            int l_line = ObjectCreate(0, "l_line", OBJ_TREND, 0, start_T, l, start_T + endShift * 2, l);
            if (ObjectFind("h_line") != -1)
                ObjectDelete("h_line");
            if (ObjectFind("m_line") != -1)
                ObjectDelete("m_line");
            if (ObjectFind("l_line") != -1)
                ObjectDelete("l_line");
        }
    }
}

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    double asia_h, asia_l, lon_h, lon_l, nyt_h, nyt_l;
    double TFMinutes = (Time[0] - Time[1]) / 60;

    bool asia_session_active = TFMinutes <= HideTFAbove && show_asia && iTime(NULL, PERIOD_CURRENT, 0) == asia_time_start;
    bool lon_session_active = TFMinutes <= HideTFAbove && show_lon && iTime(NULL, PERIOD_CURRENT, 0) == lon_time_start;
    bool nyt_session_active = TFMinutes <= HideTFAbove && show_nyt && iTime(NULL, PERIOD_CURRENT, 0) == nyt_time_start;

    bool asia_start = asia_session_active && asia_time_start == 0;
    bool lon_start = lon_session_active && lon_time_start == 0;
    bool nyt_start = nyt_session_active && nyt_time_start == 0;

    GetSessionHighLow(asia_session_active, asia_start, asia_h, asia_l);
    GetSessionHighLow(lon_session_active, lon_start, lon_h, lon_l);
    GetSessionHighLow(nyt_session_active, nyt_start, nyt_h, nyt_l);

    CreateSessionBox(asia_time_start, 475, asia_session_active, asia_h, asia_l, asia_color, true, asia_line_color);
    CreateSessionBox(lon_time_start, 60, lon_session_active, lon_h, lon_l, lon_color, false, clrBlack);
    CreateSessionBox(nyt_time_start, 60, nyt_session_active, nyt_h, nyt_l, nyt_color, false, clrBlack);
}

//+------------------------------------------------------------------+
