Artigo muito bom. Eu protejo os programas contra esse tipo de vandalismo de uma maneira um pouco diferente...
Eu crio todos os objetos necessários com um prefixo fora da visibilidade do gráfico em uma função especial como CREATE_OBJECTS(),
Em seguida, verifico o erro 4202 ERR_OBJECT_DOES_NOT_EXIST O objeto não existe e, se houver esse erro, chamo a função CREATE_OBJECTS() novamente.
O restante das propriedades do objeto é alterado conforme necessário no gráfico.
Muito bem. O artigo é bom. Os exemplos não são ruins.
Mas parece haver uma maneira simples de verificar a existência de um objeto e você sempre pode restaurá-lo, se necessário.
Mas parece haver uma maneira simples de verificar a existência de um objeto e ele sempre pode ser restaurado, se necessário.
Obrigado a todos pelo feedback!
Muito bem. O artigo é bom. Os exemplos não são ruins.
Mas parece haver uma maneira simples de verificar a existência de um objeto e você sempre pode restaurá-lo, se necessário.
Obrigado, Victor!
Por via das dúvidas, direi que as variantes apresentadas não se opõem às formas usuais (simples ou não tão simples).
O que acontece é que as formas habituais e familiares (simples ou não tão simples) podem nem sempre ser "oportunas". Especialmente porque as mesmas várias "mãos maldosas" não foram canceladas. Inclusive, e talvez em alguns casos, as nossas próprias ou as do usuário.
Ou seja, se, por exemplo, os objetos do painel de controle do programa forem acidentalmente excluídos por meio da"Objects List" (Lista deobjetos ) juntamente com outras seleções via Shift ou por um programa de terceiros, em que a função de exclusão de objetos(ObjectsDeleteAll() ou criada independentemente) pode ser usada, a qual é executada de acordo com os parâmetros definidos nela:
.
- exclusão total de todos os tipos de objetos gráficos na mesma janela/subjanela em que estão localizados os objetos criados manualmente ou com a ajuda de outros programas;
- ou exclusão total de objetos do tipo que também estão presentes no painel de controle do seu programa;
- ou exclusão por um prefixo que coincida com o prefixo dos objetos em seu programa,
então as opções descritas neste artigo podem ser úteis, respondendo à situação conforme ela se apresenta. Inclusive, em alguns casos, livrando-o de alguns "movimentos" desnecessários. Essas opções, creio eu, podem ser chamadas de universais e, se necessário, podem ser combinadas com outras "sem dor e sem conflito".
De alguma forma.
Ou seja, para a "proteção" dos objetos do programa, é claro, diferentes opções, métodos e suas combinações podem ser aplicados.
E os descritos no artigo não são obrigatórios para todos os códigos, mas aqueles que podem não ser supérfluos em alguns casos.
O truque é reduzir ao mínimo o número de verificações em vez de verificações sem interrupções. Para isso, elas são vinculadas a um evento específico. Se eu entendi corretamente.
Sim, obrigado, é isso mesmo, reduzir o número de processamento durante as verificações é um dos pontos a serem considerados.
Este artigo está totalmente obsoleto.
1. Definitivamente não é para iniciantes
2. Não é MQL5 - é MQL4!
3. A forma de codificação é totalmente complicada e - em vista da MQL5 - totalmente errada.
Se alguém achar que é um problema o fato de outro EA ou indicador poder destruir objetos, isso pode ser feito de forma muito mais eficiente e elegante:
- Defina um objeto MQL para cada objeto de gráfico, como a biblioteca de controle padrão já faz. Cada um desses objetos MQL representa um objeto de gráfico e contém todos os seus dados - estilo MQL5 normal.
- Empacote todos os objetos em um contêiner mestre
- Somente o contêiner mestre verifica se um objeto de gráfico foi excluído, seja de tempos em tempos ou pelo evento de gráfico correspondente durante OnChartEvent().
- Adicione uma função de membro .ReCreate() ao CWnd e uma função virtual OnRecreate() a todos os objetos que implementam essa funcionalidade
- Se o contêiner mestre detectar algum tipo de "vandalismo", ele enviará um .ReCreate() a todos os seus objetos filhos
Pronto.
Tenho pouco conhecimento de inglês. Não li a versão deste artigo em inglês.
Desculpe, mas...você leu esse artigo na íntegra?
Você fala russo?
Se você fala russo, podemos conversar de forma mais construtiva na discussão da versão russa deste artigo.
Este artigo é totalmente obsoleto.
Você está errado.
1. Definitivamente não é para iniciantes
Por que você acha isso? Diga-me isso, por favor, com mais detalhes.
2. Não é MQL5 - é MQL4!
Você está errado.
Mas os esquemas descritos neste artigo podem ser usados não apenas para MQL5, mas também para MQL4.
3. A forma de codificação é totalmente complicada e - em vista da MQL5 - totalmente errada de qualquer forma.
Пожалуйста прочитайте эту статью "MQL5 для начинающих: Антивандальная защита графических объектов" ещё раз внимательно. И пожалуйста не торопитесь с выводами. Если и после этого ваше мнение не изменится, то напишите более конкретно непонятные для вас моменты.
Por favor, leia este artigo "MQL5 para iniciantes:Proteção antivandalismo de objetos gráficos" novamente com atenção. E, por favor, não se apresse em tirar conclusões. Se depois disso não mudar sua opinião, escreva mais momentos particularmente difíceis para você.
Se alguém achar que é um problema o fato de outro EA ou indicador poder destruir objetos, isso pode ser feito de forma muito mais eficiente e elegante:
- Defina um objeto MQL para cada objeto de gráfico, como a biblioteca de controle padrão já faz. Cada um desses objetos MQL representa um objeto de gráfico e contém todos os seus dados - estilo MQL5 normal.
- Empacote todos os objetos em um contêiner mestre
- Somente o contêiner mestre verifica se um objeto de gráfico foi excluído, seja de tempos em tempos ou pelo evento de gráfico correspondente durante OnChartEvent().
- Adicione uma função de membro .ReCreate() ao CWnd e uma função virtual OnRecreate() a todos os objetos que implementam essa funcionalidade
- Se o contêiner mestre detectar um tipo de "vandalismo", ele enviará um .ReCreate() a todos os seus objetos filhos
Feito.
В статье "MQL5 для начинающих: Антивандальная защита графических объектов" рассматриваются схемы только двух вариантов (способов) из множества возможных. Но различных вариантов (способов) конечно может быть много.
Применять или не применять схемы из этой статьи - это зависит только от ваших решений.
Скажу только, что эти две схемы из статьи "MQL5 для начинающих: Антивандальная защита графических объектов" обладают следующими положительными качествами:
- экономно используют ресурсы компьютера и торгового терминала;
- имеютвысокий уровень своевременности срабатывания ( невсе другие обычные привычные способы могутбыть своевременными);
- могутбыть применены совместно со многими другими вариантами (способами).
Эти схемы из данной статьи сконструированы в процедурном стиле. В том числе, чтобы они были более понятны, наглядны и могли послужить идеями для каких-то других вариантов.
Если вам не нравятся эти схемы или они не подходят вам по каким-то другим причинам, вы конечно можете использовать другие схемы. И, естественно, в том стиле программирования, что для вас привычен.
Применять эти схемы из статьи или не применять - это ваше личное дело и право.
No artigo"MQL5 para iniciantes: Proteção antivandalismo de objetos gráficos" são considerados apenas dois esquemas de opções (métodos) de muitos possíveis. Mas as opções (métodos) pode ser muito.
Para usar ou não usar os esquemas deste artigo - isso só depende de suas decisões.
Eu só posso dizer que estes dois esquemas do artigo"MQL5 para iniciantes: Proteção antivandalismo de objetos gráficos" têm as seguintes qualidades positivas:
- usam de forma econômica os recursos do computador e do terminal de negociação;
- têm um alto nível de pontualidade de resposta (nem todas as outras formas habituais podem ser pontuais);
- podem ser usados em conjunto com muitas outras formas.
Esses esquemas deste artigo foram feitos em um estilo processual. Em particular, para torná-los mais compreensíveis, visíveis e que possam servir como ideias para outras opções.
Se você não gostar desses esquemas ou se eles não se adequarem a você por algum outro motivo, é claro que você pode usar outros esquemas. E, é claro, no estilo de programação que você preferir.
Usar ou não usar os esquemas deste artigo depende de suas decisões.
Desculpe-me por meu inglês.
P./S.: Пожалуйста прочитайте эту статью ещё раз внимательно. И пожалуйста не торопитесь с выводами. Если у вас затем будут конструктивные вопросы или предложения, то пишите, пожалуйста. Я смогу ответить вам скорее всего только после новогодних каникул. Это через пять дней.
Por favor, leia este artigo novamente com atenção. E não se apresse em tirar conclusões. Se você tiver alguma dúvida ou sugestão específica, escreva. Provavelmente, só poderei respondê-las após o feriado de Ano Novo. Isso será em cinco dias.
P./S.: Сегодня у нас праздник Нового года. Поэтому и вас поздравляю с наступающим новым 2016-м годом!
Hoje temos o feriado de Ano Novo. Portanto, Feliz Ano Novo 2016 para você !
Ao compilar no MetaEditor versão 5.00 build 1241, os códigos de teste anexados ao artigo com os nomes:
- test_count_click_0.mq5
- test_count_click_1.mq5
- test_count_click_2.mq5
Como antes, eles funcionam corretamente no que diz respeito às funções antivandalismo. No entanto, ao compilar na nova compilação, encontrei um problema com uma função que não pertence às medidas antivandalismo do artigo. Fiz uma solicitação ao Service Desk (#1379624), mas é feriado, portanto, naturalmente, não espero obter uma resposta ou solução de lá.
Abaixo está a descrição do problema, a forma de solução e os arquivos com a solução do problema, em vez de anexados ao artigo:
Mas, primeiro, gostaria de enfatizar novamente que as funções relacionadas ao vandalismo funcionaram e funcionam corretamente ao compilar na nova compilação.
A incorreção dos códigos de teste nomeados se manifesta no fato de que, ao clicar nos objetos do painel de controle desses códigos de teste, o número de cliques não é mais exibido, exceto nos primeiros. Ou seja, não importa quantos botões sejam clicados, os números serão os mesmos:

No entanto, esses mesmos códigos de teste, compilados em versões anteriores, continuam a funcionar corretamente na nova compilação1241 , se não estiverem compilados nela. Ou seja, ao clicar nos objetos desses códigos de teste, há uma contagem normal de cliques:

Descobri que o problema detectado está relacionado à aplicação da função ArrayFill() no bloco de processamento do evento CHARTEVENT_OBJECT_CLICK em OnChartEvent().
count=countClick[index]+count;
int summ=countClick[NUMBER_ALL]+1;
//---
ArrayFill(countClick,index,1,count);
ArrayFill(countClick,NUMBER_ALL,1,summ)
Entretanto, se você colocar a impressão de dados ou ChartRedraw() antes dessa função, os códigos nomeados no artigo começarão a funcionar corretamente após a compilação:
count=countClick[index]+count; int summ=countClick[NUMBER_ALL]+1; //--- //TEST_PRINT_TWO(count,summ); ChartRedraw(); //--- ArrayFill(countClick,index,1,count); ArrayFill(countClick,NUMBER_ALL,1,summ);
Nos três arquivos com correções anexados abaixo, bem como em suas versões de mesmo nome anexadas ao artigo, essas seções, bem como a correção do problema nos códigos abaixo, são idênticas. Ou seja:
- no arquivo test_count_click_0.mq5 - as medidas de proteção antivandalismo não são aplicadas;
- no arquivo test_count_click_1.mq5 - uma variante de "autoexclusão" do programa do gráfico em caso de interferência não autorizada com seus objetos no gráfico;
- no arquivo test_count_click_2.mq5 - uma variante de "auto-recuperação" dos objetos do programa em caso de modificação ou exclusão não autorizada.
P./S.: Para a operação correta dos códigos anexados abaixo, é necessário ter o arquivo objectcreateandset.mqh anexado ao artigo na pasta "Include" , onde os códigos, com base nos quais encontrei a operação incorreta da função nomeada, estão anexados. Esse arquivo também pode ser baixado do Code Base
Por exemplo, pode ser útil se familiarizar com os filtros de verificação baseados na função StringFind() nos esquemas de exemplo do artigo. Como os filtros com a ajuda dessa função, se necessário, podem minimizar significativamente o número de pesquisas de nomes de objetos quando as notificações sobre quaisquer eventos com objetos no gráfico são recebidas nos programas em que são aplicadas. Ou seja, elas podem ser úteis, se necessário, não apenas na construção de variantes antivandalismo. E acrescentarei, por precaução, que o escopo de aplicação dos filtros de verificação baseados nessa função pode ser ampliado, se necessário, usando seu terceiro parâmetro de entrada.
- Defina um objeto MQL para cada objeto de gráfico, como a biblioteca de controle padrão já faz. Cada um desses objetos MQL representa um objeto de gráfico e contém todos os seus dados - estilo MQL5 normal.
- Empacote todos os objetos em um contêiner mestre
- Somente o contêiner mestre verifica se um objeto de gráfico foi excluído, seja de tempos em tempos ou pelo evento de gráfico correspondente durante OnChartEvent().
- Adicione uma função de membro .ReCreate() ao CWnd e uma função virtual OnRecreate() a todos os objetos que implementam essa funcionalidade
- Se o contêiner mestre detectar algum tipo de "vandalismo", ele enviará um .ReCreate() a todos os seus objetos filhos.
Sua solução: comprar um novo terno OOP. Ah, e também não se esqueça de comprar uma gravata para o seu novo terno
PS Quanto à biblioteca padrão: infelizmente, a biblioteca de controle é a pior parte dessa biblioteca - muitos bugs e opções não realizadas ou inacessíveis. Como resultado, às vezes essa biblioteca é uma fonte de problemas (lixo no gráfico), conforme mencionado neste artigo
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Novo artigo MQL5 para iniciantes: Proteção antivandalismo de objetos gráficos foi publicado:
O que o seu programa deve fazer, se os painéis de controle gráfico foram removidos ou modificados por alguém? Neste artigo, vamos mostrar a você o porquê de não ter objetos no gráfico "sem dono" e como não perder o controle sobre eles, se forem renomeados ou excluídos após o aplicativo ser deletado.
Uma das vantagens da linguagem de programação MQL5 são as funções padrões existentes MQL5, onde você pode formar códigos para completar várias tarefas e alcançar objetivos diferentes quando se usa o terminal de negociação MetaTrader 5.
Este artigo, escrito numa linguagem simples e contendo exemplos fáceis, considera duas variantes de programas a implementação da resposta a ações aos objetos gráficos do painel de controle que são apagados ou alterados. Nós vamos mostrar a você como garantir que não existam objetos sem dono presentes no gráfico, após o programa ser excluído, onde o programa pode ter perdido o controle, porque alguém ou algo os renomeou.
Fig. 1. Exemplo da aparência de um painel de controle antes e depois das propriedades dos objetos serem alteradas manualmente
Opções para construir as ações de resposta à interferência externa no código, descritas neste artigo, podem não serem redundantes aos casos em que, por exemplo, um programa de terceiros lançados no gráfico e não destinados diretamente a sua limpeza, usam uma função de exclusão de objetos ( objetos DeleteAll() ou uma que você mesmo criar), operando pelos parâmetros definidos nela como:
- a remoção completa de todos os tipos de objetos gráficos na mesma janela/subjanela com objetos criados manualmente ou usando outros programas;
- ou a remoção completa dos tipos de objetos que também estão presentes no painel de controle dos seus programas;
- ou remoção de prefixo que correspondem ao prefixo dos objetos do seu programa.
Essas opções também são relevantes, quando é aconselhável, incluindo a operação correta do programa, providenciar ações para remoção acidental ou intencional de objetos de seu painel de controle ou alteração manual das suas propriedades no código. Este artigo também pode ser útil para aqueles que começaram a aprender o evento de manipulação na função OnChartEvent().Autor: Dina Paches