Функция SymbolSelect() при добавлении большого количества символов в MarketWatch вешает Метатрейдер надолго.
Здравствуйте, уважаемые коллеги! Столкнулся с проблемой добавления большого количества символов в MarketWatch. Использую функцию SymbolSelect(), код такой:
И всё вроде хорошо, код работает, но при добавлении большого количества инструментов Метатрейдер вешается на десятки минут, не отвечает вообще ни на какие нажатия, просто зависает. У моего брокера инструментов 4000+ и по всем хочу отслеживать определённые условия для торговли. Ситуация казалось бы копеечная, можно просто самому включить отображение всех симолов в терминале, но могут быть два "Но". Первая ситуация если я сам вдруг выключу какой инструмент или группу инструментов запамятовав что нужно всё отображать или я дам кому-то робота и он выключит отображение символов в MarketWatch, то эксперт просто не будет получать по отключённым парам информацию и соответственно не будет мониторить ситуацию для входа. Есть ли какие-то другие функции или способы решения данной задачи как отобразить все символы программно без подвисания Метатрейдера.
SymbolSelect не всегда сразу завершается успешно :-( и причём результат сильно зависит от DC и видимотипа счёта (на MetaQuotes Demo редко воспроизводится). Cам с таким несколько дней бился
приходится переповторять с ожиданиями и в несколько попыток, при этом отдавать управление обратно в MT (то есть выходить из OnTick/OnTimer). То есть надо делать очередь, туда заносить символы для Watch, и периодически из неё выбирать и пытаться в SymbolSelect
SymbolSelect не всегда сразу завершается успешно :-( и причём результат сильно зависит от DC и видимотипа счёта (на MetaQuotes Demo редко воспроизводится). Cам с таким несколько дней бился
приходится переповторять с ожиданиями и в несколько попыток, при этом отдавать управление обратно в MT (то есть выходить из OnTick/OnTimer). То есть надо делать очередь, туда заносить символы для Watch, и периодически из неё выбирать и пытаться в SymbolSelect
Ну раз уж ситуация сложная, то подумав насчёт разбиения и очереди и понимания что это тоже не идеальный вариант пришла такая идея, почему бы просто не проверять наличие инструмента и если его нет в MarketWatch, то вместо попыток его добавить просто выдавать уведомление юзеру. Проверив такой алгоритм даже при всего паре включённых инструментов в обзоре рынка, все остальные 4000+ выключил алгоритм справился за доли секунды. Вот строчка кода:
//Проверка символа в MarketWatch в цикле if ( SymbolInfoDouble(SymbolBuff[i], SYMBOL_BID) = 0 ) Alert("Включи отображение всех символов в MarketWatch, Растяпа!!!");
//Проверка символа в MarketWatch в цикле if ( SymbolInfoDouble(SymbolBuff[i], SYMBOL_BID) == 0 && SymbolInfoInteger(Symbol(),SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL ) Alert("Включи отображение всех символов в MarketWatch, Растяпа!!!");

- www.metatrader5.com
А может сто́ит сначала проверить наличие символа в обзоре рынка
SymbolInfoInteger(SymbolBuff[i], SYMBOL_SELECT); SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE);
и только потом вставлять?
А может сто́ит сначала проверить наличие символа в обзоре рынка
и только потом вставлять?
Вот точно, спасибо за подсказку, добрый человек) Теперь строка получилась как задумывалось без лишних условий:
if ( SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE) == false) Alert("В MarketWatch не отображается символ: "+SymbolBuff[i]);
Вот точно, спасибо за подсказку, добрый человек) Теперь строка получилась как задумывалось без лишних условий:
А алерт зачем? Я говорил о добавлении только отсутствующих символов
bool infoSymbolSelect = SymbolInfoInteger(SymbolBuff[i], SYMBOL_SELECT), infoSymbolVisible = SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE); if(!infoSymbolSelect || !infoSymbolVisible) { if(!SymbolSelect(SymbolBuff[i], true)) { // и тут не помешает проверить режим торговли и если торговля запрещена удалить из массива. } }
А алерт зачем? Я говорил о добавлении только отсутствующих символов
Потому-что инструментов у моего брокера более 4000+ и при закрытии их всех (достаточно пару клавиш нажать, это не сложно) программное их добавление потом вешает метатрейдер полностью на несколько десятков минут. Ладно ещё я, я понимаю алгоритм и знаю что может случится и что делать. Но если я буду потом распространять этот советник, то неопытный пользователь может не прочитать или забыть про такую особенность, что нельзя скрывать символы из MarketWatch иначе может повиснуть Метатрейдер. Короче конфуз может выйти и человек будет думать что это робот кривой, раз из-за него такие лаги бывают.
Потому-что инструментов у моего брокера более 4000+ и при закрытии их всех (достаточно пару клавиш нажать, это не сложно) программное их добавление потом вешает метатрейдер полностью на несколько десятков минут. Ладно ещё я, я понимаю алгоритм и знаю что может случится и что делать. Но если я буду потом распространять этот советник, то неопытный пользователь может не прочитать или забыть про такую особенность, что нельзя скрывать символы из MarketWatch иначе может повиснуть Метатрейдер. Короче конфуз может выйти и человек будет думать что это робот кривой, раз из-за него такие лаги бывают.
Я-бы сначала проверил добавление после проверки, а потом говорил о тормозах. На счёте демо-открывашка 1500+ без проблем добавляет все символы.
Я-бы сначала проверил добавление после проверки, а потом говорил о тормозах. На счёте демо-открывашка 1500+ без проблем добавляет все символы.
Хмм. Только что попробовал. Сначала проверка на наличие и только потом если нет, идёт добавление. Убрал 15 инструментов и Метатрейдер секунд на 10-15 завис добавляя их..
if ( SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE) == false) SymbolSelect( SymbolBuff[i], true);
Хмм. Только что попробовал. Сначала проверка на наличие и только потом если нет, идёт добавление. Убрал 15 инструментов и Метатрейдер секунд на 10-15 завис добавляя их..
Зачем вы изобретаете велосипед с колёсами поперёк? Вот именно такая конструкция и не работает.
if(!SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE)) Или ваш вариант if ( SymbolInfoInteger(SymbolBuff[i], SYMBOL_VISIBLE) == false)
Я не могу объяснить причину, но к этому я пришёл после многократных экспериментов и непонимания происходящего. Возьмите полностью блок проверки и впишите проверку и удаление вместо строки «// и тут………» если есть такая необходимость. Или просто сообщение о том, что символ не добавлен.

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