Skip to end of metadata
Go to start of metadata

Zielsetzung

Der Filter in Shareholder ist ein Filtersystem, dass die Eingrenzung von Werten auf Basis von Kriterien erlaubt. Als Kriterien sind alle Stammdaten & Technische-Indikatoren in beliebigen Kombinationen umsetzbar. Die Ergebnisliste wird in speziellen Beobachtungslisten zur weiteren Bearbeitung gespeichert. Die Filter sollen somit die Screening und das Scannen von interessanten Titeln am Markt unterstützen. Eine Kauf/Verkaufsentscheidung muss aber vom Anleger selbst getroffen werden.

Zusammenspiel mit Handelssystem

Der Filter wird dabei bewertet anhand eines Handelssystems, was eine Beurteilung eines Filtersystems ja erst zulässt. Ein definierter Filterbaum wird dabei im historischen Kurskontext auf seine Zuverlässigkeit und seine Performance geprüft. Die Kriterien des Handelssystem z.B. wann Titel der Ergebnisliste eines Filter tatsächlich gekauft werden und wieder verkauft werden, werden zusammen mit einem Filter definiert.Durch die Bewertung eines Filtersystems ist auch deren zukünftige Optimierung mittels Genetischen Algorithmen möglich. Die notwendige Vorraussetzung der Bewertbarkeit einer "Population/Individium" ist durch die Verwendung des Handelssystems gegeben.

Aufbereitung und Nutzung


Die Darstellung und Nutzung der eingerichteten Filter findet sich unter dem Hauptreiter "Filter". Um einen Filter zu starten müssen folgende Schritte gemacht werden:

  1. Selektion des gewünschten Filters in der Toolbar oben
  2. Entscheidung ob die Ergebnisse des Filters als gleichnamige *Watchliste abgespeichert werden sollen. Ein Häkchen in der Toolbar hierfür ist ausreichend
  3. Start mit Button "Starten"

Nach Auswahl erfolgt die Berechnung und Darstellung der gefundenen Werte im unteren Bereich. Zur Verbesserung der Übersicht wird auch immer der zugehörige Funktionsbaum dargestellt. Änderungen am Filter können jederzeit über Aufruf der Filter-Einstellungs-Masken mit der Funktionstaste <F12> oder übers Hauptmenü Analyse/Filter-System aufgerufen werden.

Nach der Berechnung der Signale/Filter werden alle gefundenen Werte gelistet und mit folgenden Werten dargestellt:

  • Bezeichnung/WKN/Zeit/Candle/Kurs/Stops
  • Ranking (Bewertungsfunktion im DynFilter)

Die Darstellung erfolgt in 3 Abschnitten

  1. Logausgaben
  2. Filter bzw. den Bedingungsbaum
  3. Filterergebnisse

Jedes der Elemente kann durch Doppelklick auf die Titelleiste ein-und ausgeblendet werden. Hier im Beispiel sind die Logausgaben ausgeblendet.

Loglevel

Grundsätzlich werden alle Logausgaben in einer Logdatei mitgeschrieben. Diese kann jederzeit über die Toolbar mit "Logdatei öffnen" geöffnet werden. Parallel steht direkt im Frontend ein Live-Log zur Verfügung der während der Bearbeitung eines Filters alle Ausgaben anzeigt. Welchen Detailgrad die Ausgaben haben wird über den Log-Level in der Toolbar festgelegt.

Ausgangsüberlegungen

Ein Filter setzt sich aus den Bedingungen und den in einer Bedingung genutzten Vergleichswerten inkl.- Funktionen zusammen. Jede Einzelbedingung muss jedoch immer ein Wahrheitswert ergeben, d.h. Aussagen von wahr oder falsch ergeben. In einem Bedingungsbaum können die Einzelbedingungen mit UND, ODER, UND NICHT, Exklusives ODER (genau eine der Aussage muss wahr sein) verknüpft werden. Als Suchbasis dienen alle verfügbaren Papiere. Das Filtersystem zeigt sich somit komplett unabhängig von vorherigen Filterkriterien z.B. von Watchlisten oder Markteinstellungen und zwingt somit den User jedes verwendete Kriterien zu definieren und genau darüber nachzudenken.

Verwendbare Filterkriterien bzw. Funktionen:

  • Aktienkennzahlen wie KWV, KGV, Cashflow, Umsatz
  • Mathematische und Logische Basisfunktionen wie IF, LN, LOG, SIN, SQRT usw.
  • Filterkriterien (ExistsInFilter, RankingInFilter z.B. RankingInFilter('Test')<3) um andere Filter einzubeziehen
  • Stammdaten wie Markt, WKN usw.
  • Kursdaten wie Intradaykursdaten und History wobei Eingrenzung auf L,H,O,H,V möglich ist
  • Technische Indikatoren ca. 30 Stück
  • Datumsfunktionen wie toDate, toTime usw. um auch zeitliche Vergleiche durchführen zu können

Da die gefunden Werte eines Filters für eine spätere Verwendung in einem Handelssystem bzw. für eine persönliche Favorisierung sortiert vorliegen sollen, wird jeder Filter mit einer spezifischen Rankingfunktion versehen. Dies kann beispielsweise das Handelsvolumen oder auch der Cashflow sein. Die Sortierung erfolgt jedoch immer aufsteigend.

Allgemeine Vorrausssetzungen:

  • Das System soll den Semiprofessionalen Anleger bei der Anlageentscheidung unterstützen.
  • Der Erfolg des Systems setzt eine Diziplin des Anwenders voraus insb. bei der Ausführung von Verkaufsorders, da sonst das System nicht nachvollziehbar validierbar ist.

Weitere Ausgangsvoraussetzungen für die Nutzung in einem Handelssystem

  • Die Strategie baut auf eine Form des Performancetradings auf, d.h. Ziel ist es unter Abzug von Transaktionskosten und Slippageverlusten einen maximalen Gewinn zu erzielen .
  • Es können, da hauptsächlich am Europäischen Markt gehandelt werden soll, nur Longpositionen eingegangen werden. Shortpositionen werden nicht berücksichtigt bzw. berechnet.
    Nach der Erzeugung eines Kaufsignals durch das Handelssystem ist die Position als Wahlentscheidung zwischen:
  • Eingehen der Position auf Basis der Schlußauktion (Close der gleichen Periode)
  • Eingehen der Position auf Basis des Eröffnungskurses des nächsten Tages (Open)
  • Eingehen der Positon auf Basis des Anfangshandels, wenn das Signal bestätigt wird, d.h. der Eröffnungskurs liegt über dem Schlußkurs des Vortages. Die Realisierung kann mittels Stop-Buy begrenzt auf den entsprechenden Handelstag erfolgen.
    Die Realisierung des Handelssystems setzt kein Vollzeitaktivität des Anwenders voraus, verlangt aber eine Prüfung der Stopkurse (Trailing-Stops) auf noch nicht geschlossene Systeme kurz vor bzw. nach Handelsende (je nach Basis: Open/Close)
  • Ein Engagement des Anlegers darf nur erfolgen, wenn Möglichkeiten zum Verkauf auf Tagesbasis gegeben sind, d.h. im Urlaub sollten keine Positionen ohne gesetztem Stop eingegangen werden. Hoffnungsansätze sind verboten, d.h. das System muss Anwendung finden (können).

Außerhalb dieser Überlegung gibt es bereits ein Produkt das diese Teilmenge der Problematik bereits sehr gut löst, allerdings sehr stark im professionalen Segment (Preissegment) angesiedelt ist. Hier können über das bisher vorgeschlagene Konzept hinaus auch gezielt Future Trades, Put/Call-Scheine und Short-Positionen berücksichtigt werden. Die Kursdatenversorgung kann zudem mit fast allen gängigen Kursanbietern erfolgen.

Warum soll ein neues System bereitgestellt werden, wenn es bereits ein Produkt gibt, was die Anforderungen weitgehend erfüllen kann? Zum einen ist hier die Preispolitik ein entscheidener Faktor. Ebenso sind insb. die Candlestickformationen und eine Reihe von Indikatoren nicht im entsprechenden Maße abgedeckt, wie ich es mir vorstelle; ebenso wie eine Reihe von Unternehmensdaten. Dies ist jedoch meine subjektive Meinung, da es durchaus für einige Anleger entsprechend Gegenargumente geben kann.

Arbeitsschritte

Die Bearbeitung von Filtern erfolgt unter Analyse / Filter-System. Der Shortcut hierzu ist <F12>. Alle folgenden Hinweise beziehen sich auf die Masken.

Anlegen eines Filters

In Shareholder können beliebig viele Filter angelegt werden. Um einen neuen Filter anzulegen, muss mit dem Button "Hinzufügen" ein neuer Grundeintrag erzeugt werden. Es wird dabei automatisch die Frage gestellt, ob die Bedingungen aus dem aktuell selektierten Knoten übernommen werden sollen. Damit lassen sich dann leicht auch Kopien anfertigen.

Bearbeiten der Bedingungen eines Filters (Bedingungsbaum)

Jeder Filter besitzt einen Entscheidungsbaum, der alle Bedingungen in Beziehung zueinander setzt. Dabei sind als Verknüpfungstypen grundsätzlich

  • UND
  • ODER
  • NOT (darf nicht)
  • XOR (Exklusives ODER und somit muss genau 1 Werte wahr sein)
    erlaubt.

Der Bedinungsbaum verknüpft damit logisch Einzelbedingungen miteinander. Dies erfolgt in einer Baumansicht. So wird semantisch immer eine Verknüpfungstyp wie "UND" / "ODER" als Vater definiert und darunter die zu verknüpfenden Bedingungen z.B.

  • AND
    • 1. Bedingung
    • 2. Bedingung
    • n. Bedingung

Die grundsätzliche Verarbeitung erfolgt dabei von oben nach unten. Die Reihenfolge ist damit entscheidend für die Verarbeitungsgeschwindigkeit eines Filters. Die Reihenfolge wird deshalb automatisch mit jedem vollständigen Suchvorgang optimiert anhand der statistischen Wahrscheinlichkeit P(error). Dabei gilt, dass Bedingungen mit hoher Ausfallwahrscheinlichkeit an den Anfang eines Zweiges gesetzt werden bei UND - Bedingungen, bei OR entsprechend die Bedingungen die eine hohe Trefferwahrscheinlichkeit haben. Somit erfolgt die Präferenzbildung immer auf Basis einer möglichst schnellen Abwicklung des Zweiges festgelegt durch den Verknüpfungstyp .

Da jeder Filter durchaus mehere Ergebniswerte zurückliefern kann, wird bei jedem Filter eine Rankingfunktion gesetzt, die die Sortierung der Ergebnisse erlaubt. Sie wird damit zu einer Bewertungsfunktion und führt zu einem Ranking innerhalb der Liste. Es kann pro Filter dabei immer nur eine Rankingfunktion geben. Müssen zwei verschiedene Funktionswerte genutzt werden, so muss ein mathematischer sinnvoller Ausdruck gefunden werden, der beide verknüpft.

Bedeutung hat dies entweder innerhalb einer persönlichen Rankingfunktion (manuellen) aber auch einer objektiven bei der Nutzung innerhalb eines Handelssystems. Hier werden die Positionen in der Ranking-Reihenfolge eingegangen, solange ausreichend Handelskapital zum Entscheidungstag zur Verfügung steht entsprechend den Einstellungen für die max. Kapitalsumme pro Position. Als Beispiel:

  1. 1. Position entsprechend 1. Rankingposition mit 40% Kapitalsumme
  2. 2. Position entsprechend 2. Rankingposition mit 40% Kapitalsumme
  3. 3. Position wird nicht mehr eingegangen, da die Mindestanalagesumme nicht mehr zum Handelstag zur Verfügung steht.

Anlegen und Editieren einer Bedingung

Das Editieren einer Einzelbedingung erfolgt ausgehend vom Entscheidungsbaum im Editor "Einzelbedingung". Dieser arbeitet mit einer Autosuchfunktion, womit der User beliebige Variablen oder Funktionen eintippen kann und das System zeigt noch alle passenden Werte in einer Baumstruktur (Funktion) bzw. Listenansicht (Variablen) an. Die Validierung und Prüfung der Gültigkeit der aktuellen Eingabe wird fortwährend vom System vorgenommen. Grundsätzlich unterscheidet das System praktisch nur zwischen Mathematischen Ausdrücken und Patterns. Patterns meinen dabei beliebige Zeichenkettenvergleiche verbunden mit Oder | und Und & Vergleichen z.B. Markt='Ne*'|Markt='Nasdaq*'. Erlaubt eine Funktion Parameter, so werden diese in einem seperaten Fenster abgefragt und dann als Ausdruck im Editor hinterlegt/angezeigt.

Die Einzelbedingungen werden vom System automatisch optimiert in ihrer Reihenfolge hinterlegt bei jeder Nutzung des Filters, d.h. Aussschlusskriterien mit hoher Wahrscheinlichkeit bei den bisherigen Prüfungen werden zuerst berücksichtigt, so d. alle nachfolgenden Berechnungen/Prüfungen nicht mehr notwendig werden.

Eine Einzeloptimierung der Parameter von Funktionen insb. der Technischen Indikatoren ist vorgesehen, jedoch noch nicht realisiert, da hierzu das Handelssystem erst fertiggestellt und optimiert werden muss.

Bedingungen sind entweder in mathematischer Form oder als Pattern zu formulieren. Hierbei entscheidet das Programm automatisch, wann welche Form genutzt wird, anhand der bisher genutzten Ausdrücke, Funktionen oder Variablen.

Patterns

Werden Patterns genutzt, so sind folgende Reguläre Ausdrücke erlaubt:
'*' : Zero or more chars.
'?' : Any one char.
[adgj] : Individual chars (inclusion).
[^adgj] : Individual chars (exclusion).
[a-d] : Range (inclusion).
[^a-d] : Range (exclusion).
[a-dg-j] : Multiple ranges (inclusion).
[^a-dg-j] : Multiple ranges (exclusion).
[ad-fhjnv-xz] : Mix of range & individual chars (inclusion).
[^ad-fhjnv-xz] : Mix of range & individual chars (exclusion).

Bei Patterns sind nicht alle Formen der logischen Verknüpfung erlaubt. Das Programm zeigt automatisch nur die zulässigen Verknüpfungen wie UND (&), ODER (|) usw. an. Bei Patterns sind Hochkommas ' für die Eingrenzung von Werten zulässig und sinnvoll.

Ausdrücke

  • UND &
  • ODER | (Senkrechter Stich)
  • NICHT ! (Ausrufezeichen)
  • GLEICH =
  • UNGLEICH ! ... = ... Hier muss eine Kombination aus NICHT und GLEICH verwendet werden. Da Nutzung von <> ist nicht zulässig

Indikatoren-Funktionen

Wenn Funktionen Parameter erwarten, so wird automatisch eine Eingabehilfe aufgerufen, die hoffentlich selbsterklärend ist.
Es gibt dabei eine Reihe von nutzbaren Funktionen, wobei folgende Zuordnung genutzt wird:

Die Funktionen basieren immer auf einer Einstellungsgruppe, die unter im Hauptmenü im Hauptfenster unter Einstellungen / Indikatoren neu angelegt werden kann. Das Anpassen der Einstellungen kann dann direkt mit dem Button "Verändern" vorgenommen werden.

Es gilt immer folgende Semantik:
<IndikatorenNamen>(<Indikatorengrupp>,<Basiswert>,<Basisergebnis>,<... Zusatzparameter...>,<Datumbasiswert>.

Für jede Indikatorengruppe wird immer eine Konstante angelegt z.B. varIGMittelfristigeEinstellungen mit varIG<Name>, die sollte genutzt werden. Wichtig ist hierbei zu verstehen, dass spezifische Indikatorenparameter z.B. MAKurz oder MALang über die Indikatorengruppe gepflegt werden und immer global gültig sind. Dies erscheint im ersten Moment umständlich, vereinfacht aber Optimierungen im Chart (manuell), die sofort für die Filter gültig werden ohne zusätzliche Änderungen. Die Änderung der Werte zu einem Indikator kann auf sehr unterschiedlichem Wege erfolgen.

Beispiele sind

  • Über das Hauptmenü "Einstellungen.Indikatorengruppe" - Doppelklick Indikator
  • Charteinstellungen (Änderungen direkt visuell prüfbar)
  • Chart - Indikatorenpannel
  • Filter - Wizard

Bei Ausführung des Filters sollte man bei Unstimmigkeiten oder zur Kontrolle den Detail-Log-Level aktiviert haben. Hier sind dann die Rückgabewerte der Funktionen prüfbar.

Als Funktionsergebnisse ist folgendes erlaubt:

  • Ergebniswert (varEWert) - Als Ergebnis der Funktion wird der Wert der Funktion zum Tag X ausgegeben.
  • Zonenwert (varEZone) - Der Rückgabewert liegt zwischen 1 und 3 und nimmt als Basis das Funktionsergebnis. Die Einordnung in eine Zone erfolgt immer auf Basis der Einstellungen eines Indikators. Z.B. kann die Einordnung mittels Normalverteilung oder Gleichverteilung vorgenommen werden. Im Ergebnis werden die Werte über einem festgestellten oberen Schwellwert mit Zone=3 und Werte unterhalb eines errechneten Schwellwertes mit Zone=1 zurückgegeben.
  • Aktivierung (varEAktivierung) - Ähnlich des Prinzips der Fuzzy Logik, kann jeder errechnete Kauf/Verkaufszeitpunkt eines Indikators mit einer Verfallszeit eingestellt werden. Dies sorgt dafür, dass das Signal "ausschwingt" in den folgenden Tagen mittels einer tanh Funktion (1-tanh( 2*Zeit/Signale.Verfallszeit )). Die Signale sind somit mit abnehmender Zeit bis zum Verfallstag immer deutlich schwächer. Verkaufssignale ergeben werden zwischen -1 und 0 und Kaufsignale ergeben immer Werte zwischen 0 und 1. Den Verlauf der Signalmuster kann eingestellt werden unter den Optionen eines Indikators und betrachtet werden in einem Chart unter Aktivierung der Signalmuster mit:
  • Signaltyp/ Signalstärke (varESignaltyp)- Hier werden generierte Kauf-und Verkaufssignale mit -1 und 1 (Kauf) zurückgegeben. Signaltyp und Signalstärke sind dabei synonym verwendet mit Ausnahme der Candlestickformationen.
    Candlestickformationen besitzen eine eigene Verwendung der Ergebnismengen mit:
    • Zonen sind immer = 0 ( es findet somit keine Berechnung statt)
    • Aktivierung = Signaltyp = 1 bei Kauf und -1 bei Verkauf
    • Wert = Typ der Formation entsprechend den definierten Variablen z.B. cCandleFHangingMan usw.
    • SigStaerke = Signaltyp*Candlestickformationen

Basisfunktionen:

Einige mathematische und logische Basisfunktionen:

  • SQR(x) Quadrat X
  • SIN(x) Die Funktion Sin berechnet den Sinus eines Winkels.
  • COS(x) Die Funktion Cos berechnet den Cosinus eines Winkels im Bogenmaß
  • ATAN(x) Die Funktion ArcTan berechnet den Arcustangens einer bestimmten Zahl.
  • SINH(x) Die Funktion ArcSin berechnet den inversen Sinus einer bestimmten Zahl.
  • COSH(x) ArcCos berechnet den inversen Cosinus einer bestimmten Zahl.
  • COTAN(x) Die Funktion Cotan berechnet den Cotangens eines Winkels (Intern wird 1 / Tan(X) gerechnet)
  • TAN(x) Tan berechnet den Tangens von X.
  • EXP(x) Die Funktion Exp gibt die Potenz von X zurück.
  • LN(x) Die Funktion Ln gibt den natürlichen Logarithmus eines Real-Ausdrucks zurück (Ln(e) = 1)
  • LOG(x) Logarithmus zur Basis 10
  • SQRT(x) Wurzel x
  • ABS(x) Die Funktion Abs gibt einen absoluten Wert zurück.
  • SIGN(x) Vorzeichen (-1,1,0)
  • TRUNC(x) Abschneiden der Nachkommastellen
  • CEIL(x) Ceil rundet den Wert einer Variablen auf z.B. Ceil(-2.8) = -2; Ceil(2.8) = 3; Ceil(-1.0) = -1
  • FLOOR(x) Floor rundet Variablen ab z.B. Floor(-2.8) = -3; Floor(2.8) = 2; Floor(-1.0) = -1
  • RND() Die Funktion Random erzeugt eine Zufallszahl innerhalb eines bestimmten Bereichs.
  • RANDOM() Initlisierung für die Nutzung von Zufallszahlen
  • INTPOW(x,y) IntPower errechnet die Potenz aus einer Basis.
  • POW(x,y) Power errechnet aus der Basis Base und dem beliebigen Wert Exponent die Potenz.
  • LOGN(x,y) LogN berechnet den Logarithmus X zur angegebenen Basis.
  • MIN(x,y) Minium von X, Y
  • MAX(x,y) Maximum von X,Y
  • IF(A,B,C) Wenn A>0 dann B sonst C

Kennzahlen:

Alle in Shareholder bekannten Kennzahlen sind auch im Filter nutzbar.

  • KGV(Basisjahr) : Kurs Gewinn Verhältnis des Basisjahres (1-nächste,0-aktuelle)
  • KBV : Kurs Buchverhältnis
  • KCV : Kurs Cashflow - Verhältnis
  • UMK : Umsatz Kursverhältnis
  • Buchwert
  • Cashflow
  • Aktienstueckzahl
  • Umsatz
  • Gewinn(Basisjahr) : Gewinn des Basisjahres (1-nächste,0-aktuelle)
  • Dividende(Basisjahr): Dividende des Basisjahres (1-nächste,0-aktuelle)
  • KWV(Basisjahr) : Gewinnwachstum des Basisjahres (1-nächste,0-aktuelle) auch PEG genannt

Kursdatenzugriffe

Es gibt für den Zugriff auf Kursdaten zwei relevante Funktionen:

  • Intraday(<baiswert>,<kurstyp>)
  • History(<basiswert>,<kurstyp>,<Heute-X-Zeitpunkt>)
Basiswert

Der Basiswert (Bezugswert für die Auswertung) ist im Normalfall mit "varAll" belegt und somit innerhalb einer Suchliste variabel, d.h. es wird immer der aktuelle Titel als Basiswert gesetzt und kein fixer Titel. Es ist aber auch möglich z.B. den TecDAX mit seiner (!)WKN zu verwenden "Intraday(<TECDAX-WKN>,<KursTyp>)" und hier einzusetzen. Es ist somit der betrachtete Wert unbestimmt mit varAll oder bereits vorbelegt mit der WKN nutzbar. Das Prinzip ist so für alle vorhandenen Funktionen übertragbar.

Kurstyp(en)

Als Kurstypen (<kurstyp>) sind erlaubt (O-1,H-2,L-3,C-4,V-5,D-8). Um die Schreibweise leserlicher zu machen (statt der Zahlenwerte), gibt es korrespendierende Konstanten:
varKOpen, varKHigh, varKLow, varKClose, varKVolumen, varKDatum.

Um die Lesbarkeit zu behalten, sollten diese wenn möglich auch immer verwendet werden. Diese werden aber nicht erzwungen. Intraday gibt dabei immer den aktuellen interen Tageskurs zurück. Liegen noch keine aktuellen Daten vor, wird der letzte bekannte Wert zurückgegeben. Der Wert entspricht immer der Anzeige in den Kurslisten unter AK (Aktuellem Kurs).

Heute-X-Zeitpunkt für History

History besitzt ein Parameter der bei 0 beginnt zu zählen, d.h. mit 0 : Tageswert und somit = Intraday entsprechend dem gewählten Kurstyp z.B.

  • History(varAll,varKClose,0) - Heutiger Schlusskurs bzw. letzter AK von heute.
  • History(varAll,varKClose,-1) - Vortageswert
  • History(varAll,varKClose,-2) - Vorgestern
    usw.

Logisch ist damit

  • History(<basiswert>,<kurstyp>,0) = Intraday(<basiswert>,<kurstyp>).

Aktienstammdaten:

Alle hier folgenden Funktionen sind Zeichenkettenfunktionen und lassen sich nur mit Patterns auswerten.

  • WKN
  • Symbol
  • Videotextname
  • Branche
  • Markt
  • Notizen

Neuronale Kursprognose-Netze:

Die Neuronalen Prognose-Netze können in einem Filtersystem genutzt werden. Der Zugriff erfolgt immer über die NNPrognose - Funktion, unabhängig vom genutzter Netz.

  • NNPrognose(ID des Netzes,Wert (z.B. valAll),Zielwert (z.B.varPrognoseHeute))

Bei der Nutzung eines solchen Ausdruckes, wird im Programm automatisch durch einen Assistenten die möglichen Parameter, IDs zusammengestellt.

Sub Filter

Die Bedingungen in einem DynFilter können zusätzlich strukturiert werden innerhalb von Sub-Filtern, d.h. es können definierte Filter in anderen Filtern aufgerufen werden. Dieser Aufruf darf natürlich nicht rekursiv erfolgen.

Die Berechnung des Subfilters erfolgt zu dem Zeitpunkt der ersten Nutzung innerhalb eines Bedingungsbaumes, sofern dies logisch notwendig ist (wenn die vorherigen AND Bedingungen nicht erfüllt werden können, kommt es zu keinem Aufruf der Funktion). Die Ergebnisse des Filters werden zwischengespeichert, so dass ein nochmaliger Zugriff nicht zu einer kompletten Neuberechnung führt.

Die Zugriffsfunktionen sind:

  • SubFilter(ID des Filters,varAll,Ergebniswert)

Als Ergebniswerte eines Subfilters sind definiert:

  • varFilterRanking - Rückgabe des Rankingwertes des betrachteten Basistitels
  • varFilterExists - 1 wenn existiert
  • varFilterPos - Position in der Ergebnismenge auf Basis der sortierten Liste mittels der Rankingfunktion
    zulässig.

Somit läßt sich sowohl die Position als auch die Existenz eines Wertes in einem anderen Filter ermitteln. Auch die Auswertung auf Basis eines bestehenden Rankings ist möglich.

Optimierung

Zur Zeit gibt es nur eine Variante eines automatischen Brute-Force-Optimierungsalgorithmus, d.h. es wird der Filter komplett berechnet mit vollständiger Auswertung aller logischen Ausdrücke (auch wenn logisch bereits klar ist, dass der Gesamtausdruck festgelegt ist wahr/falsch). Somit werden die Laufzeiten und die Gesamt-Aufrufe der Einzelbedingungen festgestellt.

Jede Einzelbedingung wird bewertet mit

  • Zeitbedarf x Aufrufe

Alle Einzelbedingungen können so sortiert werden nach logischem Ausschluß. Hierbei werden die Bedingungen, die ein sehr hohen "Aufwand" produzieren innerhalb eines Teilbaumes nach hinten sortiert. In der Praxis können so die weniger ressourcenhungrigen Bedingungen zuerst berechnet werden um dann (wenn noch notwendig) die weiteren Bedingungen auszuwerten.

In der Summe sollte so ein erstellter Filter immer durch das System optimiert werden. Eine manuelle Änderung der Reihenfolge der Einzelbedingungen innerhalb eines Teilbaumes ist zur Zeit vorgesehen, jedoch noch nicht integriert.

Bewertung eines Filters mit Handelssystem

siehe Handelssystem

Beispiele

Sie finden direkt im Programm eine editierbare Beispielleiste. Die Beispiele können mit Doppelklick auch direkt übernommen werden. Man kann sich so schnell eine eigene Sammlung von sinnvollen Bedingungen zusammenstellen.

Die Beispiele können mit Doppelklick als Ausdruck für eine Bedingung übernommen werden. Dein Beispiel mit RSI>X für alle deutschen Titel würden sich somit mit 5 Klicks zusammensetzen lassen:

  • Neue Bedingung erzeugen auf einem UND-Knoten (wenn notwendig erzeugen)
  • Tab "Beispiele" wechseln und Grundselektion / Beispiel: DAX-Werte
  • Bedingung-Speichern
  • Neue Bedingung erzeugen auf demselben UND-Knoten wie zuvor
  • Tab "Beispiele" wechseln und Grundselektion / Beispiel: Indikatoren / RSI
  • Bedingung nach eigenen Wünschen anpassen und Speichern
  • Filter insg. speichern - FERTIG.

Die Beispiele können selbst erweitert und ergänzt werden. Wichtig ist, dass ein Filter sich immer aus mehreren Einzelbedingungen zusammensetzen. Ich kann zwar auch komplizierte Bedingungen in ein Bedingungsausdruck miteinander verknüpfen; dies sollte man aber vermeiden.

Nachfolgend einige formulierte Beispiele, die so auch in der Standardauslieferung enthalten sind.

Durchschnittsvolumen der letzten 5 Tage

Um das Durchschnittsvolumen von den letzten 5 Tagen zu bekommen wäre somit simpel zu schreiben:

Mindestvolumen von 5000 Stk.

Wert hat an dem Tag ein bestimmtes mindest Volumen, z. B. 5000 Stk.

Kurs von über 0,05 Euro

Kursgewinn von 15%

4x so großes Durchschnittsvolumen

Wert hat einen 4x so großes Volumen als der Durchschnittswert der letzten 30 Tage.

Rein theoretisch könnte man auch GleitenderDurchschnitt als Funktion mit einer festgelegten Basisfestlegung auf den Kurstyp "Volumen" benutzen. Dies ist aber umständlich und erzwingt zudem eine eigene Indikatorengruppe, da diese Festlegung global gelten insb. für Charts usw.

Die 30 Tage verbergen sich hierbei in den Einstellungen für den Indikator "Gleitenden Durchschnitt" für die Indikatorengruppe "Mittelfristige Einstellungen".

Wert hat an dem Tag ein neues 60 Tage Hoch

Die 60 Tage müssen hierbei am Indikator eingetragen werden z.B. im Chart, im Indikatorenpannel, im Wizard oder auch einfach direkt unter Einstellungen.Indikatorengruppe ->Doppelklick (siehe Indikatorenfunktioen)

Nur deutsche Werte

Es gibt keine direkte Variante für diese Prüfung. Die Prüfung muss anhand der Marktdaten erfolgen. Hierbei werden alle relevanten Märkte in einem regulären Ausdruck vergleichen. Im Beispiel erfüllen somit alle Werte aus Märkten mit dem Namen DAX oder Standard usw. die Bedingung. Der Ausdruck sollte aber einmal einfach definiert werden und dann über SubFilter(<ID des Filters>,varAll) eingebunden werden. Erspart hier und an anderen Stellen etwas Arbeit.

Herleitung zusammen mit einem Chart-Indikator-Bild

Ziel: Filter erstellen, der mir die Aktien heraussucht, die ADX > 30 über die letzten 14 Tage hatte.

Die Herleitung sollte hier am einfachsten visuell erfolgen können. Die Einstellungen von Indikatoren werden immer in Indikatorengruppen gespeicher, d.h. möchte man ein und derselben Indikator auf unterschiedliche Zeiträume vergleichen, muss man entsprechende Indikatorengruppen bilden und diese im Filter entsprechend nutzen.

Nachdem man einen neuen Filter erstellt hat und eine UND-Bedingung sowie eine einfache Bedingung im Baum angelegt hat, geht man per Doppelklick auf die neue Bedingung in den Editor. In diesem Bedingungseditor, kommt man durch Eingabe von "DMI" sofort in den Wizard.

Hier kann man nochmals die Parameter des Indikators erkennen und verändern (Button Verändern). Wichtig ist die ganz untere Zeile, die dem eigentlichen Funktionsaufruf bildet, d.h. es gilt folgende Semantik

Funktionsname(<IndikatorengruppeID>,<Suchraum als WKN oder varAll>,<Ergebnistyp>,<ErgebnisPunkt relativ mit 0,-1,-2 oder als toDate()>)

Wichtig ist hier vor allem den Ergebnistyp zu verstehen.

Diesen Ergebnistyp kann man gut im Chart vergleichen und erkennen. Wert resultiert hier aus der Indikator-Ergebnislinie (graue) und wird bei Mausbewegung auch direkt angezeigt mit Wert. Der Zonenwert liegt zwischen 1-3 und kann für bestimmte Auswertungen helfen, da die Zonenberechnung unterschiedliche Methoden erlaubt die über ein >MinWert und <MaxWert hinausgehen. Der Aktivierungsgrad liegt zwischen -1 und 1 und entspricht nachlaufenden Kauf-und Verkaufssignalen, d.h. wenn ich nicht umständlich prüfen will ob ein Indikator ein Kaufsignal in den letzten 5 Tagen gebildet hat (womit ich ja DMI(....,-1) | DMI(...,-2) usw. schreiben müsste kann ich die Verfallszeit eines Signals einstellen z.B. auf 5 Tage. So länger der Wert her ist um so schwächer wird er. Dies ist im Chartbild auch gut zu erkennen.

Das Signal selber wird im Chart über rote und grüne Pfeile dargestellt. Die Signalumgebung kann erzeugt werden mit Richtungsänderung, Nullinienschnittpunkt usw. Da die Indikatoren unterschiedlich ausgelegt werden können, habe ich die Signalumgebung entsprechend flexibel ausgelegt. Der Signaltyp wird im Normalfall im 1 für Kauf und -1 für Verkauf sein. Für spezielle Indiaktoren wie die Candlestickformation sind zusätzliche Zuordnungen über Konstanten erlaubt. Die Signalstärke bei Candlestickformationen ergeben dabei statisch (siehe Hilfe für Candlesticks) festgelegte Rückgabewerte im Bereich 1-5.

Für Ihr Beispiel ergibt sich somit (14 Tage muss in der Indikatorengruppe eingestellt werden und ist damit auch automatisch für die Chartdarstellung gültig -> deshalb können die Indikatoren nicht direkt verändert werden)

Etwas schöner geschrieben wäre auch

möglich.

Alle Indikatorengruppe werden dabei als Konstanten mit "varIG<Name>" abgelegt. Der Wizard arbeitet aber bewußt mit technischen Nummern, da diese weniger anfällig gegen Umbenennungen sind.

Optimierungen und Ausblick

Durch die Verwendung von Verknüpfbaren Einzelbedingungen zu Entscheidungsbäumen kann es bei ungünstiger Wahl der Bedingungen zu einer unnötigen nicht bemerkbaren Einschränkung des Suchraumes kommen. Dies sollte verhindert werden durch die Anzeige der Trefferwahrscheinlichkeit einer Einzelbedingung. Durch die Verwendung von Indikatoren/Sentimenten ergeben sich durch die Parametisierung dieser Funktionen eine Unzahl von suboptimalen/nicht optimalen oder gar unbrauchbaren Parameterkonstellationen. Die Optimierung dieser Parameter sollte somit Bestandteil des Modules sein. Als Möglichkeiten kommen hier verschiedene technische Ansätze zu tragen. Das einfachste und am schnellsten Umsetzbare Verfahren wäre das Tabu Search Verfahren. Hiermit lassen sich innerhalb sehr kurzen Berechnungsphasen (fast) optimale Lösungen finden. Vorraussetzung dieser Methode wird jedoch die Vereinbarung einer (bewertbaren) Zielfunktion sein (Fertigstellung des Handelssystems). Diese kann anhand der Ergebnisse auf Basis der erzielten Kauf/Verkaufssignale eine Performanceanalyse durchführen.

Anwendung