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

18 junio 2021, 10:16
Malik Arykov
0
544

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:

  • /Experts/Cayman/ - asesor experto
  • /Files/Cayman/ - archivos de datos (ajustes, parámetros)
  • /Include/Cayman/ - biblioteca de clases (funciones)
  • /Scripts/Cayman/ - scripts operativos principales
  • /Scripts/CaymanDev/ - scripts de desarrollador (para la depuración)

Principales ventajas de esta distribución:

  • Búsqueda contextual solo en los archivos del proyecto con la ayuda de TotalCommander
  • Control de versiones con la ayuda de Git (controlar solo los archivos del proyecto, ignorando el resto)
  • Se simplifica el proceso de copiado a otro terminal (demo -> real – inicio)


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:

  • Repositorio local. Podemos experimentar con ramificaciones. Podemos pasar a cualquier ramificación (versión) con un solo clic.
  • Interfaz gráfica cómoda (TortoiseGit). Control con el ratón.
  • Repositorio en la nube gratuito para proyectos personales (Bitbucket). No temeremos que se estropee nuestro PC (disco duro)
  • Historia de cambios de los archivos con posibilidad de restaurar o visualizar las versiones antiguas (se pueden ver cómodamente en Bitbucket)

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):

  • Trabajo con el código (una tarea – un commit)
  • Comprobación de los cambios (TG/Check for modifications…)
  • Adición de nuevos archivos (Add)
  • Eliminación de archivos (Delete) innecesarios (missing)
  • Hacer commit en el repositorio local (Commit)
  • Enviamos los datos al repositorio en la nube (Push)


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:

  • Leyenda – descricpión del proyecto, enlaces e instrucciones. Las entradas no se trasladan a otras etapas. El propósito general del tablero siempre está visible y hay enlaces a los recursos útiles disponibles.
  • Cayman – proyectos en MQL5, MQL4
  • Website – proyecto del sitio web personal
  • Aceptada – tarea en desarrollo
  • Lista – tarea realizada

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:

  • Borramos el log en la pestaña Herramientas/Expertos
  • Provocamos la muestra del log
  • Copiamos todas las líneas en el archivo log.txt
  • Analizamos tranquilamente este archivo en Notepad++ (NPP) con resaltado

NPP tiene varias opciones para resaltar texto

  • Clicamos dos veces sobre una palabra: esta será seleccionada inmediatamente en todo el texto
  • Buscar/Marcar selección/Usar estilo: coloreará el texto en todo el documento
  • Utilizar una sintaxis personalizada con resaltado de tokens específicos


Búsqueda contextual

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

  • Buscar solo por archivos de proyecto (los archivos "ajenos" no se incluirán en los resultados de la búsqueda)
  • Posibilidad de usar expresiones regulares en la búsqueda.
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.


Traducción del ruso hecha por MetaQuotes Software Corp.
Artículo original: https://www.mql5.com/ru/articles/9266

Swaps (parte I) : Bloqueo de posiciones y posiciones sintéticas Swaps (parte I) : Bloqueo de posiciones y posiciones sintéticas
En este artículo intentaremos expandir el concepto clásico de los métodos de swap en el comercio, y también hablaremos sobre por qué hemos llegado a la conclusión de que este concepto merece una atención especial y es absolutamente recomendable para el análisis y el estudio.
Otras clases en la biblioteca DoEasy (Parte 69): Clases de colección de objetos de gráfico Otras clases en la biblioteca DoEasy (Parte 69): Clases de colección de objetos de gráfico
A partir de este artículo, comenzaremos el desarrollo de una colección de clases de objetos de gráfico que almacenará una colección de lista de objetos de gráfico con sus subventanas y los indicadores en ellas, y nos permitirá trabajar con cualquier gráfico seleccionado y sus subventanas, o bien directamente con una lista de varios gráficos al mismo tiempo.
Otras clases en la biblioteca DoEasy (Parte 70): Ampliación de la funcionalidad y actualización automática de la colección de objetos de gráfico Otras clases en la biblioteca DoEasy (Parte 70): Ampliación de la funcionalidad y actualización automática de la colección de objetos de gráfico
En este artículo, ampliaremos la funcionalidad de los objetos de gráfico, organizaremos la navegación por los gráficos, crearemos capturas de pantalla, y también guardaremos plantillas y las aplicaremos a los gráficos. Asimismo, implementaremos la actualización automática de la colección de objetos de gráfico, sus ventanas y los indicadores en ellas.
Scalping combinatorio: analizando transacciones del pasado para aumentar el rendimiento de las transacciones futuras Scalping combinatorio: analizando transacciones del pasado para aumentar el rendimiento de las transacciones futuras
Ofrecemos al lector la descripción de una tecnología para aumentar la eficacia de cualquier sistema de comercio automático. El artículo expone brevemente la idea, los fundamentos básicos, las posibilidades y las desventajas del método.