SYMBOL_SELECT
Czy instrument znajduje się w oknie Rynek. To jest najczęstsza przyczyna kodu wielosymbolowego, który „nic nie robi".
long SymbolInfoInteger(string symbol, SYMBOL_SELECT);
1 fragment kodu z tej strony przeszedł przez kompilator MetaEditor build 6090, 2026-08-05.
Terminal pobiera kwotowania i historię wyłącznie dla instrumentów obecnych w oknie Rynek. Instrument spoza tej listy istnieje, ale nie ma świeżych danych.
Dlaczego to nie jest oczywiste
To jest najczęstsza przyczyna kodu wielosymbolowego, który „nic nie robi". SymbolInfoTick na instrumencie spoza okna Rynek zwraca fałsz albo dane sprzed nieokreślonego czasu, CopyRates zwraca zero świec, a Bars zwraca zero — i żadna z tych funkcji nie zgłasza, że przyczyną jest brak subskrypcji.
SymbolSelect(symbol, true) dodaje instrument do listy, ale nie czeka na pobranie danych. Terminal robi to asynchronicznie i pierwsze wywołania po dodaniu i tak zwrócą pustkę. Poprawna reakcja to wyjście i ponowna próba przy kolejnym ticku, nigdy pętla z czekaniem.
Kod
bool PrzygotujSymbol(const string symbol)
{
if(!(bool)SymbolInfoInteger(symbol, SYMBOL_SELECT))
{
if(!SymbolSelect(symbol, true))
{
PrintFormat("Nie udalo sie dodac %s do okna Rynek, blad %d",
symbol, GetLastError());
return false;
}
//--- dane dojda za chwile, dzis jeszcze nie handlujemy tym symbolem
return false;
}
MqlTick tick;
if(!SymbolInfoTick(symbol, tick))
return false;
//--- kwotowanie starsze niz minuta traktujemy jak brak danych
return (TimeCurrent() - tick.time <= 60);
}