A lona é legal! - página 82

 
Vitaliy Kuznetsov #:

Acontece que o método de aprimoramento do código do indicador usual não pode resolver globalmente o conflito com EAs em códigos fechados que usam objetos.

Espero que o aprimoramento do Expert Advisor resolva globalmente o conflito com todos os indicadores do painel (que é minha tarefa).

Eu escrevi no tópico MT4 build 1353, talvez os programadores de terminal prestem atenção.

P.S. Fiz alterações nas corujas e os esquis não funcionaram...

Examine todo o código (indicador e Expert Advisor) para descobrir onde e por que ObjectGetXXX, ObjectFind, ObjectsTotal, ObjectName etc. são chamados - eles são síncronos e podem deixar tudo muito lento. Tente se livrar deles, se possível.

Não se esqueça de chamar ChartRedraw()!!!! acima...

 

Senhores moderadores, estão me atribuindo todo tipo de absurdo e não me permitem responder? Incrível!

 
Maxim Kuznetsov #:

Examine todo o código (indicador e EA) para descobrir onde e por que ObjectGetXXX, ObjectFind, ObjectsTotal, ObjectName, etc. são chamados - eles são síncronos e podem tornar tudo muito lento. Tente se livrar deles, se possível.

Não se esqueça de chamar ChartRedraw()!!!! acima...

Você só precisa fazer OnChartEvent() com sabedoria e não reagir a todos os eventos seguidos. Ou eu não sei o que está acontecendo... E por que ficar sentado aqui pensando em um cara que nem sequer se digna a mostrar o código com o problema?

Agora inseri um loop de 1000000 repetições de ObjectFind() e ObjectGet() - tudo está normal.

 
Dmitry Fedoseev #:

Senhores moderadores, estão me atribuindo todo tipo de absurdo e não me permitem responder? Incrível!

Você não é o único que foi submetido a essa seletividade.

 
Dmitry Fedoseev #:

Você só precisa usar OnChartEvent() com sabedoria e não reagir a todos os eventos seguidos. Ou eu não sei o que é isso.... E por que ficar sentado aqui pensando no cara que nem se dá ao trabalho de mostrar o código com o problema?

Agora inseri um loop de 1000000 repetições de ObjectFind() e ObjectGet() - tudo está normal.

Bem, vou escrever pela quarta vez, não é difícil para mim.

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


Se você abrir o link, encontrará um anexo com o código na parte inferior da postagem. Em seguida, você poderá ler as postagens, por quem e como a discussão foi desenvolvida lá.

O problema não está especificamente no código proposto (você mesmo pode escrever qualquer Expert Advisor com um objeto), mas em um erro global que afeta todos os Expert Advisors com objetos (com uma única exceção) ao trabalhar com a função de alternância de gráfico por meio de um indicador.

Nikolay ofereceu sua solução, mas eu tenho erros com o trabalho desse código, e estou lidando com o problema mais a fundo.

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

Você só precisa usar OnChartEvent() com sabedoria e não reagir a todos os eventos seguidos. Ou eu não sei o que é isso.... E por que ficar sentado aqui pensando em um cara que nem se dá ao trabalho de mostrar o código com o problema?

Agora inseri um loop de 1000000 repetições de ObjectFind() e ObjectGet() - tudo está normal.

Tenho uma vaga dúvida: você já escreveu algo mais complicado do que um loop?

 
Vitaliy Kuznetsov #:

Bem, vou escrever pela quarta vez, não há problema para mim.

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


Se você abrir o link, encontrará um anexo com o código na parte inferior da postagem. Depois, você poderá ler as postagens, por quem e como a discussão foi desenvolvida lá.

O problema não está especificamente no código proposto (você mesmo pode escrever qualquer Expert Advisor com um objeto), mas em um erro global que afeta todos os Expert Advisors com objetos (com uma única exceção) ao trabalhar com a função de alternância de gráfico por meio de um indicador.

Nikolay ofereceu sua solução, mas eu tenho erros com o trabalho desse código, e estou lidando com o problema mais a fundo.

Aqui estão as alterações:

   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;
      
   }

Consegui me livrar dos terríveis travamentos. E se você pressionar os botões em um ritmo moderado, tudo estará bem.

Mas, se você começar a bater como um pica-pau, terá travamentos novamente, só que eles são diferentes e mais curtos. Não acho que

que você não possa se livrar deles. Talvez isso esteja relacionado à construção do cronograma.

Preciso trabalhar nos botões para que haja posições pressionadas/não pressionadas e introduzir inércia para que o botão não seja pressionado imediatamente.

Um atraso de 0,1 segundo resolveria a situação e o usuário não perceberia.

--

Na verdade, sem um especialista, você pode martelar os botões em um ritmo furioso....

 

E aqui estamos, eu me livrei completamente dos ganchos.

Pode estar torto, mas o ponto é o principal:

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

O objetivo é não excluir um objeto ao alternar o gráfico.

Devemos ver o que acontece quando Destroy()... se é possível deixá-lo assim...

 

Olá a todos!)

Peço desculpas, mas se estivermos falando sobre o mq4, talvez isso possa ser resolvido da seguinte forma :?)

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);}
}
 

Isso é o que mais pode criar freios:

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

Por quê?