Tipps von einem professionellen Programmierer (Teil I): Code speichern, debuggen und kompilieren. Arbeiten mit Projekten und Protokollen

Malik Arykov | 28 Mai, 2021

Inhalt


Einführung

Jeder hat seine eigenen Programmiergewohnheiten, Stile und Vorlieben. Ich werde einige Methoden teilen, die meine Arbeit (meine Lieblingsbeschäftigung) erleichtern. Ich hoffe, dass diese Informationen für Anfänger nützlich sein werden. Erfahrenere Programmierer finden vielleicht auch etwas Nützliches.


Speichern Ihres Code in separaten Unterverzeichnissen

Terminal-Programmdateien befinden sich im MQL5-Verzeichnis. Dieses Verzeichnis ist eine sogenannte "Sandbox" (Sandkasten). Der Datenzugriff von außen ist geschlossen. Dies ist eine gute Entscheidung. Die Verwendung einer DLL ermöglicht aber wahrscheinlich den Zugriff von überall her.

Hier ist zum Beispiel die Struktur des Cayman-Projekts:

Die Hauptvorteile dieser Anordnung sind:


Ein Code für mehrere Terminals

Eine der besten Praktiken beim Programmieren ist die Vermeidung von doppeltem Code. Wenn dieselben Codezeilen an mehreren verschiedenen Stellen vorkommen, dann sollten Sie diese Zeilen besser in eine Funktion "einwickeln". Das Gleiche gilt für MQL5-Dateien: Es sollte nur einen Text einer Programmdatei geben. Dies kann durch einen symbolischen Link auf das MQL5-Verzeichnis realisiert werden.

Angenommen, die Projektkategorie befindet sich unter D:\Projekt, während sich das Terminaldatenverzeichnis unter C:\Users\Pro\AppData\Roaming\MetaQuotes\Terminal\9EB2973C469D24060397BB5158EA73A5

  1. Schließen Sie das Terminal
  2. Wechseln Sie in das Datenverzeichnis
  3. Verschieben Sie das Verzeichnis MQL5 in das Verzeichnis projects
  4. Führen Sie im Datenverzeichnis cmd aus und geben Sie den folgenden Befehl ein

    mklink /D MQL5 D:\Projekt\MQL5

  5. Starten Sie das Terminal.

Das Terminal wird gar nicht merken, dass die "Sandbox" (Programmdateien) nach D:\Projekt\MQL5 umgezogen ist.

Der Hauptvorteil dieser Platzierung ist, dass sich alle persönlichen Projekte in demselben Verzeichnis (D:\Project) befinden.


Verwenden Sie ein System zur Versionskontrolle

Professionelle Programmierer zweifeln nicht an der Notwendigkeit, ein solches System zu verwenden. Es ist ein unverzichtbares Werkzeug, besonders wenn ein Team von Programmierern an einem Projekt arbeitet. Die Frage ist, welches System Sie verwenden werden. Dies ist de facto Git.

Die Hauptvorteile von Git sind:

Ich werde hier keine detaillierte Installations- und Konfigurationsanleitung geben, aber einige Besonderheiten erwähnen. Installieren Sie Git (für die Kommandozeilen-Bedienung) und TortoiseGit (für die Nutzung mit der Maus). Erstellen Sie unter dem Verzeichnis D:\Project\MQL5 die Datei .gitignore mit folgendem Inhalt

# 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


Diese Datei ermöglicht die Versionsverfolgung von (*.mq?) Programmdateien des Projekts. Erstellen Sie ein lokales Repository im MQL5-Verzeichnis. Fügen Sie Dateien hinzu und machen Sie den ersten Commit (Übertragen der Version). Das lokale Repositorium ist fertig. Arbeiten Sie mit dem Code und vergessen Sie nicht, häufig Commits mit einer kurzen Beschreibung der Änderungen vorzunehmen. Die Kommentare erleichtern das spätere Durchsuchen der Historie.

Um sich mit einem Cloud-Repositorium zu verbinden, müssen Sie zunächst ein Bitbucket-Konto und ein Repositorium erstellen. Der Name des Repositoriums sollte logischerweise mit dem Projektnamen übereinstimmen. In meinem Fall ist es CaymanMQL5, es gibt aber auch CaymanMQL4. Importieren Sie das lokale Repositorium in das Cloud-Repositorium. Nun ist das Cloud-Repositorium bereit. Grundlegende Aktionen über TortoiseGit(TG):


Verwendung von separaten Terminals mit einem Demo-Account zum Debuggen des Codes

Sie sollten die neueste Arbeitsversion des Codes auf einem echten Konto haben (nur *.ex? Dateien, ohne *.mq?). Der Code zum Debuggen sollte sich auf einem Demo-Account befinden. Um von Demo auf Real zu kopieren, können Sie die folgende Batch-Datei verwenden:

@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


Kompilieren alle Codedateien auf einmal

Das Ziel ist es, die Konsistenz des Codes zu wahren. Sie sollten also z. B. Änderungen der Funktionsparameter vermeiden. Der Expert Advisor kann gut kompiliert sein, aber es kann auch ein Skript geben, das die alte Version der Funktion verwendet. Das Skript (das früher kompiliert wurde) kann gut laufen, aber es wird nicht die gewünschte Funktionen ausführen. Für die Batch-Kompilierung können Sie die folgende Datei verwenden:

@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


Verwendung von Projekt- und Aufgabenverwaltungssystemen

Solche Systeme sind ein Muss für Entwicklungsteams. Sie sind auch für persönliche Projekte nützlich. Es gibt eine Fülle von verschiedenen Projektmanagement-Systemen und -Methoden. Ich persönlich verwende ZenKit. Es ist für kleine Teams kostenlos. Es bietet ein sehr komfortables Kanban-Board.

Früher hatte ich mehrere Kanban-Boards (eines für jedes Projekt). Der Nachteil bei der Verwendung mehrerer Tafeln ist, dass man das Gesamtbild nicht sehen kann. Dann habe ich mich entschieden, ein Projekt als Entwicklungsstufe hinzuzufügen. Auf diese Weise ist es viel einfacher, Aufgaben zu verwalten. Mein Kanban-Board hat zum Beispiel 5 Entwicklungsstufen:

Der Prozess der Board-Nutzung ist sehr einfach und intuitiv. Ich finde eine interessante Idee, eine Lösung oder einen Programmfehler. Dann formuliere ich sie kurz und füge sie dem Board, dem entsprechenden Projekt, hinzu. Hier können auch Bilder und Dateien hinzugefügt werden. Als Nächstes wähle ich eine Aufgabe aus und verschiebe sie in die Phase "Angenommen". Ich bearbeite die Aufgabe, teste sie und schiebe sie in die Stufe "Erledigt".

Wenn Sie die Anzahl der Aufgaben in Projekten analysieren, können Sie leicht Probleme und Engpässe feststellen. Ich versuche, Aufgaben aus "überlasteten" Projekten zu übernehmen. Mein Ziel ist es, Projekte so auszurichten, dass sie eine ähnliche Anzahl von Aufgaben haben. In der Teamentwicklung gibt es noch eine weitere Stufe "Testen", die für mich nicht relevant ist, da ich alleine arbeite.


Log-Auswahl

Wie Sie wissen, werden alle Ausgaben von Print-Funktionen in das Terminal-Log MQL5\Logs\yyyyMMdd.log geschrieben. Alle Symbole (Handelsinstrumente) werden in dieser Datei gemischt. Ich verwende die folgende Batch-Datei, um Logs für ein gewünschtes Symbol auszuwählen:

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



Log-Hervorhebung

Beim Debuggen werden viele Informationen in das Protokoll geschrieben. Diese in einem laufenden Terminal zu analysieren, kann ziemlich knifflig sein. Hier ist, was Sie tun können, um diesen Prozess zu vereinfachen:

NPP unterstützt verschiedene Varianten der Texthervorhebung


Kontextabhängige Suche

Um einen bestimmten Text zu finden, verwende ich den TotalCommander. Die Hauptvorteile dieser Methode sind folgende:

Kontextbezogene Dateisuche


Schlussfolgerung

Dies ist mein erster Artikel. Ich habe vor, die Serie fortzusetzen. Beim nächsten Mal werde ich einige erfolgreiche Lösungen mit der entsprechenden Beschreibung und Erklärung vorstellen. Ich lade alle ein, ihre Programmier-Erfahrungen zu teilen und andere nützliche Tipps und Lösungen zu diskutieren.