Расскажите про ChartIndicatorFind/Add/Del в подробностях и деталях

 

Просто какое-то колдунство и шаманизм происходят..

вводная часть : комп разработчика, несколько тестовых VDS, и советник который должен отобразить на чарт индикатор. Чтобы юзер видело сей индикатор. 

в советнике логика (упрощено): периодически, раз в 2-5 сек, FindIndicator(), если индика нет, то  Create его & Add. Если есть то и хорошо.

и оно всё работает, точнее работало. Ровно до момента контрольки - "в VirtualBox ставим чистый вин, качем MT из mql5.com, ставим, копируем нужные ex5".
И FindIndicator не находит собственноручно сделанный и добавленный в чарт индикатор, и IndicatorAdd обламывается с 4116.
То есть первый проход проходит, индикатор всякое рисует но через таймер эксперт его не найдёт. Он в списке индикаторов уже есть. Он даже нарисовал всё.

то есть на нескольких хостах работает без нареканий, а на чистом win со свежим MT нет. При этом в тестере в том-же чистом вин, всё ок. 

где-то что-то я упускаю

очень хочется узнать детали и мелкие нюансы ChartIndicatorFind/Add/Del и практику их использования

 

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 это не про торговый терминал с удалённым доступом :-)  

Причина обращения: