Kod do MT5 wyszukujący instrumenty wedlug zadanych kryteriów zawiera błędy: 1.Nie edytować TIMEFRAMES, 2. Brak odświeżania wyszukanych instrumentów zapisanych na wykresie  #property strict
#property version   "3.0"
#property copyright "AI Assistant"

input int EMA_Short_Period = 55;
input int EMA_Fast_Period  = 21;
input int EMA_Slow_Period  = 144;
input ENUM_TIMEFRAMES TF   = PERIOD_H4;

string label_long  = "SYMBOLS_LONG_";
string label_short = "SYMBOLS_SHORT_";


//------------------ POŁĄCZONA FUNKCJA SPRAWDZANIA WARUNKÓW ------------------
void CheckConditions(string symbol, bool &long_condition, bool &short_condition) {
    long_condition  = false;
    short_condition = false;

    // Analizujemy TYLKO zamknięte bary (pomijamy aktualny niezamknięty bar)
    const int bars_needed = 2; // Potrzebujemy 2 zamknięte bary: poprzedni i aktualny
    const int start_pos   = 1; // Rozpoczynamy od bar 1 (bar 0 to aktualny niezamknięty)

    MqlRates rates[];
    if(CopyRates(symbol, TF, start_pos, bars_needed, rates) != bars_needed) 
        return;

    // Pobieramy handle'y wskaźników EMA (jeden raz na symbol)
    int h_short = iMA(symbol, TF, EMA_Short_Period, 0, MODE_EMA, PRICE_CLOSE);
    int h_fast  = iMA(symbol, TF, EMA_Fast_Period,  0, MODE_EMA, PRICE_CLOSE);
    int h_slow  = iMA(symbol, TF, EMA_Slow_Period,  0, MODE_EMA, PRICE_CLOSE);
    
    if(h_short == INVALID_HANDLE || h_fast == INVALID_HANDLE || h_slow == INVALID_HANDLE) {
        if(h_short != INVALID_HANDLE) IndicatorRelease(h_short);
        if(h_fast != INVALID_HANDLE) IndicatorRelease(h_fast);
        if(h_slow != INVALID_HANDLE) IndicatorRelease(h_slow);
        return;
    }

    // Kopiujemy bufory EMA dla zamkniętych barów (takie same jak rates)
    double ema_short[], ema_fast[], ema_slow[];
    bool ok = true;
    ok &= (CopyBuffer(h_short, 0, start_pos, bars_needed, ema_short) == bars_needed);
    ok &= (CopyBuffer(h_fast,  0, start_pos, bars_needed, ema_fast)  == bars_needed);
    ok &= (CopyBuffer(h_slow,  0, start_pos, bars_needed, ema_slow)  == bars_needed);

    // Zwolnienie handle'ów (kluczowe dla wydajności)
    IndicatorRelease(h_short);
    IndicatorRelease(h_fast);
    IndicatorRelease(h_slow);

    if(!ok) return;

    // Indeksy barów: 0 = poprzedni zamknięty, 1 = aktualny zamknięty
    const int prev_bar  = 0;
    const int current_bar = 1;

    // -------------------- WARUNKI LONG --------------------
    bool price_cross_fast_up = (rates[prev_bar].close < ema_fast[prev_bar]) && (rates[current_bar].close > ema_fast[current_bar]);
    bool fast_above_short    = ema_fast[current_bar] > ema_short[current_bar];
    bool fast_above_slow     = ema_fast[current_bar] > ema_slow[current_bar];
    long_condition = price_cross_fast_up && fast_above_short && fast_above_slow;

    // -------------------- WARUNKI SHORT --------------------
    bool price_cross_fast_down = (rates[prev_bar].close > ema_fast[prev_bar]) && (rates[current_bar].close < ema_fast[current_bar]);
    bool fast_below_short      = ema_fast[current_bar] < ema_short[current_bar];
    bool fast_below_slow       = ema_fast[current_bar] < ema_slow[current_bar];
    short_condition = price_cross_fast_down && fast_below_short && fast_below_slow;
}


//------------------ WYŚWIETLANIE SYMBOLI ------------------
void DrawSymbolsListMultiline(string base_label, string header, string &symbols[], int y_offset, color clr) {
    const int chart_id = 0;
    const string prefix = base_label + IntegerToString(ChartID());

    // Usunięcie starych obiektów (maksymalnie 200 symboli)
    for(int i = 0; i < 200; i++) 
        ObjectDelete(chart_id, prefix + "_" + IntegerToString(i));
    
    ObjectDelete(chart_id, prefix + "_header");

    // Nagłówek listy
    string header_obj = prefix + "_header";
    ObjectCreate(chart_id, header_obj, OBJ_LABEL, 0, 0, 0);
    ObjectSetInteger(chart_id, header_obj, OBJPROP_CORNER, CORNER_LEFT_UPPER);
    ObjectSetInteger(chart_id, header_obj, OBJPROP_XDISTANCE, 10);
    ObjectSetInteger(chart_id, header_obj, OBJPROP_YDISTANCE, y_offset);
    ObjectSetInteger(chart_id, header_obj, OBJPROP_COLOR, clr);
    ObjectSetInteger(chart_id, header_obj, OBJPROP_FONTSIZE, 10);
    ObjectSetString(chart_id, header_obj, OBJPROP_TEXT, header);

    // Wyświetlenie symboli
    for(int i = 0; i < ArraySize(symbols); i++) {
        string obj_name = prefix + "_" + IntegerToString(i);
        ObjectCreate(chart_id, obj_name, OBJ_LABEL, 0, 0, 0);
        ObjectSetInteger(chart_id, obj_name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
        ObjectSetInteger(chart_id, obj_name, OBJPROP_XDISTANCE, 10);
        ObjectSetInteger(chart_id, obj_name, OBJPROP_YDISTANCE, y_offset + 20 + i * 15);
        ObjectSetInteger(chart_id, obj_name, OBJPROP_COLOR, clr);
        ObjectSetInteger(chart_id, obj_name, OBJPROP_FONTSIZE, 10);
        ObjectSetString(chart_id, obj_name, OBJPROP_TEXT, symbols[i]);
    }
}


//------------------ TIMER ------------------
void OnTimer() {
    string symbols_long[];
    string symbols_short[];
    const int total_symbols = SymbolsTotal(false); // Tylko symbole z "Obserwowanych rynków"
    ArrayResize(symbols_long, total_symbols);      // Prealokacja tablicy
    ArrayResize(symbols_short, total_symbols);
    int idx_long = 0, idx_short = 0;

    // Przetwarzanie symboli
    for(int i = 0; i < total_symbols; i++) {
        string symbol = SymbolName(i, false); // Pobieranie symbolu z obserwowanych
        if(!SymbolSelect(symbol, true)) continue; // Upewnienie się, że symbol jest aktywny

        bool long_cond = false, short_cond = false;
        CheckConditions(symbol, long_cond, short_cond);

        if(long_cond)  symbols_long[idx_long++]  = symbol;
        if(short_cond) symbols_short[idx_short++] = symbol;
    }

    // Skalowanie tablic do rzeczywistej liczby sygnałów
    ArrayResize(symbols_long, idx_long > 0 ? idx_long : 1);
    ArrayResize(symbols_short, idx_short > 0 ? idx_short : 1);
    if(idx_long == 0)  symbols_long[0]  = "Brak sygnałów";
    if(idx_short == 0) symbols_short[0] = "Brak sygnałów";

    // Wyświetlenie wyników
    DrawSymbolsListMultiline("LONG", "LONG (" + EnumToString(TF) + "):", symbols_long, 30, clrNavy);
    DrawSymbolsListMultiline("SHORT", "SHORT (" + EnumToString(TF) + "):", symbols_short, 350, clrPurple);
}


//------------------ INICJALIZACJA I DEINICJALIZACJA ------------------
int OnInit() {
    EventSetTimer(5); // Sprawdzanie co 5 sekund
    return INIT_SUCCEEDED;
}

void OnDeinit(const int reason) {
    // Usunięcie wszystkich obiektów na zamknięcie
    for(int i = 0; i < 200; i++) {
        ObjectDelete(0, label_long + IntegerToString(ChartID()) + "_" + IntegerToString(i));
        ObjectDelete(0, label_short + IntegerToString(ChartID()) + "_" + IntegerToString(i));
    }
    ObjectDelete(0, label_long + IntegerToString(ChartID()) + "_header");
    ObjectDelete(0, label_short + IntegerToString(ChartID()) + "_header");
    EventKillTimer();
}

void OnTick() {}