Функция SymbolSelect() при добавлении большого количества символов в MarketWatch вешает Метатрейдер надолго.

 

Здравствуйте, уважаемые коллеги! Столкнулся с проблемой добавления большого количества символов в MarketWatch. Использую функцию SymbolSelect(),  код такой: 

//Получаем количество всех инструментов брокера
SymbsTotal = SymbolsTotal(false);

//Устанавливаем размер массива для инструментов
ArrayResize(SymbolBuff,SymbsTotal);

//Заполняем массив именами инстументов в цикле
 for( int i=0; i<SymbsTotal; i++ )
  {
    SymbolBuff[i] = SymbolName(i, false);
    
    //Добавление символа в MarketWatch
    SymbolSelect( SymbolBuff[i], true);
  }

И всё вроде хорошо, код работает, но при добавлении большого количества инструментов Метатрейдер вешается на десятки минут, не отвечает вообще ни на какие нажатия, просто зависает. У моего брокера инструментов 4000+ и по всем хочу отслеживать определённые условия для торговли. Ситуация казалось бы копеечная, можно просто самому включить отображение всех симолов в терминале, но могут быть два "Но". Первая ситуация если я сам вдруг выключу какой инструмент или группу инструментов запамятовав что нужно всё отображать или я дам кому-то робота и он выключит отображение символов в MarketWatch, то эксперт просто не будет получать по отключённым парам информацию и соответственно не будет мониторить ситуацию для входа. Есть ли какие-то другие функции или способы решения данной задачи как отобразить все символы программно без подвисания Метатрейдера?

 
Vyktor Ternovskyi:

Здравствуйте, уважаемые коллеги! Столкнулся с проблемой добавления большого количества символов в MarketWatch. Использую функцию SymbolSelect(),  код такой: 

И всё вроде хорошо, код работает, но при добавлении большого количества инструментов Метатрейдер вешается на десятки минут, не отвечает вообще ни на какие нажатия, просто зависает. У моего брокера инструментов 4000+ и по всем хочу отслеживать определённые условия для торговли. Ситуация казалось бы копеечная, можно просто самому включить отображение всех симолов в терминале, но могут быть два "Но". Первая ситуация если я сам вдруг выключу какой инструмент или группу инструментов запамятовав что нужно всё отображать или я дам кому-то робота и он выключит отображение символов в MarketWatch, то эксперт просто не будет получать по отключённым парам информацию и соответственно не будет мониторить ситуацию для входа. Есть ли какие-то другие функции или способы решения данной задачи как отобразить все символы программно без подвисания Метатрейдера.

SymbolSelect не всегда сразу завершается успешно :-( и причём результат сильно зависит от DC и видимотипа счёта (на MetaQuotes Demo редко воспроизводится). Cам с таким несколько дней бился

приходится переповторять с ожиданиями и в несколько попыток, при этом отдавать управление обратно в MT (то есть выходить из OnTick/OnTimer). То есть надо делать очередь, туда заносить символы для Watch, и периодически из неё выбирать и пытаться в SymbolSelect

 
Maxim Kuznetsov:

SymbolSelect не всегда сразу завершается успешно :-( и причём результат сильно зависит от DC и видимотипа счёта (на MetaQuotes Demo редко воспроизводится). Cам с таким несколько дней бился

приходится переповторять с ожиданиями и в несколько попыток, при этом отдавать управление обратно в MT (то есть выходить из OnTick/OnTimer). То есть надо делать очередь, туда заносить символы для Watch, и периодически из неё выбирать и пытаться в SymbolSelect

Ну раз уж ситуация сложная, то подумав насчёт разбиения и очереди и понимания что это тоже не идеальный вариант пришла такая идея, почему бы просто не проверять наличие инструмента и если его нет в MarketWatch, то вместо попыток его добавить просто выдавать уведомление юзеру. Проверив такой алгоритм даже при всего паре включённых инструментов в обзоре рынка, все остальные 4000+ выключил алгоритм справился за доли секунды. Вот строчка кода: 

    //Проверка символа в MarketWatch в цикле
    if ( SymbolInfoDouble(SymbolBuff[i], SYMBOL_BID) = 0 ) Alert("Включи отображение всех символов в MarketWatch, Растяпа!!!");
 
В процессе тестирования всё же один инструмент портил всю малину. Он был в режиме только закрытия позиций и соответственно даже находясь в MarketWatch всё равно возвращал Bid = 0. Пришлось добавить ещё одно условие на проверку режима торговли инструментов. Может кому пригодится ибо подобные вопросы на форуме поднимались. Строка получилась такая: 
    //Проверка символа в MarketWatch в цикле
    if ( SymbolInfoDouble(SymbolBuff[i], SYMBOL_BID) == 0 && SymbolInfoInteger(Symbol(),SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL ) Alert("Включи отображение всех символов в MarketWatch, Растяпа!!!");
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 

А может сто́ит сначала проверить наличие символа в обзоре рынка

  SymbolInfoInteger(SymbolBuff[i], SYMBOL_SELECT);
  SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE);

и только потом вставлять?

 
Alexey Viktorov:

А может сто́ит сначала проверить наличие символа в обзоре рынка

и только потом вставлять?

Вот точно, спасибо за подсказку, добрый человек) Теперь строка получилась как задумывалось без лишних условий: 

    if ( SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE) == false)    Alert("В MarketWatch не отображается символ: "+SymbolBuff[i]);
 
Vyktor Ternovskyi:

Вот точно, спасибо за подсказку, добрый человек) Теперь строка получилась как задумывалось без лишних условий: 

А алерт зачем? Я говорил о добавлении только отсутствующих символов

  bool infoSymbolSelect = SymbolInfoInteger(SymbolBuff[i], SYMBOL_SELECT),
       infoSymbolVisible = SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE);
  if(!infoSymbolSelect || !infoSymbolVisible)
   {
    if(!SymbolSelect(SymbolBuff[i], true))
     {
      // и тут не помешает проверить режим торговли и если торговля запрещена удалить из массива.
     }
   }
 
Alexey Viktorov:

А алерт зачем? Я говорил о добавлении только отсутствующих символов

Потому-что инструментов у моего брокера более 4000+ и при закрытии их всех (достаточно пару клавиш нажать, это не сложно) программное их добавление потом вешает метатрейдер полностью на несколько десятков минут. Ладно ещё я, я понимаю алгоритм и знаю что может случится и что делать. Но если я буду потом распространять этот советник, то неопытный пользователь может не прочитать или забыть про такую особенность, что нельзя скрывать символы из MarketWatch иначе может повиснуть Метатрейдер. Короче конфуз может выйти и человек будет думать что это робот кривой, раз из-за него такие лаги бывают. 

 
Vyktor Ternovskyi:

Потому-что инструментов у моего брокера более 4000+ и при закрытии их всех (достаточно пару клавиш нажать, это не сложно) программное их добавление потом вешает метатрейдер полностью на несколько десятков минут. Ладно ещё я, я понимаю алгоритм и знаю что может случится и что делать. Но если я буду потом распространять этот советник, то неопытный пользователь может не прочитать или забыть про такую особенность, что нельзя скрывать символы из MarketWatch иначе может повиснуть Метатрейдер. Короче конфуз может выйти и человек будет думать что это робот кривой, раз из-за него такие лаги бывают. 

Я-бы сначала проверил добавление после проверки, а потом говорил о тормозах. На счёте демо-открывашка 1500+ без проблем добавляет все символы.

 
Alexey Viktorov:

Я-бы сначала проверил добавление после проверки, а потом говорил о тормозах. На счёте демо-открывашка 1500+ без проблем добавляет все символы.

Хмм. Только что попробовал. Сначала проверка на наличие и только потом если нет, идёт добавление. Убрал 15 инструментов и Метатрейдер секунд на 10-15 завис добавляя их.. 

    if ( SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE) == false) SymbolSelect( SymbolBuff[i], true);
 
Vyktor Ternovskyi:

Хмм. Только что попробовал. Сначала проверка на наличие и только потом если нет, идёт добавление. Убрал 15 инструментов и Метатрейдер секунд на 10-15 завис добавляя их.. 

Зачем вы изобретаете велосипед с колёсами поперёк? Вот именно такая конструкция и не работает.

if(!SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE))
Или ваш вариант
if ( SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE) == false)

Я не могу объяснить причину, но к этому я пришёл после многократных экспериментов и непонимания происходящего. Возьмите полностью блок проверки и впишите проверку и удаление вместо строки «// и тут………» если есть такая необходимость. Или просто сообщение о том, что символ не добавлен.

Причина обращения: