«

»

Sep 25

Generische Source-Code-Generierung mit xls & VBA

Source CodeDie generische Source-Code-Generierung ist für jeden Programmierer ab und zu eine mächtige Hilfe. Wer hat schon Lust Quellcode zu schreiben, der auch durch cleveren Quellcode erzeugt werden kann … also sozusagen sich selbst erzeugender Quellcode … fast schon Machine-Learning (aber nicht ganz)

Die nächsten beiden Blog-Einträge hängen deshalb ein wenig zusammen. Im ersten Beitrag soll es um ein praktisches Beispiel für das Thema generische Source-Code-Generierung gehen.

Jeder der schon einmal programmiert hat, ist sicherlich an Stellen angekommen, an denen er festgestellt hat, dass es sich um arg stupide Arbeit handelt, die eigentlich die Software selber übernehmen kann. Also ganz praktisch Software die sich selber schreibt, bzw. Software die in der Lage ist Quellcode zu erzeugen, der später sofort verwendet werden kann!

Ein klassisches Beispiel dafür ist der Aufbau von Hilfedateien. Wenn Sie beispielsweise mal die gigantische Anzahl von möglichen Fehlermeldung in einer .net Umgebung gesehen haben http://msdn.microsoft.com/de-de/library/windows/desktop/ms681381(v=vs.85).aspx , dann werden Sie froh sein, dass bereits andere Coder die Arbeit übernommen haben, diese Fehler und Beschreibungen in eigene Libs zu verpacken.

Aber in MQL ist das unter Umständen noch nicht geschehen, oder einfach nicht in der Form wie Sie das gerne hätten. Nehmen wir also das Beispiel der Error-Codes in MQL4 MQL5

nachfolgend die ersten 3 Error-Codes von gaaanz vielen (aus der Hilfe rauskopiert, genau so findet man die Beschreibung vor)

4001
ERR_WRONG_FUNCTION_POINTER
Wrong function pointer

4002
ERR_ARRAY_INDEX_OUT_OF_RANGE
Array index is out of range

4003
ERR_NO_MEMORY_FOR_CALL_STACK
No memory for function call stack

ich bin mir sicher, Sie haben keine Lust diese Codes alle manuell in schönen Source-Code zu verpacken um es später abrufbar zu gestalten. Habe ich ja auch nicht gehabt.

Das würde dann nämlich Code für Code so aussehen

case 4001:
return(" ERR_WRONG_FUNCTION_POINTER ___ ERR_WRONG_FUNCTION_POINTER");
case 5020:
return(" ERR_FILE_NOT_EXIST ___ ERR_FILE_NOT_EXIST");

… keine sonderlich dankbare Aufgabe bei weit über 100 Fehlercodes

Da sowas aber immer wieder vorkommt, haben wir am Beispiel dieser Fehlercodes mal ein kleines VBA-Programm geschrieben, welches uns den einkopierten Code schön sauber in MQL-Code verwandelt … am Ende muss man es nur noch aus Excel rauskopieren und in MetaTrader hinein und schon ist man fertig. Statt 1h Arbeit sind es 15min für das Schreiben des VBA-Skripts … und beim nächsten mal verwenden Sie einfach wieder die Skript Vorlage und schon sind es nur noch ein paar Minuten für kleine Anpassungen.

Nachfolgend finden Sie den Quellcode und auch die xls Datei. Da aber nicht jeder das Öffnen und Ausführen von Makros mag, gibts halt den Quellcode als plain text zum rauskopieren

Download Visual-Basic-Script zur MQL-Code Generierung

Kopieren Sie die Fehlercodes einfach aus MetaTrader (aus der Hilfe) in Excel in Spalte A, aber Zeile 2. Zeile 1 bitte leer lassen. Danach das Makro starten und schwupDiWup ist in Spalte 3 der fertige Quellcode. So macht programmieren wieder Spaß, soll doch der Rechner sich seinen Quellcode einfach selber zusammen basteln J

An einem css Skript für die vernünftige Darstellung von Source-Code arbeiten wir noch, dann sieht das ganze auch ein wenig übersichtlicher aus. Nachfolgend ein Auszug aus dem VBA Code

Option Explicit
Const firsLineDiffToLastLineEachCase = 2
Const secondLineDiffToLastLineEachCase = 1</em>

Sub buildSomeNiceCodeForMe()

Dim msgboxAnswer As Integer
Dim line As Integer

Dim firstLine As String
Dim secondLine As String
Dim arrayPlacesNeeded As Integer
Dim stringArray()

Range(Cells(2, 3), Cells(500, 3)).Select
Selection.ClearContents

line = 1
'Case xxx:
' return("ERR_NO_MQLERROR ___ No error returned");
Do
line = line + 1
If Len(Cells(line + 1, 1)) &lt; 4 Then
arrayPlacesNeeded = arrayPlacesNeeded + 2
firstLine = "case " &amp; Cells(line - firsLineDiffToLastLineEachCase, 1) &amp; ":"
secondLine = " return(" &amp; Chr(34) &amp; Cells(line - secondLineDiffToLastLineEachCase, 1) &amp; " ___" &amp; Cells(line - secondLineDiffToLastLineEachCase, 1) &amp; Chr(34) &amp; ");"
ReDim Preserve stringArray(arrayPlacesNeeded)
stringArray(arrayPlacesNeeded - 1) = firstLine
stringArray(arrayPlacesNeeded) = secondLine

... 

Sich selbst erzeugender Quellcode ist eine sehr interessante Angelegenheit. Wenn Sie schon mal den einen oder anderen EA-Builder gesehen haben, dann wissen Sie jetzt vielleicht ein ganz klein wenig, wie die Software dahinter funktioniert.

So, das wars erstmal zu diesem Thema, das dazugehörige Thema folgt in Kürze.

Viel Spaß und viel Erfolg beim selber ausprobieren
Thomas @ ForexInnovation



Image courtesy of [Stuart Miles] at FreeDigitalPhotos.net

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*