Ошибки, баги, вопросы - страница 3726
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Обновил сегодня код в кодобазе. Основная версия английская.
Видимо сотрудники сайта сделали переводы на другие языки, с дубликатами кода. После обновления в англ. версии там остались старые версии кода.
Мне теперь версии на всех языках обновлять вручную? Нельзя ли один файл использовать для всех языковых версий? Ведь не все и знают, что их версии кто-то перевел и продублировал. В кодобазе наверное уже каша новых и старых версий на разных языках.
Тут странная ситуация. В коде BuyStop выставляется в двух местах, все внутри OnTick, и только если is_trade_time_1 || is_trade_time_2
is_trade_time_1 и 2 определяются в начале Ontick. В конце OnTick is_trade_time_1 и is_trade_time_2 выводятся в коммент. В тестере видно что значения false но происходит выставление BuyStop.
это в версии_25. В версии _26 сделал только вывод в печать значений is_trade_time_1 и is_trade_time_2, и очудо, если оба времени false, то не выставляет.
Моя пользовательская функция Recv(), на входе сразу делает проверку на доступность данных для чтения SocketIsReadable
если данных нет, выходим из Recv().
То есть реализуется логика неблокирующего чтения.
Но оказалось, что SocketIsReadable содержит скрытое, нигде не описанное в документации ожидание, на размер системного таймера, примерно 15 ms.
Например, если мы точно знаем, что в системный сокет приходит ровно одно сообщение (не пачка),
то функция SocketIsReadable мгновенно возвращает управление. На первый взгляд проблем нет.
Но когда мы используем универсальную вычитку, для (одного или пачки сообщений) в цикле while с проверкой на пустую строку,
мы сталкиваемся с скрытым ожиданием.
Мы знаем, что в сокет приходит одно сообщение. Но строим логику вычитки на цикле для перестраховки.
На первой while итерации сообщение есть в сокете, SocketIsReadable мгновенно вернёт управление, проблем нет.
На второй while итерации, проверяем пустую строку из Recv(), чтоб завершить цикл.
Вот тут и возникает нигде неописанный таймаут SocketIsReadable
Когда в сокете уже нечего читать, SocketIsReadable блокируется на размер системного таймера.
Что приводит к блокировке выполнения всего остального кода на 15 мс.
Функция
не применима к SocketIsReadable.
Убедительно прошу, вывести в параметр функции SocketIsReadable(socket, 0) управление значением select
Так как текущее поведение блокирует выполнение функции на размер системного таймера, когда в сокете нечего читать.
Или вообще выставить select на постоянный ноль. Так как по сути, в mql5 вся логика строиться на неблокирующих вызовах.
Скорее всего и в SocketTlsReadAvailable есть ожидание данных из сокета, на размер системного таймера.
Прошу не предлагать снизить системный таймер принудительно, проблема в блокировке а не в системном таймере.
@Renat Fatkhullin
Чтобы более была понятна проблема, покажу наглядно.
Вот вычитка инкрементного стакана с возможной максимальной глубиной стакана 1500 уровней на каждую сторону.
В коммент выводятся только лучшие пять уровней для наглядности, но само обновление может происходить по любым уровням из 1500 на сторону.
Источник, шлёт чётко по одному сообщению обновления.
вычитку инкрементных обновлений, но по одному сообщению за проход, выполняет ProcessReadDOM
и в среднем время обработки ProcessReadDOM занимает всего 130 микросекунд.
А вот вычитка из другого источника, только лучших уровней bid/ask.
То есть присылается всего два лучших уровня.
Но источник может слать сообщения пачками от 1 до 15 за раз
соответственно вычитка происходит в цикле за проход
и что мы наблюдаем?
как среднее время вычитки резко стала похожа на системный таймер.
И это из за того, что SocketIsReadable тупо блокирует на ожидании данных из сокета, когда их уже нет.
Проверил свой системный таймер, он оказывается итак установлен на 1 мс, вроде не понижал с момента установки ОС
может Win11 изначально ставит такой системный таймер х.з. не в этом суть.
Суть в том, что в функции SocketIsReadable жестко выставлен select() с не нулевым таймаутом, и скорее всего выставлен на 15 мс.
Прошу выставить select() в ноль.
Вопрос по терминалу мт4 - есть ли возможность зафиксировать сервер, к которому подключается терминал? некоторые серверы недоступны(скорее всего их блочит ркн), терминал их перебирает видимо сам и в рандомный момент перестает принимать котировки..