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

 
Vitaliy Kuznetsov #:

Получается, что методом обычного улучшения кода индикатора глобально не решить конфликтность с советниками в закрытом коде, использующие объекты.

Надеюсь, что улучшение советника решит глобально конфликтность со всеми индикаторами дэшбордами (в чём моя задача и состоит).

Написал в ветке билда МТ4 1353, может программисты терминала обратят внимание.

P.S. Внёс правки в сов и что-то лыжи не поехали...

просмотрите весь код (индикатора и советника) на вопрос где и зачем вызываются ObjectGetXXX, ObjectFind, ObjectsTotal,ObjectName и.т.д - они синхронные и могут очень серьёзно всё протормозить. Постарайтесь от них вообще избавиться по возможности.

Не забывайте вызывать ChartRedraw()!!!! выше указывал..

 

Господа модераторы, мне тут приписывают всякий бред, а ответить я не имею право? Потрясающе!

 
Maxim Kuznetsov #:

просмотрите весь код (индикатора и советника) на вопрос где и зачем вызываются ObjectGetXXX, ObjectFind, ObjectsTotal,ObjectName и.т.д - они синхронные и могут очень серьёзно всё протормозить. Постарайтесь от них вообще избавиться по возможности.

Не забывайте вызывать ChartRedraw()!!!! выше указывал..

Просто надо с умом все сделать OnChartEvent(), а не реагировать на все события подряд. Ну или не знаю, что там... Да и зачем сидеть тут и думать за того парня, который даже не снизойдет показать код с проблемой.

Вставил сейчас цикл 1000000 повторений ObjectFind() и ObjectGet() - все норм.

 
Dmitry Fedoseev #:

Господа модераторы, мне тут приписывают всякий бред, а ответить я не имею право? Потрясающе!

Не вы один попали под такую избирательность.

 
Dmitry Fedoseev #:

Просто надо с умом все сделать OnChartEvent(), а не реагировать на все события подряд. Ну или не знаю, что там... Да и зачем сидеть тут и думать за того парня, который даже не снизойдет показать код с проблемой.

Вставил сейчас цикл 1000000 повторений ObjectFind() и ObjectGet() - все норм.

Ну, напишу в четвёртый раз, мне не сложно.

https://www.mql5.com/ru/forum/379526/page9#comment_25865481


Если открыть ссылку, то внизу поста обнаружите прикрепление с кодом. Далее можно почитать сообщения, кем и как развивалось обсуждение там.

Дело не конкретно в предложенном коде (можете написать сами любой советник с объектом) а в глобальной ошибке, касаемой всех советников с объектами (за единичным исключением) при работе с функцией переключения графика через индикатор.

Николай предложил своё решение, но у меня есть огрехи с работой такого кода, разбираюсь с проблемой дальше.

Новая версия платформы MetaTrader 4 build 1350 - Если у вас проблемы с дешбордами, то придется удалять объекты чарта.
Новая версия платформы MetaTrader 4 build 1350 - Если у вас проблемы с дешбордами, то придется удалять объекты чарта.
  • 2021.11.10
  • www.mql5.com
точнее в очередностях OnInit удалении своих объектов чарта. Тут ремонт терминала не имеет смысла не создавайте объектов по крайней мере до первого OnChartEvent. И удалять объекты пачкой лучше по ChartObjectsDelete
 
Dmitry Fedoseev #:

Просто надо с умом все сделать OnChartEvent(), а не реагировать на все события подряд. Ну или не знаю, что там... Да и зачем сидеть тут и думать за того парня, который даже не снизойдет показать код с проблемой.

Вставил сейчас цикл 1000000 повторений ObjectFind() и ObjectGet() - все норм.

Закрались смутные сомнения, а вы вообще что-нить сложнее цикла писали ?

 
Vitaliy Kuznetsov #:

Ну, напишу в четвёртый раз, мне не сложно.

https://www.mql5.com/ru/forum/379526/page9#comment_25865481


Если открыть ссылку, то внизу поста обнаружите прикрепление с кодом. Далее можно почитать сообщения, кем и как развивалось обсуждение там.

Дело не конкретно в предложенном коде (можете написать сами любой советник с объектом) а в глобальной ошибке, касаемой всех советников с объектами (за единичным исключением) при работе с функцией переключения графика через индикатор.

Николай предложил своё решение, но у меня есть огрехи с работой такого кода, разбираюсь с проблемой дальше.

Вот изменения:

   if(sparam=="Win_Ea_"){ // вот тут надо поцивильней сделать, из класса брать имя... но уж сами как-нибудь 
      if(id == CHARTEVENT_OBJECT_CLICK){
         if(win.BtnClickUP()){
         
            win.Process();
            
            ChartPeriodSet(true);
            
         }
         if(win.BtnClickDN()){
         
            win.Process();
            
            ChartPeriodSet(false);
            
         }
      }
   }
   if(id == CHARTEVENT_MOUSE_MOVE){
      MouseX=(int)lparam;
      MouseY=(int)dparam;
      
   }

От ужасных зависаний удалось избавиться. И если на кнопки жать в размеренном темпе, то всё норм.

А вот если начать долбить как дятел, то опять случаются зависания, только они какие-то другие и покороче. Кажется

от них уже не получится избавиться. Возможно, это связано с построением таймфрейма. 

Нужно над кнопочками поработать, чтобы были положения нажато/отжато и внести инерционность, чтобы после нажатия кнопка отжималась не сразу.

Задержка этак в 0.1 секунду исправит положение, а для пользователя будет незаметна.

--

Вообще-то без эксперта получается в бешенном темпе молотить по кнопкам...

 

А вот и полностью получилось избавиться от зависаний.

Возможно криво, но главное смысл:

void windows_class::~windows_class(){
   //Canvas.Destroy();
}
int OnDeinit(const int r){
   if(r==REASON_REMOVE){
      Canvas.Destroy();
   }
}

Смысл в том, чтобы нее удалять объект при переключении графика.

Надо посмотреть, что там происходит при Destroy()... можно ли так оставить...

 

Всем, Привет !)

Я конечно извиняюсь, но если речь идет, о mq4, то возможно это решается так :?)

void OnChartEvent(const int     id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id == CHARTEVENT_CLICK
   || id == CHARTEVENT_CHART_CHANGE)
   {ChartSetSymbolPeriod(0,NULL,0);}
}
 

Вот что еще может создавать тормоза:

void OnTick(void){
  win.Process();
}

Зачем?