Consejos de un programador profesional (parte I): guardado, depuración y compilación de códigos. Trabajando con proyectos y logs

Malik Arykov | 18 junio, 2021

Contenido


Introducción

Todos tenemos nuestro propio camino, estilo y preferencias de programación. Hoy, hablaremos sobre algunos métodos propios que facilitan nuestro trabajo. Esperamos que esto ayude a los programadores principiantes. Quizás alguien encuentre algo útil para sí mismo.


Guarde su código en subdirectorios separados

Los archivos de programa del terminal se encuentran en el directorio MQL5. Este directorio es el llamado «sandbox». El acceso desde el exterior está cerrado. Y eso es lo correcto. Aunque, si conectamos nuestra propia DLL, seguramente podremos entrar donde queramos.

Por ejemplo, aquí tenemos la estructura del proyecto Cayman:

Principales ventajas de esta distribución:


Un código para varios terminales

Una señal esencial de las buenas prácticas de programación es la ausencia de código duplicado. Si encontramos las mismas líneas de código en varios lugares, podremos "envolverlas" en una función sin dudarlo. Lo mismo se aplica a los archivos MQL5: el texto del archivo del programa debe encontrarse en un único ejemplar. Esto se resuelve usando un enlace simbólico al directorio MQL5.

Imaginemos que el directorio de proyectos se encuentra en D:\Project, mientras que el directorio de datos del terminal se encuentra en C:\Users\Pro\AppData\Roaming\MetaQuotes\Terminal\9EB2973C469D24060397BB5158EA73A5

  1. Cerramos el terminal
  2. Pasamos al directorio de datos
  3. Trasladamos el directorio MQL5 al directorio de proyectos
  4. Dentro del directorio de datos, iniciamos el cmd e introducimos el comando

    mklink /D MQL5 D:\Project\MQL5

  5. Iniciamos el terminal

El terminal ni siquiera notará que el sandbox (archivos de programa) se ha trasladado a D:\Project\MQL5.

La principal ventaja de esta distribución es que todos los proyectos personales se encuentran en un mismo directorio (D:\Project).


Use un sistema de control de versiones

Un profesional ni siquiera se planteará para qué hace falta esto. Sin el sistema no hay forma de trabajar, especialmente si hablamos de realizar desarrollos en equipo. La única cuestión es qué sistema en concreto elegir. En la práctica, es Git.

Ventajas principales de Git:

No vamos a mostrar instrucciones detalladas sobre la instalación y la configuración, pero sí que hablaremos de ciertas particularidades. Instalamos Git (para trabajar usando la línea de comandos) y TortoiseGit (para trabajar con el ratón). En el directorio D:\Project\MQL5, creamos el archivo .gitignore con el siguiente contenido

# excluir archivos
*.ex4
*.ex5
*.dat
log.txt

# excluir directorios por completo
Images
Indicators
Libraries
Logs
Presets
Profiles
Services
"Shared Projects"
Levels
Params

# excluir el contenido de los directorios
Experts/*
Files/*
Include/*
Scripts/*

# excepto los subdirectorios
!Experts/Cayman
!Files/Cayman
!Include/Cayman
!Scripts/Cayman
!Scripts/CaymanDev

Este archivo permite monitorear las versiones solo de los archivos de programa (*.mq?) del proyecto. Creamos un repositorio local en el directorio MQL5. Añadimos los archivos y hacemos el primer commit (fijamos la versión). El repositorio local ya está preparado. Trabajamos con el código y hacemos commits con mayor frecuencia con una descripción breve de los cambios. En lo sucesivo, esto facilitará la visualización y la búsqueda en la historia.

Para conectarnos a un respositorio en la nube, primero debemos crear una cuenta y un repositorio en Bitbucket. Lo lógico es darle al repositorio el mismo nombre que al proyecto. En nuestro caso, CaymanMQL5, porque también tenemos CaymanMQL4. Importamos el repositorio local al respositorio en la nube. El repositorio en la nube está listo. Acciones principales a través de TortoiseGit (TG):


Use un terminal separado en una cuenta demo para depurar el código

Deberemos tener la última versión operativa del código en una cuenta real (solo archivos *.ex? sin *.mq?). El código en proceso de depuración deberá encontrarse en una cuenta demo. Para copiar desde demo a real, podemos usar el archivo batch:

@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 los archivos del código al mismo tiempo

El objetivo es mantener la consistencia del código, para evitar, por ejemplo, los cambios en los parámetros de alguna función. El experto se compila, pero nos queda un script que usa la variable antigua de la función. En este caso, además, se trata de un script operativo (compilado anteriormente), pero no ejecuta lo que debe. Para la compilación por lotes, podemos utilizar el archivo batch:

@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 sistemas de control de proyectos y tareas

Estos sistemas siempre se usan al realizar desarrollos en equipo, y también resultan útiles para los proyectos personales. Hay muchos sistemas y metodologías de control de proyectos. Nosotros hemos elegido ZenKit. Es gratuito para los equipos pequeños. Tiene un tablero Kanban muy cómodo.

Antes teníamos varios tableros Kanban (uno por cada proyecto). La desventaja de usar varios tableros es que no se ve la imagen general. Por eso, hemos decidido añadir un proyecto como una etapa (estadio) de desarrollo. Así resulta mucho más sencillo controlar las tareas. Por ejemplo, en nuestro tablero Kanban hay 5 estadios (etapas) de desarrollo:

El proceso de trabajo con el tablero es sencillo y visual. Encontramos una idea interesante, una solución o un error en el programa. La formulamos brevemente y la añadimos al tablero, al proyecto correspondiente. Podemos añadir imágenes y archivos. Seleccionamos una tarea, la arrastramos al estadio "Aceptada". Trabajamos con la tarea, la ponemos a prueba y la arrastramoss al estadio "Lista".

Según el número de tareas en el proyecto, se ve de inmediato dónde están los problemas o los cuellos de botella. Debemos intentar tomar para su desarrollo tareas de los proyectos «sobrecargados». El objetivo es equilibrar el proyecto en cuanto al número de tareas. En el desarrollo en equipo, también tenemos la etapa "Simulación", pero en este caso no es algo relevante, porque el autor trabaja solo.


Selección de logs

Como ya sabemos, todas las muestras de las funciones Print se escriben en el log del Terminal MQL5\Logs\yyyyMMdd.log. En este caso, todos los símbolos (instrumentos) están mezclados. Para seleccionar los logs del símbolo indicado, utilizamos el siguiente archivo batch:

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



Resaltado de logs

En el modo de depuración, tenemos mucha información escrita en el log. Analizarla en un Terminal en ejecución resulta problemático. Por consiguiente, haremos esto:

NPP tiene varias opciones para resaltar texto


Búsqueda contextual

Para la búsqueda contextual de texto, utilizamos el administrador de archivos TotalCommander. Las principales ventajas de esta opción son:

Búsqueda contextual de archivos


Conclusión

Este es el primer artículo del autor. La serie continuará. Hablaremos de soluciones exitosas y describiremos estas con detalle. Invitamos a todos a compartir sus experiencias y hallazgos en los comentarios al artículo.