Ошибки, баги, вопросы - страница 2777

 
Alain Verleyen:

Обновить :

Максимальный пик теперь серьезно увеличен:

2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Количество = 23520
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Мин = 33
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Макс = 81011
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Avg = 149

Для чистоты эксперимента, нужно запустить данный скрипт параллельно на нескольких чартах и в нескольких терминалах. Потом сравнить время подвисаний.

 
Stanislav Korotky :

Для чистоты эксперимента, нужно запустить данный скрипт параллельно на нескольких чартах и в нескольких терминалах. Потом сравнить время подвисаний.

Хорошо, но если это уже произошло с 1 графиком, он не улучшится с несколькими графиками.

Что даст вам больше, чтобы запустить его на нескольких графиках / терминалах?

 
Alain Verleyen:

Хорошо, но если это уже произошло с 1 графиком, он не улучшится с несколькими графиками.

Что даст вам больше, чтобы запустить его на нескольких графиках / терминалах?

Если это будет совпадать в разных терминалах, значит проблема лежит в плоскости ОС.

 
Stanislav Korotky :

Если это будет совпадать в разных терминалах, значит проблема лежит в плоскости ОС.

Понял. Я попробую.
 
Stanislav Korotky :

Для чистоты эксперимента, нужно запустить данный скрипт параллельно на нескольких чартах и в нескольких терминалах. Потом сравнить время подвисаний.

Еще один Терминал, но 20 графиков (разных символов), стартовал одновременно.

Я проверил на AUDUSD, где пик приходит:

2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Количество = 240
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Мин = 38
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Макс = 2235
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Avg = 472
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Количество = 240
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Min = 48
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Макс = 2323
2020.06.13 09: 16: 35.152 342152 (CADCHF, H1) Avg = 606
2020.06.13 09: 16: 35.152 342152 (EURAUD, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Мин = 141
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Мин = 47
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Мин. = 23
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Макс = 2368
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Avg = 607
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Мин = 74
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (USDCHF, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Min = 122
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Макс = 2402
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Avg = 660
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Min = 157
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Макс = 2354
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Avg = 663
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Min = 32
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Макс = 2380
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Avg = 616
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Макс = 2327
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Avg = 618
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Макс = 2233
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Avg = 503
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Мин = 11
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Макс = 2387
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Avg = 657
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Макс = 2292
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Avg = 612
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Min = 54
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Макс = 2361
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Avg = 612
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Min = 121
2020.06.13 09: 16: 35.152 342152 (EURCAD, H1) Количество = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Макс = 2328
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Avg = 605
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Макс = 2361
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Avg = 611
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Мин = 13
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Макс = 2411
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Avg = 661
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Количество = 240
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Мин = 113
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Макс = 2362
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Avg = 667
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Количество = 240
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Min = 151
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Макс = 2386
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Min = 35
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Avg = 671
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Макс = 2233
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Avg = 478
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Количество = 240
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Мин = 10
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Макс = 2384
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Avg = 658
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Min = 32
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Макс = 2369
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Avg = 614
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Макс = 2344
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Avg = 658

И вот, когда наступят вершины:

2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Количество = 480
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Min = 38
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Макс = 17421
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Avg = 533
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Количество = 480
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Min = 35
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Макс = 17406
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Avg = 518
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Количество = 480
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Макс = 17425
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Avg = 515
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Количество = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Мин = 18
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Макс = 17366
2020.06.13 09: 17: 35.151 342152 (EURCHF, H1) Количество = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Avg = 618
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Количество = 480
2020.06.13 09: 17: 35.151 342152 (USDCHF, H1) Количество = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Min = 126
2020.06.13 09: 17: 35.151 342152 (CADCHF, H1) Количество = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Макс = 10477
2020.06.13 09: 17: 35.151 342152 (EURCAD, H1) Количество = 480
2020.06.13 09: 17: 35.151 342152 (GBPUSD, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Min = 112
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Макс = 10485
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Avg = 663
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Макс = 10435
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Avg = 661
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Min = 71
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Min = 54
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Мин = 10
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Макс = 10487
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 664
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Min = 54
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Макс = 17426
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Avg = 620
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Min = 32
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Макс = 17427
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Avg = 649
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Min = 32
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Макс = 17433
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Avg = 647
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Мин. = 47
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Макс = 17415
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Avg = 640
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Min = 48
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Макс = 17435
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Avg = 637
2020.06.13 09: 17: 35.152 342152 (AUDCHF, H1) Avg = 662
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Мин = 43
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Макс = 17416
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Avg = 620
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Мин = 13
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Макс = 10468
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Avg = 660
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Min = 11
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Макс = 10474
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Min = 61
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Макс = 10491
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Avg = 663
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Макс = 17414
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Avg = 646
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Количество = 480
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Min = 100
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Макс = 17421
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Avg = 638
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Макс = 10488
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Avg = 666
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Avg = 656

Так что все произошло одновременно. Но это все еще может быть проблемой MT5. Я проверю с другими одновременными терминалами.

 
Stanislav Korotky:

Если это будет совпадать в разных терминалах, значит проблема лежит в плоскости ОС.

Проблема не в плоскости ОС, а в МТ. 
Проверил на МТ5 (build 2009) - все летает, выполнения меньше 5 мс
При этом в МТ5 (build 2485) - все тормозит, время выполнения часто превышает 200 мс (особенно когда открыто 50+ чартов)
Использовался код из описания проблемы: https://www.mql5.com/en/forum/342152

Сравнил реализации функции ChartGetInteger для двух версий МТ5 2009 и МТ5 2485, возможно проблема в следующем:
1. В 2485 для чтения "атомарных" полей объекта чарта используются достаточно медленные операции:
mfence; lock mov eax,[rax+2C];
При этом в 2009 билде это делается с помощью: lock xadd [rcx+2C],eax

2. Так же похоже, что значительно изменилась логика и возможное время пребывания в ntdll_RtlEnterCriticalSection.
Раньше в 2009 в критической секции проверялась лишь пара полученных значений, без каких-либо атомарных операций.
А в 2485 может дополнительно выполняться перебор по linked-list объектам чарта.


Предположительно, проблема могла возникнуть, когда фиксили краш при работе с функциями чарта в рамках перехода на новый компилятор (месяца 2-3 назад).
Assembler-код для вызова ChartGetInteger в МТ5 (build 2485) находится во вложении.

 
Sergey Dzyublik :

Проблема не в плоскости ОС, а в МТ. 
Проверил на МТ5 (build 2009) - все летает, выполнения меньше 5 мс
При этом в МТ5 (build 2485) - все тормозит, время выполнения часто превышает 200 мс (особенно когда открыто 50+ чартов)
Использовался код из описания проблемы:  https://www.mql5.com/en/forum/342152

Сравнил реализации функции ChartGetInteger для двух версий МТ5 2009 и МТ5 2485, возможно проблема в следующем:
1. В 2485 для чтения "атомарных" полей объекта чарта используются достаточно медленные операции:
mfence;  lock mov eax,[rax+2C];
При этом в 2009 билде это делается с помощью: lock xadd [rcx+2C],eax

2. Так же похоже, что значительно изменилась логика и возможное время пребывания в ntdll_RtlEnterCriticalSection.
Раньше в 2009 в критической секции проверялась лишь пара полученных значений, без каких-либо атомарных операций.
А в 2485 может дополнительно выполняться перебор по linked-list объектам чарта.


Предположительно, проблема могла возникнуть, когда фиксили краш при работе с функциями чарта в рамках перехода на новый компилятор (месяца 2-3 назад).
Assembler-код для вызова ChartGetInteger в МТ5 (build 2485) находится во вложении.

Официальные сборки были 2005 Build, а затем 2085 Build, у вас есть? У меня только 2007 Build.
 
Sergey Dzyublik:

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

Вызов асинхронной как ChartSetInteger функции из основного потока быстрый, так как фактическое выполнение происходит в другом потоке.

С другой стороны вызов синхронной функции ChartGetInteger будет требовать синхронизации потоков, а на это может потребоваться дополнительно время.
Особенно заметны задержки, когда параллельный поток производит постоянное обновление данных структуры чарта (например, когда пользователь перемещает окно чарта или прокручивает историю).
Скорее всего, для простоты и надежности используется один объект синхронизации для свей структуры данных чартов.
Можно попробовать улучшить скорость выполнения используя "сегментацию данных", однако с другой стороны теперь появляется возможность нарваться на дедлок, или недообновленные данные, или на замедление работы в других более критических местах.
В общем - лучше не трогать то, что и так стабильно работает.

Ilyas:

Предположу, что пик - это отрисовка комментария чарта, в остальном, когда очередь чарта пуста, вызов функции ChartGetXXX (замечу, вызов с синхронизацией) занимает 0.13 миллисекунды

Мне привычнее говорить языком кода. 
Вот, например набросал такой индикатор:


при движении мыши происходит выполнение ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR, 0);
красный график - это статистика времени выполнения этой функции.
Простой запрос одной цифры выполняется в разы медленее чем функция BildChart, которая очищает весь экран, формирует график из нескольких тысяч линий, рисует шкалу, формирует текстовый информационный блок и выводит всё это на экран.

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

Файлы:
 
Долго тупил, не понимая, что не нравится в этой строке компилятору.
  else (Type != -1) // expression has no effect

Забыл if написать. Подумал, что для таких тупняков хорошо бы разжевать сообщение.

 
Nikolai Semko:

Простой запрос одной цифры выполняется в разы медленее чем функция BildChart, которая очищает весь экран, формирует график из нескольких тысяч линий, рисует шкалу, формирует текстовый информационный блок и выводит всё это на экран.

Насколько я знаю, вызов ChartRedraw не приводит к немедленной перерисовке графика.  Перерисовка происходит только при вызове какого-нибудь Get-метода.
А ChartRedraw по сути такой же асинхронный метод.  Так что ваш замер BuildChart не достоверен.
Причина обращения: