// 1.1 Создаём список рабочих инструментов и заносим их в массив. =========================================================================
int MakeListOfInstruments::CreatWorkingSMBArray (string& fsa_WorkingSMB[], // Возвращаемый массив рабочих инструментов
string fs_ListOfWorkingSMB, // Список рабочих инструментов
string fs_BaseCurrency, // Список базовых валют
string fs_BadCurrency, // "Чёрный" список валют( их пропускаем )
int fi_MAXspread = 0, // Максимальный спред
string fs_Delimiter = ",") // Разделитель элементов в списках
{
ResetLastError();
int li_CntOfSMB = 0;
//---- Формируем лист рабочих символов
if (fs_ListOfWorkingSMB == "")
{
string lsa_AllSymbols[], // Массив с общим количеством торговых инструментов( в зависимости от выбора источника )
lsa_ProperCUR[], // Массив с подходящими торговыми инструментами
lsa_BadCUR[]; // Массив с НЕподходящими торговыми инструментами
int li_CntProperCUR, // Количество подходящих торговых инструментов
li_CntBadCUR, // Количество НЕподходящих торговых инструментов
li_Cnt = 0, // Общее количество торговых инструментов котируемых ДЦ
li_CUR, // Счётчик подходящих торговых инструментов
li_BAD; // Счётчик НЕподходящих торговых инструментов
bool lb_BAD;
//---- Формируем массив из списка базовых валют
li_CntProperCUR = CArraysMan.MakeStrArrayFromLine (fs_BaseCurrency, lsa_ProperCUR, ",");
//---- Формируем массив из "чёрного" списка валют
li_CntBadCUR = CArraysMan.MakeStrArrayFromLine (fs_BadCurrency, lsa_BadCUR, ",");
//---- Получаем перечень доступных символов в окне "Обзор рынка"
li_Cnt = ListOfSMB (lsa_AllSymbols, True);
ArrayResize (fsa_WorkingSMB, li_Cnt);
if (li_CntProperCUR == 0)
{
li_CntProperCUR = 1;
ArrayResize (lsa_ProperCUR, 1);
}
CArraysMan.InitializeArraySTR (fsa_WorkingSMB, "");
Print ("_LastError_1 = ", _LastError);
//---- Оставляем только те инструменты, в которых присутствуют "доминантные" валюты
for (int li_SMB = 0; li_SMB < li_Cnt; li_SMB++)
{
Print ("li_SMB = ", li_SMB);
Print ("_LastError_2 = ", _LastError);
for (li_CUR = 0; li_CUR < li_CntProperCUR; li_CUR++)
{
ResetLastError();
Print ("li_CUR = ", li_CUR);
Print ("_LastError_3 = ", _LastError);
if (StringFind (lsa_AllSymbols [li_SMB], lsa_ProperCUR [li_CUR]) >= 0 || fs_BaseCurrency == "")
{
Print ("_LastError_6 = ", _LastError);
if (li_CntBadCUR > 0)
{
// //---- Фильтруем инструменты через "чёрный" список
lb_BAD = false;
for (li_BAD = 0; li_BAD < li_CntBadCUR; li_BAD++)
{
if (StringFind (lsa_AllSymbols [li_SMB], lsa_BadCUR [li_BAD]) >= 0)
{
lb_BAD = true; break;
}
}
if (lb_BAD) break;
}
// Print ("_LastError_7 = ", _LastError);
//---- Отбрасываем инструменты с "большим" спредом
if (MaxSpread > 0)
{
if ( MarketInfo (lsa_AllSymbols [li_SMB], MODE_SPREAD) > MaxSpread)
break;
}
fsa_WorkingSMB [li_CntOfSMB] = lsa_AllSymbols [li_SMB];
li_CntOfSMB++;
break;
}
}
}
Print ("_LastError_4 = ", _LastError);
ArrayResize (fsa_WorkingSMB, li_CntOfSMB);
}
else
{
li_CntOfSMB = CArraysMan.MakeStrArrayFromLine (fs_ListOfWorkingSMB, fsa_WorkingSMB, ",");
//---- Проверяем на котируемость у ДЦ введённых символов
li_CntOfSMB = CheckPresenceSMBInMarket (fsa_WorkingSMB);
}
//---- Контролируем возможные ошибки
CLogging.Printing (StringConcatenate ("CreatWorkingSMBArray() => ", CErrs.ErrorToString (_LastError)));
//----
return (li_CntOfSMB);
}