Canvas - это круто! - страница 97

 
Doerk Hilger #:

почему нет структуры со всеми данными метрик сразу?

К сожалению, этого почти нигде нет: PositionGet*, OrderGet*, HistoryOrderGet*, HistoryDealGet*, SymbolInfoGet*, ChartGet*, ...

В торговом терминале нельзя гарантировано получить снимок открытых позиций/ордеров, снимок Обзора рынка. MT5...

 
Реter Konow #:
Поддерживаю. Я также столкнулся с задержкой событий CHARTEVENT_CHART_CHANGE. Также при переключении графиков стандартная функция ChartGetInteger возвращает неверные размеры графика. Происходит это следующим образом: при переключении графика событие CHARTEVENT_CHART_CHANGE приходит в функцию OnChartEvent() более одного раза и в одном из вызовов этой функции возвращает неверные размеры графика. Я напишу код для воспроизведения этого в свободное время.

Все, что вы можете сделать, это самостоятельно часто проверять график, буферизовать все данные, сравнивать их с текущими и самостоятельно вызывать событие. Я делаю это каждую секунду, а если кнопка мыши нажата, то каждые 100 мс.
Другого выхода нет, пока MetaQuotes не исправит эту фигню. Я мучаюсь с этим уже несколько лет и уже перестал верить, что кто-нибудь об этом позаботится.

 
fxsaber #:

К сожалению, этого почти нигде нет: PositionGet*, OrderGet*, HistoryOrderGet*, HistoryDealGet*, SymbolInfoGet*, ChartGet*, .....

Невозможно получить гарантированный снимок открытых позиций/ордеров, снимок Market Watch в торговом терминале. MT5...

Также, да. В любом случае, это должно быть общим способом. Полагаю, это происходит из-за совместимости кода с MT4, где все это было в одном потоке, но не имеет смысла в MT5 вообще.

 
Doerk Hilger #:

Холст - это круто , но только теоретически!

Почему? Ни один из приведенных примеров не является реалистичным, поскольку в коде приходится часто проверять график самостоятельно, фактически каждый тик, так как во многих случаях при изменении графика не срабатывает CHARTEVENT_CHART_CHANGE. Одним из таких случаев является рост новых свечей в самом низу графика вниз или в самом верху вверх. В этот момент и в случае использования CCanvas в области графика все становится недействительным, ни одна цена больше не совпадает.

И чтобы сохранить точность, вам нужно использовать ChartGetInteger или ChartGetDouble для max- или min-цены и даже других данных метрики графика, каждый тик. НО: Один вызов этой функции занимает до тысячи миллисекунд. А куча вызовов, естественно, занимает секунды и просто замораживает все.

Я не понимаю, почему эта штука до сих пор не исправлена. Ни пропажа событий, ни проблема с таймингом. И почему для таких принципиально важных вещей, как метрики графика, которые нужны просто для визуальной точности, почему нет структуры со всеми данными метрик сразу, если факт, что есть проблема с таймингом при каждом вызове?

Проверьте это - шесть лет назад, всем наплевать.

https://www.mql5.com/en/forum/326220

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий 

Ошибки, баги, вопросы

Renat Fatkhullin, 2020.06.14 13:40

Работа (Get/Set методы) с чартом у MQL5 программ идет через транзакционную очередь.

Это позволяет развязать работу GUI и самого терминала от неминуемых блокировок, которые устраивали(устраивают) бы MQL5 программы.

Транзакционная асинхронность позволяет массово быстро писать или читать в разделенных режимах и мгновенно включает режим синхронизации при смешении Set и Get методов.

То есть, лучше 1000 раз сделать асинхронные Set, а потом 1000 раз Get вместо того, чтобы делать поочередные Get & Set, превращая очередь в синхронный процесс. Потому что надо удостовериться, что предыдущий асинхронный Set точно наложился и теперь можно его читать.


Нужно аккуратно пользоваться системными функциями и кешировать их по возможности.

Ренат предложил самостоятельно кешировать параметры чарта.

Нежелание MQ создавать кешированные таблицы параметров на стороне потока пользователя (в том числе и для параметров чарта) считаю колосальной ошибкой.

Секрет успеха движка V8 от Google как раз кроется, в  том числе,  в создании подобных таблиц.

Как результ, MT5 часто выглядит лагающим даже для опытных программистов.
 
Nikolai Semko #:

Ренат предложил кэшировать параметры графика самостоятельно.

Я считаю нежелание MQ создавать кэшированные таблицы параметров на стороне пользовательского потока (в том числе для параметров графика) колоссальной ошибкой.

Секрет успеха движка V8 от Google заключается именно в создании таких таблиц.

В результате МТ5 часто выглядит лагающим даже для опытных программистов.

Дело не в кэшировании, а в проверке и валидации. Даже если MQL не кэширует график, он должен быть признан недействительным, а значит, CHARTEVENT_CHART_CHANGE неизбежен. Я не могу сам эффективно проверять метрики графика, для этого нужен таймер на 1 мс для частой проверки, поэтому CHARTEVENT_CHART_CHANGE предусмотрен, но он просто не отражает всех изменений. Иногда он также просто забывает о них. Это баг, проверенный и легко тестируемый.

Кроме того: Когда кому-то нужна максимальная цена, ему также нужна и минимальная цена, и минимальное время, и максимальное время и т.д. Вам никогда не нужно только одно значение, вам нужны все. Поэтому необходимо предусмотреть функцию, которая заполнит struct всеми данными сразу. Таким образом, будет легко кэшировать и находить изменения.

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

Факт.

Эффективный код был бы таким:
ChartMetricsStruct cm;	// Shoud be a datatype of MQL!

OnChartEvent(int id, .....)
        {
        if (id==CHARTEVENT_CHART_CHANGE)
                {
                ChartMetricsStruct cm_new;
		// Missing function of MQL
                ChartGetStruct(chart_id, cm_new);	
                if (cm!=cm_new)
                        {
                        cm=cm_new;
                        // Do whatever is necessary when metrics have changed
                        }
                }
        }
...а текущий обходной путь состоит из OnTimer(), использования 20 раз ChartGetDouble() и ChartGetInteger() внутри таймера, сравнения значения за значением, заполнения struct одиночными значениями и т.д. Почти 200 строк кода внутри таймера просто выясняют, изменились ли метрики графика или нет.

Это просто ужасно.
 
Ренат все еще активен в этой теме?
 
Doerk Hilger #:

Дело не в кэшировании, а в проверке и валидации. Даже если MQL не кэширует график, он должен быть признан недействительным, а значит - CHARTEVENT_CHART_CHANGE неизбежен. Я не могу сам эффективно проверять метрики графика, для этого нужен таймер на 1 мс для частой проверки, поэтому CHARTEVENT_CHART_CHANGE предусмотрен, но он просто не отражает всех изменений. Иногда он также просто забывает о них. Это баг, проверенный и легко тестируемый.

...

Где код для воспроизведения этой проблемы?

 
Друзья, я смотрю тут редкая ветка, где собрались профи, а не любители поболтать. Вопрос такой: надо сделать торговую панель, которая работала бы в тестере. Как вы знаете, MQL5 не обрабатывает OnChartEvent в тестере, в отличие от устаревшего МТ4. Я вчера искал в маркете и почти на всех ТП есть предупреждение, что они не работают в тестере. Я подумал, может сделать не через 
<Controls\Dialog.mqh>

а через рисование в Canvas и отслеживание щелканье мышки по координатам? Мысль сырая, так что не пинайте сильно.

 
Alexey Volchanskiy #:
Друзья, я смотрю тут редкая ветка, где собрались профи, а не любители поболтать. Вопрос такой: надо сделать торговую панель, которая работала бы в тестере. Как вы знаете, MQL5 не обрабатывает OnChartEvent в тестере, в отличие от устаревшего МТ4. Я вчера искал в маркете и почти на всех ТП есть предупреждение, что они не работают в тестере. Я подумал, может сделать не через 

а через рисование в Canvas и отслеживание щелканье мышки по координатам? Мысль сырая, так что не пинайте сильно.

если делать через DLL то всё работает :-)

на правда Canvas тут не при чём...

PS/ точнее - работает ровно до моментов взаимодействий с чартом. Диалоги любые, хоть в браузер, но интерактивно двигать линию на чарте невозможно...ChartEvent и всё что с ним зарезано

 
Alexey Volchanskiy #:

не пинайте сильно.

На базе MT5 имеются самодельные Тестеры (на базе терминала, а не штатного тестера), где вы можете не только на кнопки нажимать, но и использовать все индикаторы, графические объекты и даже возвращаться по времени обратно и управлять ценой. Т.е. возможности значительно превосходят MT4 и решения вне MQ-системы. Без DLL, конечно.