Conselhos de um programador profissional (Parte I): Armazenamento, depuração e compilação de códigos Trabalho com projetos e registros
Sumário
- Introdução
- Armazene seu código em subdiretórios separados
- Um código para vários terminais
- Use um sistema de controle de versão
- Use um terminal separado em uma conta demo para depurar o código
- Compile todos os arquivos de código de uma vez
- Use um sistema de gerenciamento de projetos e tarefas
- Seleção de registros
- Destaque de registros
- Pesquisa contextual
- Fim do artigo
Introdução
Armazene seu código em subdiretórios separados
Os arquivos de programa do terminal estão localizados no diretório MQL5. Este catálogo é chamado de "sandbox". O acesso ao exterior está fechado. E assim é como deve ser. Porém, se conectarmos nossa DLL, provavelmente poderemos entrar em qualquer lugar.
Por exemplo, a estrutura do projeto Cayman:
- /Experts/Cayman/ - Expert Advisor
- /Files/Cayman/ - arquivos de dados (configurações, parâmetros)
- /Include/Cayman/ - biblioteca de classes (funções)
- /Scripts/Cayman/ - scripts principais (de combate)
- /Scripts/CaymanDev/ - scripts de desenvolvedor (para depuração)
As principais vantagens deste posicionamento:
- Pesquisa contextual apenas em arquivos de projeto com TotalCommander
- Controle de versão via Git (acompanhar apenas arquivos de projeto, ignorar o resto)
- Simplifica a cópia para outro terminal (demo -> real - versão)
Um código para vários terminais
Um dos sinais de boa prática de programação é a ausência de duplicatas de código. Se você encontrar as mesmas linhas de código em vários lugares, sinta-se à vontade para "embrulhá-las" numa função. O mesmo se aplica aos arquivos MQL5 - o texto do arquivo de programa deve estar numa cópia. Isso é resolvido usando uma referência simbólica para o diretório MQL5.
Vamos por o diretório de projetos em D:\Project e o diretório de dados do terminal em C:\Users\Pro\AppData\Roaming\MetaQuotes\Terminal\9EB2973C469D24060397BB5158EA73A5
- Fechamos o terminal
- Vamos para o diretório de dados
- Movemos o diretório MQL5 para o diretório de projetos
- Estando no diretório de dados, executamos cmd e digitamos o comando
mklink /D MQL5 D:\Project\MQL5 - Iniciamos o terminal
O terminal nem perceberá que o "sandbox" (arquivos de programa) foi movido para D:\Project\MQL5.
A principal vantagem deste posicionamento são todos os projetos pessoais num diretório (D:\Project).
Use um sistema de controle de versão
Os programadores profissionais não duvidam da necessidade de usar esse sistema. É uma ferramenta indispensável, principalmente quando uma equipe de programadores trabalha no mesmo projeto. A pergunta é: que sistema devemos escolher? De fato tem que ser o Git.
As principais vantagens do Git são:
- Repositório local. Podemos experimentar (ramificar) e mudar para qualquer ramificação (versão) com um clique.
- Interface gráfica conveniente (TortoiseGit). Aqui controlamos com o mouse.
- Repositório em nuvem gratuito para projetos pessoais (Bitbucket). Não temos medo de disco rígido falhar.
- Histórico de alteração de arquivos com capacidade de restaurar ou visualizar versões anteriores (convenientemente visualizado no Bitbucket)
Não fornecerei instruções detalhadas de instalação e configuração, mas mencionarei alguns recursos específicos. Instalamos Git (trabalho via linha de comando) e TortoiseGit (para operação através do mouse). No diretório D:\Project\MQL5 criamos o arquivo .gitignore com o seguinte conteúdo
# exclude files *.ex4 *.ex5 *.dat log.txt # exclude directories completely Images Indicators Libraries Logs Presets Profiles Services "Shared Projects" Levels Params # exclude directory contents Experts/* Files/* Include/* Scripts/* # except for directories !Experts/Cayman !Files/Cayman !Include/Cayman !Scripts/Cayman !Scripts/CaymanDev
Este arquivo rastreará apenas versões de arquivos de programa (*.mq?) do projeto. Criamos um repositório local no diretório MQL5. Adicionamos arquivos e fazemos o primeiro commit (consertamos a versão). O repositório local está pronto. Trabalhamos com o código e não nos esquecemos de fazer commits frequentes com uma breve descrição das mudanças. Os comentários tornam mais fácil navegar e pesquisar o histórico posteriormente.
Para se conectar a um repositório em nuvem, primeiro precisamos criar uma conta e um repositório no Bitbucket. Logicamente, o nome do repositório deve corresponder ao nome do projeto. No meu caso, é CaymanMQL5, já que também tem CaymanMQL4. Importamos o repositório local para o da nuvem. O repositório em nuvem está pronto. Passos básicos via TortoiseGit (TG):
- Trabalhamos com o código (uma tarefa - um commit)
- Verificamos mudanças (TG/Check for modifications…)
- Adicionar novos arquivos (Add)
- Excluímos arquivos desnecessários (missing) (Delete)
- Nós nos comprometermos com o repositório local (Commit)
- Enviamos para o repositório na nuvem (Push)
Use um terminal separado em uma conta demo para depurar o código
Você deve ter a última versão de trabalho do código numa conta real (apenas *.ex? sem *.mq?). O código no processo de depuração deve estar numa conta de demonstração. Para copiar a demonstração -> real, podemos usar o seguinte arquivo em lote:
@echo off setlocal set PROJECT=Cayman set SOURCE=d:\Project\MQL5 set TARGET=c:\Users\Pro\AppData\Roaming\MetaQuotes\Terminal\2E8DC23981084565FA3E19C061F586B2\MQL5 set PARAMS=/MIR /NJH /NJS rem MIR - MIRror a directory tree and delete dest files/folders that no longer exist in source rem NJH - No Job Header rem NJS - No Job Summary echo Copy *.ex? // Source to Production echo Source = %SOURCE% echo Production = %TARGET% robocopy %SOURCE%\Experts\%PROJECT% %TARGET%\Experts\%PROJECT% *.ex? %PARAMS% robocopy %SOURCE%\Scripts\%PROJECT% %TARGET%\Scripts\%PROJECT% *.ex? %PARAMS% rem Copy all files except AppSettings.txt, [Levels], [Params] robocopy %SOURCE%\Files\%PROJECT% %TARGET%\Files\%PROJECT% *.* %PARAMS% /XF AppSettings.txt /XD Levels Params robocopy %SOURCE%\Scripts\Cayman %TARGET%\Scripts\Cayman *.ex? /NJH /NJS robocopy %SOURCE%\Scripts\CaymanDev %TARGET%\Scripts\CaymanDev *.ex? /NJH /NJS echo. endlocal pause
Compile todos os arquivos de código de uma vez
O objetivo é manter a consistência do código. Para evitá-lo, por exemplo, alteramos os parâmetros da função. O Expert Advisor é compilado, mas permanece o script que usa a versão antiga da função. O script (compilado anteriormente) pode funcionar bem, mas não executará a funcionalidade necessária. Para compilação em lote, podemos usar o seguinte arquivo:
@echo off setlocal set METAEDITOR="C:\Program Files\RoboForex - MetaTrader 5\metaeditor64.exe" set CAYMAN=d:\Project\MQL5\Scripts\Cayman set CAYMAN_DEV=d:\Project\MQL5\Scripts\CaymanDev echo METAEDITOR=%METAEDITOR% echo CAYMAN=%CAYMAN% echo CAYMAN_DEV=%CAYMAN_DEV% echo. echo Wait compile... D: cd %CAYMAN% echo %CAYMAN% for %%F in (*.mq?) do ( %METAEDITOR% /compile:%%F /log type %%~dpnF.log ) del *.log cd %CAYMAN_DEV% echo %CAYMAN_DEV% for %%F in (*.mq?) do ( %METAEDITOR% /compile:%%F /log type %%~dpnF.log ) del *.log endlocal echo. pause
Use um sistema de gerenciamento de projetos e tarefas
Esses sistemas, sem falhas, são usados no desenvolvimento de equipes e também são úteis para projetos pessoais. Existem muitos sistemas e metodologias de gerenciamento de projetos. Eu pessoalmente uso o ZenKit. É gratuito para pequenas equipes. Ele oferece um quadro Kanban muito conveniente.
Eu costumava ter vários painéis Kanban (um para cada projeto). A desvantagem de múltiplos quadros é que não conseguimos ter uma visão geral. Por isso, decidi adicionar um projeto como estágio de desenvolvimento. Dessa forma, é muito mais fácil gerenciar as tarefas. Por exemplo, meu quadro Kanban tem 5 estágios de desenvolvimento:
- Legenda - objetivo do projeto, referências a e instruções. Os registros não passam para outros estágios. Sempre podemos ver objetivo geral do quadro e podemos acessar facilmente links para recursos úteis.
- Cayman - projetos em MQL5, MQL4
- Website - projeto de site pessoal
- Aceito - tarefa em andamento
- Concluído - tarefa concluída
O processo de utilização do quadro é muito simples e intuitivo. Surge uma ideia, solução ou erro de programa interessante. Em seguida, formulo-o brevemente e adiciono-o ao quadro, ao projeto em questão. Também podemos adicionar imagens e arquivos. Em seguida, seleciono uma tarefa e a movo para o estágio "Aceito". Depois, trabalho com ela, testo e passo para o estágio "Concluído".
Ao analisar o número de tarefas em projetos, podemos facilmente determinar problemas e gargalos. Tento realizar tarefas a partir de projetos "sobrecarregados". Meu objetivo é alinhar os projetos para que tenham um número semelhante de tarefas. O desenvolvimento da equipe tem outra etapa intitulada "Teste", que não é relevante para mim, pois trabalho sozinho.
Seleção de registros
Como se sabe, todas as saídas das funções Print são registradas no log do Terminal MQL5\Logs\yyyyMMdd.log. Neste caso, todos os símbolos (instrumentos) são misturados. Para selecionar logs para um determinado símbolo, eu uso o seguinte arquivo em lote:
echo off if "%2"=="" goto Help find /I "%2" < %1 > "%~n1-%2.log" goto Exit :Help echo. echo Filter log-file echo findLog.cmd logFile text echo Example echo findLog.cmd 20200515.log gbpjpy echo Result echo 20200515-gbpjpy.log echo. pause :Exit
Destaque de registros
Muitas informações são gravadas no log quando eu executo a depuração. Analisá-las no Terminal em execução é problemático. Aqui está o que você pode fazer para simplificar esse processo:
- Limpamos o log na guia Caixa de Ferramentas/Experts
- Provoco a impressão no log
- Copio todas as strings para o arquivo log.txt
- Analiso este arquivo no Notepad++ (NPP) usando destaque
NPP tem várias opções para destacar o texto
- Clique duas vezes numa palavra para selecionar todo o texto
- Pesquisar/Marcar seleção/Usar estilo para aplicar o estilo selecionado ao texto necessário em todo o documento
- Uso de sintaxe personalizada com destaque de tokens específicos
Pesquisa contextual
Para encontrar um texto específico, uso o gerenciador de arquivos TotalCommander. As principais vantagens deste método são as seguintes:
- A pesquisa é realizada apenas em arquivos de projeto (todos os outros arquivos não aparecem nos resultados da pesquisa)
- Capacidade de usar expressões regulares na pesquisa
Fim do artigo
Este é meu primeiro artigo. Estou planejando continuar a série. Na próxima vez, vou falar sobre soluções de sucesso e darei uma justificativa detalhada. Convido a todos a compartilhar sua experiência de programação e discutir outras dicas e soluções úteis.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/9266
- 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