Проблема перевода с МТ4 на МТ5. Или, точнее, невозможность без'ошибочного исполнения некоторых алгоритмов в МТ5. - страница 4

 
Eugeni Neumoin:

С  OnCalculate()  не проблема. Весь графический интерфейс работает через OnChartEvent() . Кнопок графического интерфейса более 400. Часть кнопок никаким образом не взаимодействует с таймсериями. Функции OnCalculate() и OnTrade() могут подождать и до следующего тика. Психологически это незаметно. А вот с OnChartEvent() сложнее. Здесь подключается психология человека. Пользователь программы нажимает на кнопку графического интерфейса. И не получает желаемого ответа. Какова его реакция? Одна из реакций - нажимает вторично на ту же кнопку. У меня сделано так, что второе нажатие на многие из кнопок отключает функционал, подключенной этой кнопкой. Предвижу Ваше предложение сделать отключение действия кнопки каким-то другим образом. Но есть эта же программа для МТ4. Там все работает нормально. Получится, что в МТ4 один алгоритм взаимодействия с графическим интерфейсом, а в МТ5 - другой. Такое поведение одной и той же программы вызовет только отторжение.

При переводе на МТ5 что-то подобное делал - включал выход из OnChartEvent(). Не хочу соврать, что именно из-за этого графический интерфейс просто умирал.

Да, и у меня обращение к таймсериям в OnTimer() происходит через 5 минут. Сделаю через 2 минуты. Проверю, что будет происходить.

Артем, Ваши предложения и ранее были полезными.

Нет, предложения изменять логику работы с графикой конечно же не будет - кроссплатформенный код должен работать одинаково.

  1. Обращение к таймсериям нужно делать не реже одного раза в две минуты - только в этом случае будет гарантировано их постоянное актуальное состояние. Т.е., в мульти-... индикаторах эта часть кода обязана быть по умолчанию.
  2. В MQL5 в отличие от MQL4 нужно обновлять график при помощи CartRedraw() для отображения изменения графики после всех необходимых манипуляций со всеми графическими объектами, которые можно обновить за один раз - чтобы после каждого изменения одного элемента не обновлять график. Не знаю, понятно ли я выразил мысль. Например, если пользователь нажал на кнопку, и что-то при этом должно нарисоваться дополнительно, например, стожный объект, состоящий из нескольких элементов, то нужно нарисовать все элементы, и только потом один раз обновить график. А не обновлять после каждого нарисованного элемента одного объекта.
    Вполне может быть так, что когда пользователь нажал на кнопку, но не видит ничего, то на самом деле всё есть, только график не обновлён ещё (он сам обновится только с приходом тика)
 
Artyom Trishkin:

Нет, предложения изменять логику работы с графикой конечно же не будет - кроссплатформенный код должен работать одинаково.

Единственное, что могу предложить для доработки кнопок - это то, что в любом случае, когда нужная таймсерия ещё не доступна, то всё равно нет возможности на её данных строить графику. В этом случае нужно ждать момента, когда данные станут доступны, а на время ожидания делать кнопки неактивными, например - делать их по подобию интерфейсов виндовс: если не доступно действие по кнопке, то кнопка серая. Такая логика может присутствовать для обеих платформ - чтобы не было различий в коде.

 

ChartRedraw() у меня задействуется при выходе из крупных блоков, например, из OnChartEvent() и из других. То есть с этой функцией все нормально.

Про всплывающие подсказки. Они являются только  как бы индикаторами того, что при нажатии на номер или символ все сработает.

Если кликаешь мышью по номеру и символу, то должен сработать один из элементов OnChartEvent() - CHARTEVENT_OBJECT_CLICK. Он не срабатывает, если не появляется всплывающая подсказка. Здесь бы понять, почему так происходит. Не срабатывает CHARTEVENT_OBJECT_CLICK.

А за доступом к таймсериям буду следить плотно.

 
Eugeni Neumoin:

ChartRedraw() у меня задействуется при выходе из крупных блоков, например, из OnChartEvent() и из других. То есть с этой функцией все нормально.

Про всплывающие подсказки. Они являются только  как бы индикаторами того, что при нажатии на номер или символ все сработает.

Если кликаешь мышью по номеру и символу, то должен сработать один из элементов OnChartEvent() - CHARTEVENT_OBJECT_CLICK. Он не срабатывает, если не появляется всплывающая подсказка. Здесь бы понять, почему так происходит. Не срабатывает CHARTEVENT_OBJECT_CLICK.

А за доступом к таймсериям буду следить плотно.

В самом начале обработчика событий графика выведите в журнал параметр sparam - тогда на любое действие будет выводиться информация. Далее начните ограничивать вывод - если есть событие щелчка по объекту (id== CHARTEVENT_OBJECT_CLICK), то выведите sparam в журнал. И так потихоньку дойдёте до причины.

 
Artyom Trishkin:

В самом начале обработчика событий графика выведите в журнал параметр sparam - тогда на любое действие будет выводиться информация. Далее начните ограничивать вывод - если есть событие щелчка по объекту (id== CHARTEVENT_OBJECT_CLICK), то выведите sparam в журнал. И так потихоньку дойдёте до причины.

Именно таким образом все и отлаживал. И в коде кусочки для отладки в OnChartEvent()  постоянно присутствуют в закоментированном виде.  Но, спасибо. Так и сделаю. Поищу причину.
 

Чтобы не было проблем с привязкой к номерам и символам, необходимо повысить приоритет номеров и символов с помощью OBJPROP_ZORDER.

В МТ4 работает без этого. Но и в МТ4 на всякий случай повысил приоритет. Причем приоритет волновых символов сделал больше, чем у номеров.

С этим разобрался.

Дергание всех таймсерий через 2 минуты - подбираю разные варианты для наиболее гладкого выполнения этой задачи.

Процесс пошел...

 
Eugeni Neumoin:

Чтобы не было проблем с привязкой к номерам и символам, необходимо повысить приоритет номеров и символов с помощью OBJPROP_ZORDER.

В МТ4 работает без этого. Но и в МТ4 на всякий случай повысил приоритет. Причем приоритет волновых символов сделал больше, чем у номеров.

С этим разобрался.

Дергание всех таймсерий через 2 минуты - подбираю разные варианты для наиболее гладкого выполнения этой задачи.

Процесс пошел...

Гладкость тут никак :)
Просто нужно не реже одного раза в две минуты обращаться ко всем рабочим тф. Я обычно обращаюсь каждые 90 секунд. Можете разнести время обращения для разных тф чтобы все разом не дёргать. Но к каждому - не реже озвученного интервала.
 
Artyom Trishkin:
Гладкость тут никак :)
Просто нужно не реже одного раза в две минуты обращаться ко всем рабочим тф. Я обычно обращаюсь каждые 90 секунд. Можете разнести время обращения для разных тф чтобы все разом не дёргать. Но к каждому - не реже озвученного интервала.

Тут тормоза.

Но приходится мириться с тем, что есть.

Необъятное обнять не возможно.)

 
Artyom Trishkin:
Гладкость тут никак :)
Просто нужно не реже одного раза в две минуты обращаться ко всем рабочим тф. Я обычно обращаюсь каждые 90 секунд. Можете разнести время обращения для разных тф чтобы все разом не дёргать. Но к каждому - не реже озвученного интервала.

Разносить нельзя. Если хотя бы по одному тф не будет обновлено, индикатор может некоторые граф. построения сделать некорректно. 

С другой стороны, делал проверки доступности таймсерий перед функциями ОнКалькуляте и ОнЧартЕвент. Как предлагалось.

Обновление таймсерий и проверки доступности таймсерий вызывают сильные тормоза.

Все-таки получаются прерывания  доступа к таймсериям. Как и говорил при создании ветки в одном из первых постов. Это подтверждает то, что приходится программно обновлять таймсерии.

Это первое.

Второе. Почему сделано так, что каждому разработчику приходится мучаться с организацией доступа к таймсериям?

Почему не создан какой-то дополнительный "механизм" исключающий эти мучения? 

Если кому-то необходимы эти мучения, никто не запрещает использовать то, что сейчас есть. А для тех, кто считает, что универсальный альтернативный доступ к таймсериям устраивает, лучше, чтобы такой доступ был сделан разработчиками.

У меня несколько человек просили перевести с МТ4 на МТ5 программу. Перевел. Меня этот перевод не устраивает. Но пока, скачавшие программу, не жалуются. Может и их устраивает. Хотя сомневаюсь в этом.

От себя же добавлю. Прекращаю экспериментировать с оптимизацией доступа к таймсериям. Это непродуктивное использование времени. Есть и более интересные занятия. Пусть, кому это интересно, работают с МТ5. Единственное, что из МТ5 можно выгрызть - историю котировок. Для использования в обучении НС.

 
Eugeni Neumoin:

С другой стороны, делал проверки доступности таймсерий перед функциями ОнКалькуляте и ОнЧартЕвент. Как предлагалось.

Обновление таймсерий и проверки доступности таймсерий вызывают сильные тормоза.

Предлагалось делать это по таймеру раз в полторы минуты. А никак не перед каждым тиком, и тем более — не по событию чарта.

Доступ к таймсериям в МТ5 действительно не идеальный. Но если нужно решить задачу, а не найти оправдание, то это возможно.