Galeria de UIs escritas em MQL - página 61

 
hini #:
Porque no testador ele não chama OnChartEvent

É isso mesmo. Mas, na mesma situação no MT4, havia variantes possíveis. Implementei uma delas com sucesso. A interface funcionava para um Expert Advisor em execução no modo normal, mas podia controlar sua cópia em execução no testador. A conexão foi realizada por meio de recursos. O EA no gráfico recebeu todos os dados durante o processo de teste. Com o MT5, talvez a situação seja mais complicada. Não tenho certeza se será possível estabelecer "comunicação" entre duas cópias por meio de recursos. Essa questão requer um estudo separado.

 
Vamos passar para o próximo tópico:

4. navegar pelas listas de propriedades de itens individuais.

//-----------------------------------------------------------------------------------------

Deixe-me lembrá-lo da lista de tópicos a serem considerados:

1. orientação na lista do intellisense e seleção da função da janela correta.

2. Abrir e fechar janelas programaticamente.

3. orientação na lista do intellisense e seleção do item certo na janela certa.

4. Navegar pelas listas de propriedades de elementos individuais.

5. Analisar o nome de um elemento e a função de janela.

6.Retornar o valor do parâmetro de um elemento selecionado para uma variável de seu tipo. Considerar três tipos de vários elementos diferentes.

7. Definir valores nos parâmetros de diferentes tipos de elementos. Vamos ver como os valores aparecerão nas janelas de interface desses elementos.

8. Retornar os valores dos parâmetros de um elemento, modificar e encaminhar esse valor para outro elemento. Considere diferentes tipos de elementos e valores e teste o encaminhamento entre diferentes tipos de elementos em diferentes janelas.

9. Retornar o valor anterior (_V_LAST). Quando e para quais casos o último valor é necessário (não confundir com o valor atual).

10. Teste a configuração dos estados ON/OFF/LOCK_ON/LOCK_OFF/LOCK/UNLOCK para diferentes tipos de elementos.

11. Vamos tentar vincular e sincronizar as alterações de valores de elementos de tipos diferentes: por exemplo, campo de entrada com botões e controle deslizante. Vamos supor que, quando o valor de um elemento (manual ou de software) for alterado, o valor do segundo elemento será alterado de forma correspondente.

12. Vamos tentar redefinir programaticamente os limites do intervalo do controle deslizante e do campo de entrada com botões por meio de funções de wrapper. Não tive tempo de testar isso, mas algo sugere que funcionará. No entanto, vamos ver.

13. Vamos tentar retornar os estados dos elementos por meio de funções de wrapper. Isso está incluído na funcionalidade, mas não tive tempo de testá-la. Então, vamos ver... O resultado é desconhecido.

14. Vamos obter e definir cores para texto e bases de elementos. Podemos tentar associar essas cores a alguns eventos simples ou limites de valores.

15. Vou lhe dizer mais sobre como navegar e ler a impressão do novo arquivo da API.

//------------------------------------------

A cor amarela indica tópicos que já foram abordados.

 
Vamos detalhar o tópico ponto a ponto:

  • O conceito de separação de propriedades em listas, com base na "relação" dos elementos, foi implementado com sucesso.
  • Como resultado da implementação, foram criadas 7 listas de propriedades exclusivas para todos os tipos de elementos.
  • Cada lista recebe um identificador especial. Esse é o prefixo p (abreviação de propriedade) e um número de série.
  • Como resultado, cada lista pode ser encontrada no intellisense por sete prefixos: p1, p2, p3, p4, p5, p6 e p7.
  • Por conveniência e para evitar confusão, os prefixos das listas de propriedades são impressos nos nomes das funções de wrapper:

  • Quando o prefixo é inserido, aparece uma lista de propriedades individuais. Enfatizei a palavra "individual" propositalmente, pois esse ponto é de suma importância.
  • Para retornar e definir valores de propriedade, as funções de wrapper aceitam nomes de propriedades SOMENTE com o prefixo escrito em seu próprio nome:


//--------------------------------------------------------------------------------------------------------------


  • SOMENTE essas propriedades da lista estão disponíveis para a caixa de seleção. Entretanto, a lista em si não pertence apenas à caixa de seleção, mas também a alguns outros elementos.

//--------------------------------------------------------------------------------------------------------------


  • O elemento C_LIST ainda não tem propriedades especiais em sua lista. Somente ações que podem ser executadas pelo wrapper (exceto retornar V_LAST - o último valor).

//--------------------------------------------------------------------------------------------------------------


  • Ao contrário do C_LIST, o controle deslizante tem uma grande lista de propriedades e ações disponíveis.

//--------------------------------------------------------------------------------------------------------------


  • Uma ampla gama de propriedades e ações disponíveis pertence ao elemento S_EDIT:


Ênfase adicionada:

Cada função de wrapper aceita propriedades somente com o prefixo explicitado em seu nome.


É assim que o trabalho com listas se parece na prática(coloque colchetes no final, pois o intellisense não funciona dentro dos colchetes das funções de wrapper):

O gif está ligeiramente acelerado.


Como resultado das chamadas mostradas no gif, as funções de wrapper retornam os valores das propriedades especificadas.

Antes da chamada, você deve declarar uma variável para armazenar o valor da propriedade ou o resultado da execução da função. Mais informações sobre isso nos tópicos a seguir.

 

5.
Analisar o nome do elemento e a função de janela wrapper:


1. Nome da função do elemento wrapper:

Vejamos o exemplo da função do elemento do campo de entrada de texto EDITAR: w7_s_p4_EDIT_Comment_1();

//-------------------------------------------------------------

  • w7 - janela número 7

//-------------------------------------------------------------
  • s - Tipo de valor de retorno dessa função de wrapper string.

//-------------------------------------------------------------
  • p4 - Prefixo da lista de propriedades desse tipo de elemento.

/ / - ------------------------------------------------------------
  • EDIT - Tipo de elemento.

//-------------------------------------------------------------

  • Comment_1 - Nome do elemento específico.

//-------------------------------------------------------------


2. O nome da função do wrapper da janela:

Vamos dar uma olhada em outra função como exemplo: w_15_Processing_the_data();

//-------------------------------------------------------------

  • w_15 - janela número 15
Observe que o número não vem imediatamente após w, mas através do traço _. Isso é importante.

) // - ------------------------------------------------------------
  • Processing_the_data - O nome dessa janela (para janelas de aviso, o nome pode não coincidir com Caption - o texto no cabeçalho da janela).

//-------------------------------------------------------------

Deve-se observar que a função de janela ainda não tem um prefixo para abrir a lista de propriedades. Esse recurso será definitivamente exibido. Uma lista especial de propriedades da janela para retornar/definir será gerada e um prefixo será atribuído. Além disso, a função window ainda não contém uma letra de tipo de retorno.

Por enquanto, a função só pode abrir ou fechar uma janela.


Esses defeitos serão corrigidos na próxima versão.


 
Recomenda-se que essas informações do tutorial sejam resumidas uma vez em particular e separadamente, caso contrário, elas inundarão os comentários no futuro
 
hini #:
Recomenda-se resumir essas informações de treinamento uma vez em particular e separadamente, caso contrário, elas inundarão os comentários no futuro
Obviamente, essas informações serão resumidas e ordenadas como devem ser.
 
No período atual, a ordem das instruções, explicações e comentários está apenas sendo formada. O conteúdo da documentação futura é acumulado harmoniosamente no processo de desenvolvimento e comunicação com os usuários. Como consequência, as informações básicas são apresentadas em partes. O recebimento de feedback é necessário e é uma etapa importante que aumenta a qualidade das soluções técnicas. O software passa por um estágio de formação e poderá alcançar a funcionalidade total graças à participação ativa do público. O resultado será um programa completo com documentação detalhada.
 

6.retornar o valor doparâmetro oudapropriedade para uma variável do tipo necessário:


O tipo do parâmetro do elemento(int, double ou string) determina o tipo da função do elemento.

Sabe-se que as funções de elemento retornam o valor do parâmetro com um dos três tipos: int, double ou string.

Entretanto, as funções também retornam valores de propriedade...

Surge uma situação em que o tipo do valor do parâmetro pode não coincidir com o tipo das propriedades, que são sempre int. Acontece que as funções retornam valores de propriedade do tipo errado, por exemplo, double ou string em vez de int. Esse inconveniente forçado é o preço pela universalidade das funções.

A tarefa do usuário é converter o valor recebido para o tipo necessário por conta própria..


Deixe-me enfatizar: o tipo principal de todas as propriedades de elementos é int.


Vamos dar uma olhada mais de perto nos exemplos de perguntas e respostas:

  • - P: Como a função retornará o valor de uma propriedade do tipo int se o tipo da função for string?
  • - Resposta: A função retornará o valor de int com o tipo string.
  • - Pergunta: Como a função retornará o valor deint se o tipo da função for double?
  • - Resposta: A função retornará o valor de int com o tipo double.
  • - Pergunta: Como a função retornará o valor double se o tipo de função for int?
  • - Resposta: As propriedades de elementos do tipo double não existem. As propriedades do parâmetro do elemento podem ser do tipo double. Nesse caso, a própria função será do tipo double.


O tipo do valor do parâmetro determina o tipo da função do elemento.

Não há propriedades de um elemento do tipo double. Somente int. Mas há propriedades de parâmetro que aceitam os tipos double, string ou int. Por exemplo, V_CURRENT, V_LAST, V_MAX, V_MIN, V_STEP podem ser int ou double. Em ambos os casos, a função de elemento também se tornará int ou double, mas a função não poderá se tornar int se as propriedades do parâmetro, ou o próprio parâmetro, não forem int.

E se a função do controle deslizante retornar o tipo int, isso significa que, no estágio de criação do elemento, o próprio usuário atribuiu números inteiros ao seu parâmetro ou às suas propriedades - por exemplo, colocou o intervalo do controle deslizante ou os campos de entrada com botões dentro de valores inteiros.



Conclusão: a tarefa do usuário é converter os valores recebidos para o tipo necessário.

Vamos considerar alguns exemplos práticos:

1.

   //------------------------------------------------
   //Текстовое поле ввода EDIT. Тип функции - string.
   //Получение и установка цвета текста и основания:
   //------------------------------------------------
   
   //1. Устанавливаем любой текст в пустое поле ввода:
   w7_s_p4_EDIT_Comment_1("Some random text");
   //------------------------------------------------

//------------------------------------------------------------------------------------------------------------

2.

   //------------------------------------------------
   //2. Получаем цвет основания поля ввода:
   uint Comment_1_base_color =  (uint)w7_s_p4_EDIT_Comment_1(get_s,p4_COLOR_base); 
   //------------------------------------------------
   //Выводим результат в журнал:
   Print("Comment_1_base_color  ",Comment_1_base_color);
   //------------------------------------------------

//------------------------------------------------------------------------------------------------------------

3.

   //------------------------------------------------
   //3. Назначаем основанию новый цвет:
   w7_s_p4_EDIT_Comment_1((uint)clrWheat,p4_COLOR_base); 
   //------------------------------------------------

Veja o resultado:


//------------------------------------------------------------------------------------------------------------

4.

   //------------------------------------------------
   //4. Получаем цвет текста поля ввода: 
   uint Comment_1_text_color =  (uint)w7_s_p4_EDIT_Comment_1(get_s,p4_COLOR_text); 
   //------------------------------------------------
   //Выводим результат в журнал:
   Print("Comment_1_text_color  ",Comment_1_text_color); 
   //------------------------------------------------


//------------------------------------------------------------------------------------------------------------

5.

   //------------------------------------------------
   //5. Устанавливаем другой цвет тексту:
   w7_s_p4_EDIT_Comment_1((uint)clrRed,p4_COLOR_text); 
   //------------------------------------------------

Veja o resultado:




Em seguida, vamos testar a obtenção e a definição de outras propriedades de elementos e parâmetros. Vamos também tentar trabalhar com o tipo double.

Документация по MQL5: Основы языка / Операторы / Оператор возврата return
Документация по MQL5: Основы языка / Операторы / Оператор возврата return
  • www.mql5.com
Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Результат вычисления выражения возвращается...
 

Segui o código e o testei, e encontrei uma coisa inesperada que não se oculta automaticamente quando o comprimento da cadeia aleatória é muito longo

w7_s_p4_EDIT_Comment_1("Some random text AAAAAAAA");


 
Esses são problemas menores, deixe-os para depois e veja o que acontece. Se você tiver tempo, verifique-os; caso contrário, não os corrija por enquanto!