English Русский 中文 Español Deutsch 日本語
preview
Conselhos de um programador profissional (Parte I): Armazenamento, depuração e compilação de códigos Trabalho com projetos e registros

Conselhos de um programador profissional (Parte I): Armazenamento, depuração e compilação de códigos Trabalho com projetos e registros

MetaTrader 5Exemplos | 1 julho 2021, 08:47
1 553 0
Malik Arykov
Malik Arykov

Sumário


Introdução

Todo mundo tem seu próprio caminho, estilo e preferências de programação. Vou falar sobre os métodos que facilitam meu trabalho (fazer o que amo). Espero que isso ajude os programadores novatos. Talvez alguém encontre algo útil para si mesmo.


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

  1. Fechamos o terminal
  2. Vamos para o diretório de dados
  3. Movemos o diretório MQL5 para o diretório de projetos
  4. Estando no diretório de dados, executamos cmd e digitamos o comando

    mklink /D MQL5 D:\Project\MQL5

  5. 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
Pesquisa de arquivo contextual


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

Swaps (Parte I): bloqueio e posições sintéticas Swaps (Parte I): bloqueio e posições sintéticas
Neste artigo, tentarei expandir o conceito clássico de métodos de negociação de swap, e também explicarei porque cheguei à conclusão de que ele, em minha opinião, merece atenção especial e vale absolutamente a pena ser estudado.
Outras classes na biblioteca DoEasy (Parte 69): classe-coleção de objetos-gráficos Outras classes na biblioteca DoEasy (Parte 69): classe-coleção de objetos-gráficos
Com este artigo, começaremos o desenvolvimento de uma classe-coleção de objetos-gráficos que armazenará uma lista-coleção de objetos-gráficos com suas subjanelas e indicadores, e tornará possível trabalhar com gráficos selecionados e suas subjanelas, ou com uma lista de vários gráficos ao mesmo tempo.
Outras classes na biblioteca DoEasy (Parte 70): extensão da funcionalidade e atualização automática da coleção de objetos-gráficos Outras classes na biblioteca DoEasy (Parte 70): extensão da funcionalidade e atualização automática da coleção de objetos-gráficos
Neste artigo, vamos expandir a funcionalidade dos objetos-gráficos, criaremos a navegação em gráficos, geraremos capturas de tela, salvaremos e aplicaremos modelos aos gráficos. Faremos também uma atualização automática da coleção de objetos-gráficos, suas janelas e indicadores.
Scalping combinado: trades do passado ou melhoria do desempenho dos trades futuros Scalping combinado: trades do passado ou melhoria do desempenho dos trades futuros
Agora analisaremos uma descrição da abordagem para aumentar a eficácia de qualquer sistema de negociação automatizado. Este artigo mostra resumidamente a ideia, os fundamentos básicos, as possibilidades e as desvantagens do método.