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

 
Doerk Hilger #:

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

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

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

Факт.

Эффективный код был бы таким:

У меня это давно реализовано в библиотеке iCanvas

автоматически заполняется один экземпляр W структуры Window при каждом событии CHARTEVENT_CHART_CHANGE
 

struct Window {
   long              ChartId;     // current window identifier
   uint              Color;       // window background color
   int               Width;       // window width
   int               Height;      // window height
   int               height[];    // sub_windows height
   int               Left_bar;    // number of the leftmost bar in the window
   double            Right_bar;   // number of the rightmost bar in the window
   double            Total_bars;  // the maximum number of bars in the window
   int               BarsInWind;  // number of visible bars in the window
   double            Y_min;       // The minimum value of the price in the window
   double            Y_max;       // The maximum value of the price in the window
   double            dy_pix;      // price change for one pixel
   int               dx_pix;      // changing the number of bars per pixel
   int               MouseX;      // coordinate X of the current position of the mouse pointer
   int               MouseY;      // coordinate Y of the current position of the mouse pointer
   double            MouseBar;    // the current bar position of the mouse pointer
   double            MousePrice;  // the current price of the mouse pointer
   datetime          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_PRESSED
   int               IdEvent;     // id value of the last event
   long              lparam;      // last lparam
   int               MouseSubWin; // number of the subwindow in which the mouse pointer is located
   int               WindowsTotal;// total subwindows, including the main window
   int               SubWin;      // current subwindow
   int               DPI;         // Screen DPI
   bool              ActiveWin;   // Active window
   bool              ChangeActive;// if true ActiveWin was changed in last CHARTEVENT_CHART_CHANGE
   datetime          time[];      // array of opening time of all visible bars in the window
};
Easy Canvas
Easy Canvas
  • www.mql5.com
Данная библиотека и класс iCanvas упростит написание программ с применением Canvas.
 
Maxim Kuznetsov #:

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

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

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

DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?

fxsaber #:

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

Я собираюсь сделать панель для Маркета, так что нужен стандартный тестер. Или придется делать демо-версию для проверки панели на демо-счете.
 
Alexey Volchanskiy #:

DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?

Я собираюсь сделать панель для Маркета, так что нужен стандартный тестер. Или придется делать демо-версию для проверки панели на демо-счете.

да, придётся хоть что-нибудь да делать а не только собираться :-)

сначала сделать панель и потом дать тестово-демонстрационную версию. Потому-что в тестере оно не работает by-design. 

 
Alexey Volchanskiy #:

DLL я писать умею с детского садика, чем они могут помочь, не понял. Ставлю вопрос по другому: как сделать GUI с кнопками и полями ввод без использования ChartEvent? чтобы это работало в тестере?

Я собираюсь сделать панель для Маркета, так что нужен стандартный тестер. Или придется делать демо-версию для проверки панели на демо-счете.

В тестере никакая нормальная панель работать не будет. Тем более на канвасе. Есть убогие решения для МТ4, но для МТ5 нет. Однако в МТ4 можно наладить связь между тестером и графиком через ресурс. Я делал это и все работало. После перехода на МТ5 повторить тот же трюк не пытался. Наладить связь между советниками через ресурсы  в МТ5 сложнее. Они могут только читать информацию в ресурсах друг друга, но не писать. Такое "общение" проблематично. Но главная проблема в другом. Неизвестно будет ли работать этот механизм между советником в тестере MT5 и панелью на графике МТ5. Чтобы проверить эту теорию нужно попробовать что-нибудь записать в ресурс из советника в тестере, и затем прочитать написанное через советника на графике. Если удасться - значит будет работать  нормально и можно писать решение. Но я сильно сомневаюсь что это получится. Скорее всего из тестера МТ5 невозможно читать ресурс.

 
Реter Konow #:
Скорее всего из тестера МТ5 невозможно читать ресурс.

Если проблема в каталогах - симлинки рулят.

 
JRandomTrader #:

Если проблема в каталогах - симлинки рулят.

Каждому свое.

 
Реter Konow #:

В тестере никакая нормальная панель работать не будет. Тем более на канвасе. Есть убогие решения для МТ4, но для МТ5 нет. Однако в МТ4 можно наладить связь между тестером и графиком через ресурс. Я делал это и все работало. После перехода на МТ5 повторить тот же трюк не пытался. Наладить связь между советниками через ресурсы  в МТ5 сложнее. Они могут только читать информацию в ресурсах друг друга, но не писать. Такое "общение" проблематично. Но главная проблема в другом. Неизвестно будет ли работать этот механизм между советником в тестере MT5 и панелью на графике МТ5. Чтобы проверить эту теорию нужно попробовать что-нибудь записать в ресурс из советника в тестере, и затем прочитать написанное через советника на графике. Если удасться - значит будет работать  нормально и можно писать решение. Но я сильно сомневаюсь что это получится. Скорее всего из тестера МТ5 невозможно читать ресурс.

У меня скальпер 2-х платформенный. Используются кнопки с классом, производным от стандартного CButton. Проверка состояния кнопки проводится стандартно в OnChartEvent. Никаких убогих решений, все стандартно. И линии стандартные Horizontal Line. В тестере МТ4 все работает, в МТ5 нет. Отсюда и возник пост, наверняка же кто-то победил эту бяку с тестером МТ5.  

 
Alexey Volchanskiy #:

У меня скальпер 2-х платформенный. Используются кнопки с классом, производным от стандартного CButton. Проверка состояния кнопки проводится стандартно в OnChartEvent. Никаких убогих решений, все стандартно. И линии стандартные Horizontal Line. В тестере МТ4 все работает, в МТ5 нет. Отсюда и возник пост, наверняка же кто-то победил эту бяку с тестером МТ5.  

Через ресурс можно передавать большой обьем информации из тестера в советник на графике и торговать с помощью панели руками тоже. Система безусловно более сложная чем проверка состояний кнопок "мертвой" панели в тестере, но возможностей с ней на порядок больше.
 
Реter Konow #:
Через ресурс можно передавать большой обьем информации из тестера в советник на графике и торговать с помощью панели руками тоже. Система безусловно более сложная чем проверка состояний кнопок "мертвой" панели в тестере, но возможностей с ней на порядок больше.

Где бы почитать про ресурсы, а то я по нулям, не нужны были. Может, у вас есть пример?

 
Alexey Volchanskiy #:

Где бы почитать про ресурсы, а то я по нулям, не нужны были. Может, у вас есть пример?

О ресурсах можно почитать в документации где о них подробно рассказано. Другие источники информации вероятно существуют, но не искал. Примеров создания ресурсов много, но вряд ли найдете статьи где разобрана тема связывания советника в тестере МТ4 с его копией на графике. Я воплотил свою идею не зная делал ли кто то подобное до меня. Возможно да, но может и нет. В любом случае практический пример в коде показать не могу, т.к. механизм коммуникации советников был жестко интегрирован в мой графический движок и в качестве самостоятельного решения для общественного использования его не оформлял. 

Однако при желании можете справится с этой задачей. Изучите тему ресурсов, разработайте протокол передачи информации между советниками, напишите простенький вариант, тестируйте и развивайте решение.

Для упаковки сообщений в ресурс советую использовать строки (string)  и массив union. В общих чертах, советник формирует "послание" из блоков данных и через разделитель записывает в строку. Строку превращает с в тип char через StringToChar(), а char превращает в int через union и сохраняет в ресурсе. Добавляется флаг непрочитанного сообщения и далее получатель распаковывает ресурс. Он преобразует int обратно в char через union, далее char преобразует обратно в string, разбивает строку на части и распределяет вложенные в нее данные по своим переменным, часть из которых внедрена в алгоритмы, а часть выведена в поля таблиц. Примерно так.