Guia prático do MQL5: utilização de diferentes modos de impressão
Introdução
Este é o primeiro artigo da série Livro de receitas MQL5. Vou iniciar com exemplos simples para permitir que aqueles que estejam dando os seus primeiros passos em programação se familiarizem gradativamente com a nova linguagem. Eu me lembro que as minhas primeiras tentativas de projetar e programar sistemas de negociação foram muito difíceis, visto que era a primeira linguagem de programação da minha vida. Até então eu costumava pensar que eu não tinha sido feito para isso e que dificilmente seria capaz de entendê-la algum dia.
Entretanto, no fim das contas foi mais fácil do que eu pensava e apenas demorou alguns meses até que eu pudesse desenvolver um programa razoavelmente complexo. Você pode descobrir mais sobre isso no artigo chamado "Oportunidades ilimitadas com o MetaTrader 5 e MQL5".
Aqui, tentarei guiar os desenvolvedores de Expert Advisors iniciantes através do processo de programação, passando do mais simples ao complexo. Não vou copiar aqui qualquer informação disponível na Ajuda do menu do MetaEditor 5, então prepare-se para apertar F1 com muita frequência. Ao mesmo tempo, esta série de artigos oferecerá a você muitos exemplos, funções prontas para uso e esquemas que podem ser usados em seus desenvolvimentos, tanto em formato original como personalizado.
Então, vamos começar. Neste artigo, criaremos um script simples que imprime as propriedades de símbolo em diversos modos. Ao desenvolver um programa, especialmente no início do processo de aprendizagem, frequentemente haverá situações em que o programa não responde da forma esperada. Se isso acontecer, você terá que verificar os valores de determinadas variáveis envolvidas nos cálculos. Em nosso caso, analisaremos detalhadamente três métodos em que usaremos as funções Print(), Comment() e Alert(). E após isso, você poderá decidir qual método é mais conveniente para você.
Assistente MQL5
O meu estudo da linguagem MQL5 começou com scripts. É muito fácil e rápido. Quando o script é carregado, ele executa a função que você criou e em seguida é apagado do gráfico. Isso permite que você faça testes enquanto procede e observa em que direção mover.
Se você ainda não instalou o terminal de negociação MetaTrader 5, você pode fazer isso agora mesmo. Após a instalação, inicie o terminal e abra o MetaEditor 5 apertando a tecla F4. Essa tecla pode ser usada para alternar rapidamente entre o terminal de negociação MetaTrader 5 e o MetaEditor 5. Você também pode iniciar o MetaEditor 5 clicando no botão adequado na barra de ferramentas do terminal. Certifique-se de estudar muito bem a interface do programa utilizando a Ajuda (F1) no terminal de negociação e no MetaEditor 5, visto que apenas abordaremos alguns problemas rapidamente, se é que faremos isso.
Inicie o MetaEditor 5 e pressione Ctrl+N ou o botão Novo abaixo do menu principal no painel do MetaEditor. Uma janela do Assistente MQL5 aparecerá e nela você poderá selecionar o tipo de programa que deseja criar. Em nosso caso, selecionamos Script e clicamos em Próximo:
Figura 1. Assistente MQL5 - Script
Em seguida, você precisará inserir o nome do script (nome do arquivo). De forma padrão, os scripts são criados em Metatrader 5\MQL5\Scripts\file_name.mq5. Nesse diretório, você também pode criar outras pastas para agrupar os seus arquivos de acordo com a finalidade deles.
Figura 2. MQL5 Wizard - Nome do arquivo
Neste ponto, você também pode adicionar parâmetros de entrada, se necessário. Quando tudo estiver configurado e pronto, clique em Finalizar. Um novo documento será criado com a utilização do modelo e você poderá continuar com o script:
//+------------------------------------------------------------------+ //| PrintModes.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- } //+------------------------------------------------------------------+
Escrever um código
Tudo que está após barras duplas é um comentário e não afeta a execução do programa. É sempre recomendável fornecer comentários detalhados para o seu código visto que isso facilita consideravelmente a compreensão da lógica do programa, especialmente após um longo intervalo.
Tudo que foi colocado após #property nas três primeiras linhas do código acima está relacionado às propriedades do programa. Mais informações sobre cada função e propriedade podem ser encontradas na Referência MQL5. Para visualizar rapidamente a descrição de qualquer função, você apenas precisa dar um clique duplo sobre a função para selecioná-la e apertar F1. A janela de Ajuda abrirá, mostrando a você a descrição da função selecionada.
A isso segue a função principal do script - OnStart() que é a que contém todas as outras funções e cálculos.
Precisamos habilitar a possibilidade de selecionar um método para imprimir as informações requeridas antes da execução do programa. Isso significa que devemos ter um parâmetro externo que permita selecionar o modo necessário a partir da lista suspensa. Além disso, precisamos especificar outra propriedade (#property) que será responsável por abrir uma janela com parâmetros externos do script antes da execução do programa. Essa propriedade é script_show_inputs. Vamos adicioná-la embaixo de todas as outras propriedades que já estão no código:
#property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property script_show_inputs //---
Para ter a lista suspensa nos parâmetros externos, precisamos criar enumeração de todos os modos. Vamos inserir este código após as propriedades do programa:
// ENUMERATION enum ENUM_PRINT_MODE { PRINT = 0, COMMENT = 1, ALERT = 2 }; //---
A isso segue o único parâmetro externo deste script - PrintMode:
// INPUT PARAMETERS input ENUM_PRINT_MODE printMode=PRINT; // Print mode
Os parâmetros de entrada são obrigatoriamente localizados no início do programa, com o modificador input que define o parâmetro externo sendo posicionado antes do tipo de variável. Se rodarmos o script agora, uma janela para o programa irá abrir e poderemos selecionar um modo de impressão a partir da lista suspensa do parâmetro Modo de impressão :
Fig. 3. Janela de parâmetros de script
Depois, podemos criar variáveis e atribuir alguns valores a elas (em nosso caso, imprimiremos alguns dados de símbolo) para depois imprimí-las usando o modo especificado pelo usuário no parâmetro externo. Para este propósito, precisamos organizar uma função de usuário separada - PrintSymbolProperties() - que será chamada na função OnStart() principal.
Para criar a função, precisamos apenas inserir o código como mostrado abaixo:
//+------------------------------------------------------------------+ //| PRINTING SYMBOL PROPERTIES | //+------------------------------------------------------------------+ void PrintSymbolProperties() { }
O tipo de valor a ser retornado deve ser especificado antes do nome da função. Alternativamente, se a função não retornar nada, como em nosso caso, devemos colocar vazio. Além disso, precisamos escrever o código restante no corpo da função PrintSymbolProperties(), entre chaves. Vamos primeiro definir as variáveis.
string symb_symbol = ""; // Symbol int symb_digits = 0; // Number of decimal places int symb_spread = 0; // Difference between the ask price and bid price (spread) int symb_stoplevel = 0; // Stop levels double symb_ask = 0.0; // Ask price double symb_bid = 0.0; // Bid price
O tipo de variável depende do tipo de dado que será atribuído a ela. Agora vamos atribuir valores a essas variáveis. Para obter as propriedades de símbolo, a MQL5 oferece funções especiais para cada tipo de dado.
symb_symbol =Symbol(); symb_digits =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); symb_spread =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL); symb_ask =SymbolInfoDouble(_Symbol,SYMBOL_ASK); symb_bid =SymbolInfoDouble(_Symbol,SYMBOL_BID); //---
Para assegurar uma aprendizagem adequada do material, utilize a Referência MQL5 para estudar cada função e os parâmetros transferidos por ela. Na Referência, todas as propriedades de símbolo são exibidas em uma tabela a que você terá que se referir frequentemente.
Agora que as variáveis têm valores atribuídos a elas, apenas precisamos escrever um código adequado para cada modo de impressão. Ele tem o seguinte aspecto:
//--- // If it says to print to the journal if(printMode==PRINT) { Print("Symbol: ",symb_symbol,"\n", "Digits: ",symb_digits,"\n", "Spread: ",symb_spread,"\n", "Stops Level: ",symb_stoplevel,"\n", "Ask: ",symb_ask,"\n", "Bid: ",symb_bid ); } //--- // If it says to print to the chart if(printMode==COMMENT) { int mb_res=-1; // Variable with the option selected in the dialog box //--- Comment("Symbol: ",symb_symbol,"\n", "Digits: ",symb_digits,"\n", "Spread: ",symb_spread,"\n", "Stops Level: ",symb_stoplevel,"\n", "Ask: ",symb_ask,"\n", "Bid: ",symb_bid ); //--- // Open a dialog box mb_res=MessageBox("Do you want to delete comments from the chart?",NULL,MB_YESNO|MB_ICONQUESTION); //--- // If "Yes" is clicked, remove the comments from the chart if(mb_res==IDYES) { Comment(""); } //--- return; } //--- // If it says to print to the alert window if(printMode==ALERT) { Alert("Symbol: "+symb_symbol+"\n", "Digits: "+IntegerToString(symb_digits)+"\n", "Spread: "+IntegerToString(symb_spread)+"\n", "Stops Level: "+IntegerToString(symb_stoplevel)+"\n", "Ask: "+DoubleToString(symb_ask,_Digits)+"\n", "Bid: "+DoubleToString(symb_bid,_Digits) ); } //---
Se você selecionar PRINT para o parâmetro externo do Expert Advisor, as informações serão impressas no diário de Expert Advisors (Caixa de Ferramentas - aba Experts):
Figura 4. Caixa de Ferramentas - aba Experts
Se você selecionar COMMENT, as informações serão exibidas no canto superior esquerdo do gráfico. Após as informações aparecerem no gráfico, a função MessageBox() abrirá uma caixa de diálogo que perguntará se você deseja apagar os comentários do gráfico:
Figura 5. Comentários no canto superior esquerdo do gráfico
Se você optar por ALERT, após a execução do script, uma janela de alerta contendo as informações solicitadas ou uma simples mensagem de usuário aparecerá. Nesse caso, assim como no caso da opção PRINT, as informações também são impressas no diário, mas é acompanhada adicionalmente por uma notificação sonora.
Figura 6. Janela de alerta
Segue abaixo o código completo do script:
//+------------------------------------------------------------------+ //| PrintModes.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "http://tol64.blogspot.com" #property description "email: hello.tol64@gmail.com" #property version "1.00" #property script_show_inputs //--- //--- ENUMERATION enum ENUM_PRINT_MODE { PRINT = 0, COMMENT = 1, ALERT = 2 }; //--- // INPUT PARAMETERS input ENUM_PRINT_MODE printMode=PRINT; // Print mode //--- //+------------------------------------------------------------------+ //| MAIN FUNCTION | //+------------------------------------------------------------------+ void OnStart() { PrintSymbolProperties(); } //+------------------------------------------------------------------+ //| PRINTING SYMBOL PROPERTIES | //+------------------------------------------------------------------+ void PrintSymbolProperties() { string symb_symbol = ""; // Symbol int symb_digits = 0; // Number of decimal places int symb_spread = 0; // Difference between the ask price and bid price (spread) int symb_stoplevel = 0; // Stop levels double symb_ask = 0.0; // Ask price double symb_bid = 0.0; // Bid price //--- symb_symbol =Symbol(); symb_digits =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); symb_spread =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL); symb_ask =SymbolInfoDouble(_Symbol,SYMBOL_ASK); symb_bid =SymbolInfoDouble(_Symbol,SYMBOL_BID); //--- // If it says to print to the journal if(printMode==PRINT) { Print("Symbol: ",symb_symbol,"\n", "Digits: ",symb_digits,"\n", "Spread: ",symb_spread,"\n", "Stops Level: ",symb_stoplevel,"\n", "Ask: ",symb_ask,"\n", "Bid: ",symb_bid ); } //--- // If it says to print to the chart if(printMode==COMMENT) { int mb_res=-1; // Variable with the option selected in the dialog box //--- Comment("Symbol: ",symb_symbol,"\n", "Digits: ",symb_digits,"\n", "Spread: ",symb_spread,"\n", "Stops Level: ",symb_stoplevel,"\n", "Ask: ",symb_ask,"\n", "Bid: ",symb_bid ); //--- // Open a dialog box mb_res=MessageBox("Do you want to delete comments from the chart?",NULL,MB_YESNO|MB_ICONQUESTION); //--- // If "Yes" is clicked, remove the comments from the chart if(mb_res==IDYES) { Comment(""); } //--- return; } //--- // If it says to print to the alert window if(printMode==ALERT) { Alert("Symbol: "+symb_symbol+"\n", "Digits: "+IntegerToString(symb_digits)+"\n", "Spread: "+IntegerToString(symb_spread)+"\n", "Stops Level: "+IntegerToString(symb_stoplevel)+"\n", "Ask: "+DoubleToString(symb_ask,_Digits)+"\n", "Bid: "+DoubleToString(symb_bid,_Digits) ); } } //+------------------------------------------------------------------+
Conclusão
Terminaremos o artigo aqui. Além dos métodos descritos acima, você também pode escrever os dados em um arquivo. Ele pode ser um arquivo de texto simples ou mesmo um relatório em HTML bem formatado utilizando CSS. Mas esses métodos são muito mais complicados para iniciantes e os que foram apresentados acima devem ser suficientes para começar.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/638
- 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
Estou inciando os estudos em MQL5, achei este artigo muito bom, muito explicativo.Agradeço pelo material