O problema da transferência do MT4 para o MT5. Ou, mais precisamente, a incapacidade de executar alguns algoritmos no MT5 sem errar. - página 4

 
Eugeni Neumoin:

Não há problema com a OnCalculate(). A GUI inteira funciona através da OnChartEvent() . Há mais de 400 botões na GUI. Alguns dos botões não interagem de forma alguma com as séries de tempo. Funções OnCalculate() e OnTrade() podem esperar até o próximo tick. Isto não é psicologicamente perceptível. E é mais complicado com a OnChartEvent(). Aqui a psicologia humana está envolvida. O usuário do programa pressiona o botão GUI. E ele não obtém a resposta que deseja. Qual é a reação dele? Uma das reações é que ele/ela aperte o mesmo botão uma segunda vez. Fi-lo de modo que uma segunda pressão em muitos dos botões desabilita a funcionalidade conectada por esse botão. Prevejo sua sugestão de desativar a ação do botão de alguma outra forma. Mas existe o mesmo programa para o MT4. Funciona lá normalmente. Acontece que o MT4 tem um algoritmo de interação com a interface gráfica, enquanto o MT5 tem um algoritmo diferente. Tal comportamento do mesmo programa só causará rejeição.

Fiz algo semelhante ao traduzir para MT5 - habilitei a saída do OnChartEvent(). Não quero mentir, é por isso que a GUI estava morrendo.

E no meu caso, a referência às séries cronológicas no OnTimer() ocorre após 5 minutos. Fá-lo-ei após 2 minutos. Vou verificar o que vai acontecer.

Artem, suas sugestões já foram úteis antes.

Não, certamente não haverá sugestões para mudar a lógica de trabalhar com gráficos - o código de plataforma cruzada deve funcionar da mesma forma.

  1. A aplicação às séries de tempos deve ser feita pelo menos uma vez a cada dois minutos - somente neste caso será garantido que estará sempre atualizada. Isto é, em multi... esta parte do código deve ser por padrão.
  2. Na MQL5, ao contrário da MQL4, o gráfico deve ser atualizado usando CartRedraw() para exibir as mudanças do gráfico após todas as manipulações necessárias com todos os objetos gráficos que podem ser atualizados de uma vez - você não precisa atualizar o gráfico após cada mudança de um elemento. Eu não sei se fui claro. Por exemplo, se um usuário clicar em um botão e algo deve ser desenhado adicionalmente, por exemplo, um objeto de tabela composto de vários elementos, então todos os elementos devem ser desenhados e somente então o gráfico deve ser atualizado uma vez. Não atualizar após cada elemento desenhado de um único objeto.
    É bem possível que quando o usuário clicou no botão mas não vê nada, então na verdade tudo está lá, apenas o gráfico ainda não está atualizado (ele se atualizará apenas com a chegada do tick)
 
Artyom Trishkin:

Não, certamente não haverá nenhuma sugestão para mudar a lógica gráfica - o código entre plataformas deve funcionar da mesma forma.

A única coisa que posso sugerir para melhorar os botões é que, de qualquer forma, quando as séries de tempo necessárias ainda não estão disponíveis, ainda não é possível construir um gráfico sobre seus dados. Neste caso, precisamos esperar o momento em que os dados ficam disponíveis e tornar os botões inativos enquanto esperamos - por exemplo, torná-los semelhantes às interfaces do Windows: se nenhuma ação estiver disponível no botão, então o botão fica cinzento. Esta lógica pode estar presente em ambas as plataformas, de modo que não há diferença no código.

 

Eu tenho ChartRedraw() acionado ao sair de grandes blocos, por exemplo, OnChartEvent() e outros. Portanto, não há nada de errado com esta função.

Sobre as pontas das ferramentas. Eles são como indicadores que quando você clica em um número ou símbolo, tudo funcionará.

Se você clicar no número e no símbolo, um dos elementos OnChartEvent() - CHARTEVENT_OBJECT_CLICK deve acionar. Ela não é acionada se a ponta da ferramenta não aparecer. Eu gostaria de saber por que isso acontece. CHARTEVENT_OBJECT_CLICK não funciona .

E estarei de olho no acesso às séries de tempo.

 
Eugeni Neumoin:

Eu tenho ChartRedraw() acionado ao sair de grandes blocos, por exemplo, OnChartEvent() e outros. Portanto, não há nada de errado com esta função.

Sobre as pontas das ferramentas. Eles são como indicadores que quando você clica em um número ou símbolo, tudo funcionará.

Se você clicar no número e no símbolo, um dos elementos OnChartEvent() - CHARTEVENT_OBJECT_CLICK deve acionar. Ela não é acionada se a ponta da ferramenta não aparecer. Eu gostaria de saber por que isso acontece. CHARTEVENT_OBJECT_CLICK não funciona .

E vou ficar de olho no acesso às séries de tempo.

Logo no início do manipulador de eventos gráficos, registrar o parâmetro sparam - então qualquer ação será registrada. Então comece a limitar a saída - se houver um evento de clique do objeto (id===CHARTEVENT_OBJECT_CLICK), então saia sparam para o log. E assim você chegará lentamente à causa.

 
Artyom Trishkin:

Logo no início do manipulador de eventos gráficos, registrar o parâmetro sparam - então qualquer ação será registrada. Então comece a limitar a saída - se houver um evento de clique do objeto (id=== CHARTEVENT_OBJECT_CLICK), então saia sparam para o log. E assim você chegará lentamente à causa.

Foi exatamente assim que eu depurei tudo. E no código os bits para depuração no OnChartEvent() estão sempre presentes de forma comentada. Mas, obrigado. Fá-lo-ei dessa forma. Vou procurar a causa.
 

Para evitar problemas com a ligação de números e símbolos, você precisa aumentar a prioridade de números e símbolos com OBJPROP_ZORDER.

Funciona no MT4 sem ele. No entanto, aumentei a prioridade no MT4 só por precaução. Além disso, a prioridade dos símbolos das ondas era maior do que a dos números.

Já resolvi o problema.

Estou tentando mudar todas as séries de tempo após 2 minutos - estou selecionando diferentes variantes para o desempenho mais suave desta tarefa.

O processo já começou...

 
Eugeni Neumoin:

Para evitar problemas com a ligação de números e símbolos, você precisa aumentar a prioridade de números e símbolos com OBJPROP_ZORDER.

Funciona no MT4 sem ele. No entanto, aumentei a prioridade no MT4 só por precaução. Além disso, a prioridade dos símbolos das ondas era maior do que a dos números.

Já resolvi o problema.

Estou tentando mudar todas as séries de tempo após 2 minutos - estou selecionando diferentes variantes para o desempenho mais suave desta tarefa.

O processo já começou...

A lisura não tem nada a ver com isso :)
Basta acessar todos os tf's de trabalho pelo menos uma vez a cada dois minutos. Eu costumo acessar a cada 90 segundos. Você pode distribuir o tempo de acesso para os diferentes comerciantes, de modo a não puxá-los todos de uma só vez. Mas cada um deles deve ser acessado pelo menos uma vez a cada dois minutos.
 
Artyom Trishkin:
A lisura não é uma opção aqui :)
Basta acessar todos os cfr's de trabalho pelo menos uma vez a cada dois minutos. Eu costumo ligar a cada 90 segundos. Você pode espalhar os tempos de acesso para os diferentes tráfegos para que não tenha que puxá-los todos de uma só vez. Mas cada um deles deve ser acessado pelo menos uma vez a cada dois minutos.

Há freios.

Mas temos que aturar o que temos.

É impossível abraçar a imensidão).

 
Artyom Trishkin:
A lisura não é uma opção aqui :)
Basta acessar todos os cfr's de trabalho pelo menos uma vez a cada dois minutos. Eu costumo ligar a cada 90 segundos. Você pode espalhar os tempos de acesso para os diferentes tráfegos, para que não tenha que puxá-los todos de uma só vez. Mas cada um deles deve ser acessado pelo menos uma vez a cada dois minutos.

É impossível separar. Se pelo menos um comércio não for atualizado, o indicador pode tornar incorretas algumas construções gráficas.

Por outro lado, verifiquei a disponibilidade das séries de tempos antes de OnCalculate e OnChartEvent. Como sugerido.

A atualização das séries cronológicas e a verificação da disponibilidade das séries cronológicas provoca grandes atrasos.

Ainda há interrupções de acesso a timeseries. Como eu disse ao criar a filial em um dos primeiros postos. Isto confirma que temos que atualizar as séries cronológicas de forma programática.

Este é o primeiro.

Segundo. Por que todo desenvolvedor tem que se preocupar com a organização do acesso às séries de tempo?

Por que não existe algum "mecanismo" adicional que elimine este incômodo?

Se alguém precisar deste incômodo, ninguém proíbe o uso do que agora está disponível. E para aqueles que pensam que o acesso alternativo universal a séries temporais é bom, é melhor que tal acesso seja feito pelos desenvolvedores.

Já tive várias pessoas me pedindo para traduzir um programa do MT4 para o MT5. Já o fiz. Não estou satisfeito com a tradução. Mas enquanto eu tiver feito o download do programa, não tenho nenhuma reclamação. Talvez eles estejam satisfeitos com isso. Embora eu duvide disso.

Eu gostaria de acrescentar algo de meu lado. Eu parei de experimentar a otimização do acesso às séries de tempo. Este é um uso improdutivo do tempo. Há coisas mais interessantes a fazer. Deixe aqueles que estiverem interessados trabalharem com o MT5. A única coisa que pode ser mastigada do MT5 é a história das citações. Para uso no ensino de NS.

 
Eugeni Neumoin:

Por outro lado, fez verificações de disponibilidade de séries temporais antes das funções OnCalculate e OnChartEvent. Como sugerido.

A atualização das séries temporais e a verificação da disponibilidade das séries temporais causam lentidão severa.

Foi sugerido fazer isso com um temporizador a cada minuto e meio. Não antes de cada tic-tac, e certamente não em um evento gráfico.

O acesso às séries de tempo no MT5 não é realmente o ideal. Mas se você precisar resolver um problema em vez de encontrar uma desculpa, é possível.