English Русский 中文 Español 日本語 Português
preview
Tipps von einem professionellen Programmierer (Teil I): Code speichern, debuggen und kompilieren. Arbeiten mit Projekten und Protokollen

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

MetaTrader 5Beispiele | 28 Mai 2021, 15:31
892 0
Malik Arykov
Malik Arykov

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:

  • /Experts/Cayman/ - Expert Advisor
  • /Files/Cayman/ - data files (settings, parameters)
  • /Include/Cayman/ - library of classes (functions)
  • /Scripts/Cayman/ - main operational scripts
  • /Scripts/CaymanDev/ - developer scripts (used for debugging)

Die Hauptvorteile dieser Anordnung sind:

  • Kontextuelle Suche nur in Projektdateien über TotalCommander
  • Versionskontrolle über Git (Kontrolle wird nur für die Projektdateien aktiviert, alle anderen Dateien werden ignoriert)
  • Einfaches Kopieren auf ein anderes Terminal (Demo -> Real - Freigabe)


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:

  • Lokales Repository. Die Möglichkeit, mit Zweigen zu experimentieren. Wechseln zu einem beliebigen Zweig (Version) mit einem Klick.
  • Bequeme grafische Oberfläche (TortoiseGit). Steuerung mit der Maus.
  • Kostenloses Cloud-Repository für persönliche Projekte (Bitbucket). Keine Angst, dass Ihre PC-Festplatte ausfällt
  • Änderungshistorie der Dateien mit der Möglichkeit, ältere Versionen wiederherzustellen oder einzusehen (bequem in Bitbucket einsehbar)

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

  • Mit dem Code arbeiten (eine Aufgabe - ein Commit)
  • Änderungen überprüfen (TG/Check for modifications...)
  • Neue Dateien hinzufügen (Add)
  • Unnötige (fehlende) Dateien löschen (Delete)
  • Übertragen in das lokale Repository (Commit)
  • In das Cloud-Repository übertragen (Push)


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:

  • Legende - Projektbeschreibung, Links und Anweisungen. Einträge werden nicht in andere Stufen verschoben. Sie können immer den allgemeinen Zweck des Boards sehen und können leicht auf Links zu nützlichen Ressourcen zugreifen.
  • Cayman - MQL5- und MQL4-Projekt
  • Website - mein persönliches Website-Projekt
  • Angenommen - Aufgabe in Bearbeitung
  • Erledigt - Aufgabe abgeschlossen

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:

  • Löschen Sie das Protokoll in der Registerkarte Toolbox/Experts
  • Stimulieren Sie den Druck ins Protokoll
  • Kopieren Sie alle Zeilen in die Datei log.txt
  • Analysieren Sie diese Datei in Notepad++ (NPP) mittels Hervorhebung

NPP unterstützt verschiedene Varianten der Texthervorhebung

  • Doppelklick auf ein Wort hebt dieses Wort im gesamten Text hervor
  • Suchen/Markieren/Stil verwenden - dies überträgt den gewählten Stil auf den gewünschten Text im gesamten Dokument
  • Nutzerdefinierte Syntax mit der Hervorhebung von bestimmten Token


Kontextabhängige Suche

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

  • Die Suche wird nur in Projektdateien durchgeführt (alle anderen Dateien erscheinen nicht in den Suchergebnissen)
  • Die Möglichkeit, reguläre Ausdrücke bei der Suche zu verwenden

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.


Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/9266

Andere Klassen in der Bibliothek DoEasy (Teil 70): Erweiterte Funktionalität und automatisches Aktualisieren der Kollektion der Chartobjekte Andere Klassen in der Bibliothek DoEasy (Teil 70): Erweiterte Funktionalität und automatisches Aktualisieren der Kollektion der Chartobjekte
In diesem Artikel werde ich die Funktionalität von Chartobjekten erweitern und die Navigation durch Charts, die Erstellung von Screenshots sowie das Speichern und Anwenden von Vorlagen auf Charts einrichten. Außerdem werde ich die automatische Aktualisierung der Kollektion von Chartobjekten, ihrer Fenster und der Indikatoren darin implementieren.
Combination Scalping: Analyse von Positionen aus der Vergangenheit, um die Performance zukünftiger Positionen zu steigern Combination Scalping: Analyse von Positionen aus der Vergangenheit, um die Performance zukünftiger Positionen zu steigern
Der Artikel beschreibt die Technologie, die darauf abzielt, die Effektivität jedes automatisierten Handelssystems zu erhöhen. Er bietet eine kurze Erläuterung der Idee, sowie die zugrundeliegenden Grundlagen, Möglichkeiten und Nachteile.
Andere Klassen in der Bibliothek DoEasy (Teil 71): Ereignisse der Kollektion von Chartobjekten Andere Klassen in der Bibliothek DoEasy (Teil 71): Ereignisse der Kollektion von Chartobjekten
In diesem Artikel werde ich die Funktionalität für die Verfolgung einiger Ereignisse von Chartobjekten erstellen — Hinzufügen/Entfernen von Symbolcharts und Chart-Unterfenstern, sowie Hinzufügen/Entfernen/Ändern von Indikatoren in Chart-Fenstern.
MVC-Entwurfsmuster und seine mögliche Anwendung MVC-Entwurfsmuster und seine mögliche Anwendung
Der Artikel stellt ein beliebtes MVC-Muster vor sowie die Möglichkeiten, Vor- und Nachteile seiner Verwendung in MQL-Programmen. Die Idee ist, einen bestehenden Code in drei separate Komponenten aufzuteilen: Model, View (Darstellung) und Controller.