c VirtualBox, MetaTrader и не самым простым советником вообще всё оказалось крайне интересно (вместе с рекомендациями по лечению):
- при изменении размера окна в лёт получаются CHART_WIDTH_IN_PIXELS=0 , CHART_HEIGHT_IN_PIXELS=0. То есть изменение размеров начинается с обнуления. Впредь придётся учитывать что размер может меняться до 0:0 и это нормальное поведение.
- при изменении масштаба цен может затыкаться таймер. Это точно где-то внутри MT, потому-что если рядом открыть ещё один чарт и его-же закрыть, то события OnTimer снова будут приходить. Если нибудь засекли изменения CHART_PRICE_MIN CHART_PRICE_MAX или CHART_SCALE - перевзводите таймер ChartEventSetTimer или ChartEventSetMillisceondsTimer. Поэтому запрашиваемое разрешение таймера придётся повышать, а внутренний тайминг советника делать через производный софтовый таймер
- Canvas рисуется(отображается) очень странно и с подглюкиванием. Поэтому перед Canvas::Update(true) и ChartRedraw() надо принудительно помещать его на передний/задний план (смотря где вы его рисуете), а-ля ObjectSetInteger(chart,canvas_obj,OBJPROP_TIMEFRAMES,OBJ_NO_PERIODS); ObjectSetInteger(chart,canvas_obj,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); Странное шаманство, но что-то исправляет в оптимизации отображений MT/Windows
- IndicatorFind на фоне предыдущих даже и не смотрел :-) просто временно обошёл, позже проверю
иных существенных отличий VBox, VDS и обычной системой не вижу,
поэтому считаю что корень проблем примерно тут :
и плюс внутри витуальки GuestAdditions (который включает граф.драйвер и встройки-надстройки Win)
на прикладном уровне MT это сказывается что события приходят иные и с другими опциями по сравнению с настольной системой или VDS.
И сдаётся что по логике MetaTrdaer если OnTimer работал дольше положенного, то нафик его..не будет давать новых событий до лучших времён :-) То есть не только в случае ошибок, а просто какой-то лимит выходит и всё.
А отрисовка в VBoxSVGA видимо этот лимит поджирает, особенно когда вся сцена перестраивается (скролы/ресайзы/масштабы)
Немного финализируя приключения с Virt.Box - "пришла беда откуда неждали" :-) в общем это большой CCanvas творил чудеса. Почему-то на VirtBox побочки этих чудес всплыли прямо сразу, есть в нём что-то такое-эдакое.
То ли действительно системные счётчики ресурсов/таймеры иначе отрабатывают, то-ли VBoxSVGA глючит.
При наличии большого (и часто обновляемого) CCanvas и доступе через VirtBox всё постепенно встаёт колом, начинают отваливаться OnTimer. По RDP такое оказалось тоже есть, просто меньше проявлялось (может потому как окна не были распахнуты и частота кадов и проч.)
Чтобы всё работало и причём быстро без задержек - потребовалась почти полная переделка, максимальная замена чего только можно на стандартные объекты, оптимизация их управления, разрезка оставшейся картины на части от частоты изменений и т.д и тп
К вышесказанным рекомендациям теперь могу добавить - DataVisualization это не про торговый терминал с удалённым доступом :-)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Просто какое-то колдунство и шаманизм происходят..
вводная часть : комп разработчика, несколько тестовых VDS, и советник который должен отобразить на чарт индикатор. Чтобы юзер видело сей индикатор.
в советнике логика (упрощено): периодически, раз в 2-5 сек, FindIndicator(), если индика нет, то Create его & Add. Если есть то и хорошо.
и оно всё работает, точнее работало. Ровно до момента контрольки - "в VirtualBox ставим чистый вин, качем MT из mql5.com, ставим, копируем нужные ex5".
И FindIndicator не находит собственноручно сделанный и добавленный в чарт индикатор, и IndicatorAdd обламывается с 4116.
То есть первый проход проходит, индикатор всякое рисует но через таймер эксперт его не найдёт. Он в списке индикаторов уже есть. Он даже нарисовал всё.
то есть на нескольких хостах работает без нареканий, а на чистом win со свежим MT нет. При этом в тестере в том-же чистом вин, всё ок.
где-то что-то я упускаю
очень хочется узнать детали и мелкие нюансы ChartIndicatorFind/Add/Del и практику их использования