Дело не в кэшировании, а в проверке и валидации. Даже если MQL не кэширует график, он должен быть признан недействительным, а значит, CHARTEVENT_CHART_CHANGE неизбежен. Я не могу сам эффективно проверять метрики графика, для этого нужен таймер на 1 мс для частой проверки, поэтому CHARTEVENT_CHART_CHANGE предусмотрен, но он просто не отражает всех изменений. Иногда он также просто забывает о них. Это баг, проверенный и легко тестируемый.
Кроме того: Когда кому-то нужна максимальная цена, ему также нужна и минимальная цена, и минимальное время, и максимальное время и т.д. Вам никогда не нужно только одно значение, вам нужны все. Поэтому необходимо предусмотреть функцию, которая заполнит struct всеми данными сразу. Таким образом, будет легко кэшировать и находить изменения.
Все остальное, особенно в том виде, в котором это происходит сейчас, с отсутствующими событиями, является чистой - и огромной - тратой производительности.
Факт.
Эффективный код был бы таким:
У меня это давно реализовано в библиотеке iCanvas.
автоматически заполняется один экземпляр W структуры Window при каждом событии CHARTEVENT_CHART_CHANGE
struct Window {
long ChartId; // current window identifieruint Color; // window background colorint Width; // window widthint Height; // window heightint height[]; // sub_windows heightint Left_bar; // number of the leftmost bar in the windowdouble Right_bar; // number of the rightmost bar in the windowdouble Total_bars; // the maximum number of bars in the windowint BarsInWind; // number of visible bars in the windowdouble Y_min; // The minimum value of the price in the windowdouble Y_max; // The maximum value of the price in the windowdouble dy_pix; // price change for one pixelint dx_pix; // changing the number of bars per pixelint MouseX; // coordinate X of the current position of the mouse pointerint MouseY; // coordinate Y of the current position of the mouse pointerdouble MouseBar; // the current bar position of the mouse pointerdouble MousePrice; // the current price of the mouse pointerdatetime MouseTime; // the current time of the mouse pointer
mouse_status MouseStatus; // 5 values: NO_PRESSED, LEFT_BUTTON_PRESSED,RIGHT_BUTTON_PRESSED, LEFT_AND_RIGHT_BUTTONS_PRESSED, KEY_PRESSEDint IdEvent; // id value of the last eventlong lparam; // last lparamint MouseSubWin; // number of the subwindow in which the mouse pointer is locatedint WindowsTotal;// total subwindows, including the main windowint SubWin; // current subwindowint DPI; // Screen DPIbool ActiveWin; // Active windowbool ChangeActive;// if true ActiveWin was changed in last CHARTEVENT_CHART_CHANGEdatetime time[]; // array of opening time of all visible bars in the window
};
PS/ точнее - работает ровно до моментов взаимодействий с чартом. Диалоги любые, хоть в браузер, но интерактивно двигать линию на чарте невозможно...ChartEvent и всё что с ним зарезано
DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?
На базе MT5 имеются самодельные Тестеры (на базе терминала, а не штатного тестера), где вы можете не только на кнопки нажимать, но и использовать все индикаторы, графические объекты и даже возвращаться по времени обратно и управлять ценой. Т.е. возможности значительно превосходят MT4 и решения вне MQ-системы. Без DLL, конечно.
Я собираюсь сделать панель для Маркета, так что нужен стандартный тестер. Или придется делать демо-версию для проверки панели на демо-счете.
DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?
Я собираюсь сделать панель для Маркета, так что нужен стандартный тестер. Или придется делать демо-версию для проверки панели на демо-счете.
да, придётся хоть что-нибудь да делать а не только собираться :-)
сначала сделать панель и потом дать тестово-демонстрационную версию. Потому-что в тестере оно не работает by-design.
DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?
Я собираюсь сделать панель для Маркета, так что нужен стандартный тестер. Или придется делать демо-версию для проверки панели на демо-счете.
В тестере никакая нормальная панель работать не будет. Тем более на канвасе. Есть убогие решения для МТ4, но для МТ5 нет. Однако в МТ4 можно наладить связь между тестером и графиком через ресурс. Я делал это и все работало. После перехода на МТ5 повторить тот же трюк не пытался. Наладить связь между советниками через ресурсы в МТ5 сложнее. Они могут только читать информацию в ресурсах друг друга, но не писать. Такое "общение" проблематично. Но главная проблема в другом. Неизвестно будет ли работать этот механизм между советником в тестере MT5 и панелью на графике МТ5. Чтобы проверить эту теорию нужно попробовать что-нибудь записать в ресурс из советника в тестере, и затем прочитать написанное через советника на графике. Если удасться - значит будет работать нормально и можно писать решение. Но я сильно сомневаюсь что это получится. Скорее всего из тестера МТ5 невозможно читать ресурс.
В тестере никакая нормальная панель работать не будет. Тем более на канвасе. Есть убогие решения для МТ4, но для МТ5 нет. Однако в МТ4 можно наладить связь между тестером и графиком через ресурс. Я делал это и все работало. После перехода на МТ5 повторить тот же трюк не пытался. Наладить связь между советниками через ресурсы в МТ5 сложнее. Они могут только читать информацию в ресурсах друг друга, но не писать. Такое "общение" проблематично. Но главная проблема в другом. Неизвестно будет ли работать этот механизм между советником в тестере MT5 и панелью на графике МТ5. Чтобы проверить эту теорию нужно попробовать что-нибудь записать в ресурс из советника в тестере, и затем прочитать написанное через советника на графике. Если удасться - значит будет работать нормально и можно писать решение. Но я сильно сомневаюсь что это получится. Скорее всего из тестера МТ5 невозможно читать ресурс.
У меня скальпер 2-х платформенный. Используются кнопки с классом, производным от стандартного CButton. Проверка состояния кнопки проводится стандартно в OnChartEvent. Никаких убогих решений, все стандартно. И линии стандартные Horizontal Line. В тестере МТ4 все работает, в МТ5 нет. Отсюда и возник пост, наверняка же кто-то победил эту бяку с тестером МТ5.
У меня скальпер 2-х платформенный. Используются кнопки с классом, производным от стандартного CButton. Проверка состояния кнопки проводится стандартно в OnChartEvent. Никаких убогих решений, все стандартно. И линии стандартные Horizontal Line. В тестере МТ4 все работает, в МТ5 нет. Отсюда и возник пост, наверняка же кто-то победил эту бяку с тестером МТ5.
Через ресурс можно передавать большой обьем информации из тестера в советник на графике и торговать с помощью панели руками тоже. Система безусловно более сложная чем проверка состояний кнопок "мертвой" панели в тестере, но возможностей с ней на порядок больше.
Реter Konow #: Через ресурс можно передавать большой обьем информации из тестера в советник на графике и торговать с помощью панели руками тоже. Система безусловно более сложная чем проверка состояний кнопок "мертвой" панели в тестере, но возможностей с ней на порядок больше.
Где бы почитать про ресурсы, а то я по нулям, не нужны были. Может, у вас есть пример?
Где бы почитать про ресурсы, а то я по нулям, не нужны были. Может, у вас есть пример?
О ресурсах можно почитать в документации где о них подробно рассказано. Другие источники информации вероятно существуют, но не искал. Примеров создания ресурсов много, но вряд ли найдете статьи где разобрана тема связывания советника в тестере МТ4 с его копией на графике. Я воплотил свою идею не зная делал ли кто то подобное до меня. Возможно да, но может и нет. В любом случае практический пример в коде показать не могу, т.к. механизм коммуникации советников был жестко интегрирован в мой графический движок и в качестве самостоятельного решения для общественного использования его не оформлял.
Однако при желании можете справится с этой задачей. Изучите тему ресурсов, разработайте протокол передачи информации между советниками, напишите простенький вариант, тестируйте и развивайте решение.
Для упаковки сообщений в ресурс советую использовать строки (string) и массив union. В общих чертах, советник формирует "послание" из блоков данных и через разделитель записывает в строку. Строку превращает с в тип char через StringToChar(), а char превращает в int через union и сохраняет в ресурсе. Добавляется флаг непрочитанного сообщения и далее получатель распаковывает ресурс. Он преобразует int обратно в char через union, далее char преобразует обратно в string, разбивает строку на части и распределяет вложенные в нее данные по своим переменным, часть из которых внедрена в алгоритмы, а часть выведена в поля таблиц. Примерно так.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Дело не в кэшировании, а в проверке и валидации. Даже если MQL не кэширует график, он должен быть признан недействительным, а значит, CHARTEVENT_CHART_CHANGE неизбежен. Я не могу сам эффективно проверять метрики графика, для этого нужен таймер на 1 мс для частой проверки, поэтому CHARTEVENT_CHART_CHANGE предусмотрен, но он просто не отражает всех изменений. Иногда он также просто забывает о них. Это баг, проверенный и легко тестируемый.
Кроме того: Когда кому-то нужна максимальная цена, ему также нужна и минимальная цена, и минимальное время, и максимальное время и т.д. Вам никогда не нужно только одно значение, вам нужны все. Поэтому необходимо предусмотреть функцию, которая заполнит struct всеми данными сразу. Таким образом, будет легко кэшировать и находить изменения.
Все остальное, особенно в том виде, в котором это происходит сейчас, с отсутствующими событиями, является чистой - и огромной - тратой производительности.
Факт.
Эффективный код был бы таким:У меня это давно реализовано в библиотеке iCanvas.
автоматически заполняется один экземпляр W структуры Window при каждом событии CHARTEVENT_CHART_CHANGE
если делать через DLL то всё работает :-)
на правда Canvas тут не при чём...
PS/ точнее - работает ровно до моментов взаимодействий с чартом. Диалоги любые, хоть в браузер, но интерактивно двигать линию на чарте невозможно...ChartEvent и всё что с ним зарезано
DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?
На базе MT5 имеются самодельные Тестеры (на базе терминала, а не штатного тестера), где вы можете не только на кнопки нажимать, но и использовать все индикаторы, графические объекты и даже возвращаться по времени обратно и управлять ценой. Т.е. возможности значительно превосходят MT4 и решения вне MQ-системы. Без DLL, конечно.
DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?
Я собираюсь сделать панель для Маркета, так что нужен стандартный тестер. Или придется делать демо-версию для проверки панели на демо-счете.да, придётся хоть что-нибудь да делать а не только собираться :-)
сначала сделать панель и потом дать тестово-демонстрационную версию. Потому-что в тестере оно не работает by-design.
DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?
Я собираюсь сделать панель для Маркета, так что нужен стандартный тестер. Или придется делать демо-версию для проверки панели на демо-счете.В тестере никакая нормальная панель работать не будет. Тем более на канвасе. Есть убогие решения для МТ4, но для МТ5 нет. Однако в МТ4 можно наладить связь между тестером и графиком через ресурс. Я делал это и все работало. После перехода на МТ5 повторить тот же трюк не пытался. Наладить связь между советниками через ресурсы в МТ5 сложнее. Они могут только читать информацию в ресурсах друг друга, но не писать. Такое "общение" проблематично. Но главная проблема в другом. Неизвестно будет ли работать этот механизм между советником в тестере MT5 и панелью на графике МТ5. Чтобы проверить эту теорию нужно попробовать что-нибудь записать в ресурс из советника в тестере, и затем прочитать написанное через советника на графике. Если удасться - значит будет работать нормально и можно писать решение. Но я сильно сомневаюсь что это получится. Скорее всего из тестера МТ5 невозможно читать ресурс.
Скорее всего из тестера МТ5 невозможно читать ресурс.
Если проблема в каталогах - симлинки рулят.
Если проблема в каталогах - симлинки рулят.
Каждому свое.
В тестере никакая нормальная панель работать не будет. Тем более на канвасе. Есть убогие решения для МТ4, но для МТ5 нет. Однако в МТ4 можно наладить связь между тестером и графиком через ресурс. Я делал это и все работало. После перехода на МТ5 повторить тот же трюк не пытался. Наладить связь между советниками через ресурсы в МТ5 сложнее. Они могут только читать информацию в ресурсах друг друга, но не писать. Такое "общение" проблематично. Но главная проблема в другом. Неизвестно будет ли работать этот механизм между советником в тестере MT5 и панелью на графике МТ5. Чтобы проверить эту теорию нужно попробовать что-нибудь записать в ресурс из советника в тестере, и затем прочитать написанное через советника на графике. Если удасться - значит будет работать нормально и можно писать решение. Но я сильно сомневаюсь что это получится. Скорее всего из тестера МТ5 невозможно читать ресурс.
У меня скальпер 2-х платформенный. Используются кнопки с классом, производным от стандартного CButton. Проверка состояния кнопки проводится стандартно в OnChartEvent. Никаких убогих решений, все стандартно. И линии стандартные Horizontal Line. В тестере МТ4 все работает, в МТ5 нет. Отсюда и возник пост, наверняка же кто-то победил эту бяку с тестером МТ5.
У меня скальпер 2-х платформенный. Используются кнопки с классом, производным от стандартного CButton. Проверка состояния кнопки проводится стандартно в OnChartEvent. Никаких убогих решений, все стандартно. И линии стандартные Horizontal Line. В тестере МТ4 все работает, в МТ5 нет. Отсюда и возник пост, наверняка же кто-то победил эту бяку с тестером МТ5.
Через ресурс можно передавать большой обьем информации из тестера в советник на графике и торговать с помощью панели руками тоже. Система безусловно более сложная чем проверка состояний кнопок "мертвой" панели в тестере, но возможностей с ней на порядок больше.
Где бы почитать про ресурсы, а то я по нулям, не нужны были. Может, у вас есть пример?
Где бы почитать про ресурсы, а то я по нулям, не нужны были. Может, у вас есть пример?