Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
почему нет структуры со всеми данными метрик сразу?
К сожалению, этого почти нигде нет: PositionGet*, OrderGet*, HistoryOrderGet*, HistoryDealGet*, SymbolInfoGet*, ChartGet*, ...
В торговом терминале нельзя гарантировано получить снимок открытых позиций/ордеров, снимок Обзора рынка. MT5...
Поддерживаю. Я также столкнулся с задержкой событий CHARTEVENT_CHART_CHANGE. Также при переключении графиков стандартная функция ChartGetInteger возвращает неверные размеры графика. Происходит это следующим образом: при переключении графика событие CHARTEVENT_CHART_CHANGE приходит в функцию OnChartEvent() более одного раза и в одном из вызовов этой функции возвращает неверные размеры графика. Я напишу код для воспроизведения этого в свободное время.
Все, что вы можете сделать, это самостоятельно часто проверять график, буферизовать все данные, сравнивать их с текущими и самостоятельно вызывать событие. Я делаю это каждую секунду, а если кнопка мыши нажата, то каждые 100 мс.
Другого выхода нет, пока MetaQuotes не исправит эту фигню. Я мучаюсь с этим уже несколько лет и уже перестал верить, что кто-нибудь об этом позаботится.
К сожалению, этого почти нигде нет: PositionGet*, OrderGet*, HistoryOrderGet*, HistoryDealGet*, SymbolInfoGet*, ChartGet*, .....
Невозможно получить гарантированный снимок открытых позиций/ордеров, снимок Market Watch в торговом терминале. MT5...
Также, да. В любом случае, это должно быть общим способом. Полагаю, это происходит из-за совместимости кода с MT4, где все это было в одном потоке, но не имеет смысла в MT5 вообще.
Холст - это круто , но только теоретически!
Почему? Ни один из приведенных примеров не является реалистичным, поскольку в коде приходится часто проверять график самостоятельно, фактически каждый тик, так как во многих случаях при изменении графика не срабатывает 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 как раз кроется, в том числе, в создании подобных таблиц.
Ренат предложил кэшировать параметры графика самостоятельно.
Я считаю нежелание MQ создавать кэшированные таблицы параметров на стороне пользовательского потока (в том числе для параметров графика) колоссальной ошибкой.
Секрет успеха движка V8 от Google заключается именно в создании таких таблиц.
Дело не в кэшировании, а в проверке и валидации. Даже если MQL не кэширует график, он должен быть признан недействительным, а значит, CHARTEVENT_CHART_CHANGE неизбежен. Я не могу сам эффективно проверять метрики графика, для этого нужен таймер на 1 мс для частой проверки, поэтому CHARTEVENT_CHART_CHANGE предусмотрен, но он просто не отражает всех изменений. Иногда он также просто забывает о них. Это баг, проверенный и легко тестируемый.
Кроме того: Когда кому-то нужна максимальная цена, ему также нужна и минимальная цена, и минимальное время, и максимальное время и т.д. Вам никогда не нужно только одно значение, вам нужны все. Поэтому необходимо предусмотреть функцию, которая заполнит struct всеми данными сразу. Таким образом, будет легко кэшировать и находить изменения.
Все остальное, особенно в том виде, в котором это происходит сейчас, с отсутствующими событиями, является чистой - и огромной - тратой производительности.
Факт.
Эффективный код был бы таким:...а текущий обходной путь состоит из OnTimer(), использования 20 раз ChartGetDouble() и ChartGetInteger() внутри таймера, сравнения значения за значением, заполнения struct одиночными значениями и т.д. Почти 200 строк кода внутри таймера просто выясняют, изменились ли метрики графика или нет.
Это просто ужасно.
Дело не в кэшировании, а в проверке и валидации. Даже если MQL не кэширует график, он должен быть признан недействительным, а значит - CHARTEVENT_CHART_CHANGE неизбежен. Я не могу сам эффективно проверять метрики графика, для этого нужен таймер на 1 мс для частой проверки, поэтому CHARTEVENT_CHART_CHANGE предусмотрен, но он просто не отражает всех изменений. Иногда он также просто забывает о них. Это баг, проверенный и легко тестируемый.
...Где код для воспроизведения этой проблемы?
а через рисование в Canvas и отслеживание щелканье мышки по координатам? Мысль сырая, так что не пинайте сильно.
Друзья, я смотрю тут редкая ветка, где собрались профи, а не любители поболтать. Вопрос такой: надо сделать торговую панель, которая работала бы в тестере. Как вы знаете, MQL5 не обрабатывает OnChartEvent в тестере, в отличие от устаревшего МТ4. Я вчера искал в маркете и почти на всех ТП есть предупреждение, что они не работают в тестере. Я подумал, может сделать не через
а через рисование в Canvas и отслеживание щелканье мышки по координатам? Мысль сырая, так что не пинайте сильно.
если делать через DLL то всё работает :-)
на правда Canvas тут не при чём...
PS/ точнее - работает ровно до моментов взаимодействий с чартом. Диалоги любые, хоть в браузер, но интерактивно двигать линию на чарте невозможно...ChartEvent и всё что с ним зарезано
не пинайте сильно.
На базе MT5 имеются самодельные Тестеры (на базе терминала, а не штатного тестера), где вы можете не только на кнопки нажимать, но и использовать все индикаторы, графические объекты и даже возвращаться по времени обратно и управлять ценой. Т.е. возможности значительно превосходят MT4 и решения вне MQ-системы. Без DLL, конечно.