Dienstag, 16. April 2024, 14:31 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Farewell

unregistriert

1

Freitag, 28. November 2014, 18:57

Stop-Limits mit VBScript berechnen?

Hallo,

ich möchte einen Stop programmieren, welcher nach jedem vollständigen OHLC-Bar das neue Stop-Limit anhand der Werte der bisherigen OHLC-Bars im laufenden Trade kalkuliert.

Hierzu benötige ich Zugriff auf die Schlüsselwörter für Anwenderstops (die Werte) sowie eine FOR-Schleife über alle Trade-Bars. Leider habe ich in Investox XL 7.0.19 noch keine Möglichkeit gefunden, eine entsprechende (VBScript-) Funktion zu erstellen.

Welche Möglichkeiten bietet Investox, das Gewünschte umzusetzen; fehlt mir ggf. noch eine Komponente zu Programmierung und Aufruf von (externen) Funktionen bei der Stopberechnung?

Mit freundlichen Grüßen,
Thomas W.

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

2

Samstag, 29. November 2014, 19:09

Hallo Thomas

Erst einmal: herzlich willkommen im Forum und bei Investox !!!

Nun ist es so: Stop-Level zu berechnen aufgrund des oder der vorhergehenden Bars, ist eine Standard-Funktionalität von Investox. Als Investox-Anweder würde man auf Anwenderstops und integriertem VBScript (For/Next Schleifen etc.) erst dann zurückgreifen, wenn man die gewünschte Funtionalität wirklich nicht mit einer der meist performanteren Standard-Stops darstellen kann.

Natürlich kann ich nicht ausschliessen, dass Du trotz dem Beitrags-Zähler: 1 im Forum schon ein erfahrener Anwender bist, der jetzt erstmals hier postet und weiss um die Pros und Cons und erweiterten Möglichkeiten von Anwender Stops ... aber vielleicht bedeutet es ja auch das naheliegende und Du bist neu in Investox. In dem Fall ist Rat zum Anwenderstop mit grosser Wahrscheinlichkeit nicht, was Du eigentlich suchst.

Vielleicht kannst Du näher erklären, was Dein Stop eigentlich leisten soll - und jemand im Forum kann Dir dann den Weg zeigen, den man praktischerweise gehen könnte. Wahrscheinlich ist es am Ende ein Einzeiler im Code (ein "global calc"), den Du dann in einem der Standard-Stops an geeigneter Stelle einträgst.

Möglicherweise hat Dir bisher sonst niemand geantwortet, weil Du schonmal den Lösungsweg (Anwenderstop, For/Next) vorgegeben hast, ohne das Ziel zu beschreiben. Das macht mitunter guten Rat ... schwer :engel:
Gruss
Bernd

Farewell

unregistriert

3

Montag, 1. Dezember 2014, 20:58

Hallo Bernd,

erstmal herzlichen Dank für Deine freundliche Begrüßung und Deine ausführliche Antwort. In der Tat bin ich noch nicht lange dabei, zumindest nicht, was mechanische Handelssysteme betrifft. Jedoch bin ich schon sehr lange im Bereich Software-Entwicklung tätig. Ich habe einen Algorithmus zur Implementierung des Trailing Stop zum Handel der Bewegung nach Michael Voigts Buch "Das große Buch der Markttechnik", Seite 245 bis 269 (unter Berücksichtigung von Innenstäben) geschrieben. Mein VB-Script-Algorithmus implementiert die exakte Stop-Berechnung anhand des OHLC-Chart-Verlaufs unter Berücksichtigung des mögliche Aneinanderreihungen von Innen- und Außenstäben, ausgehend von der Einstiegsperiode. Aus meiner Sicht ist die Formulierung in der Investox-Formelsprache nicht möglich, da diese nicht den notwendigen Sprachumfang besitzt.

Auch bin ich neu bei Investox. In meiner Einarbeitung in das Programm konnte ich feststellen, dass ich
Indikatoren mit VB-Script erstellen kann jedoch keine Stops. Das ist aber meines Erachtens unbedingt notwendig, wenn der Stopverlauf von der ersten Tradeposition abhängt, da ich an keiner anderen Stelle in Investox Zugriff auf die Startperiode habe (soweit ich bisher feststellen konnte).

Ich habe mir jetzt weitergeholfen, indem ich meinen Algorithmus als Indikator hinterlegt habe, dem ich als Parameter den Wert von TradePeriods mitgebe. Dann kann der Indiator aus AllePerioden-TradePeriods die Startperiode des Trade berechnen. Diese Lösung verstehe ich allerdings als Trick, um weiterarbeiten zu können, nicht unbedingt als professionelle Lösung.

Hast Du einen Tipp für mich?

Grüße,

Thomas W.

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

4

Dienstag, 2. Dezember 2014, 06:21

Hallo Thomas

Aufgrund Deiner Ausführung, was der Stop leisten soll (Markttechnik-Ansatz), ist die Komplexität nun klar. Unter diesen Umständen hätte auch ich diese Symbiose aus VBScript Indikator vorgeschlagen, der von einem AWS (Anwenderstop) aus aufgerufen wird und dem AWS Schlüsselwörter mitgegeben werden. Den Weg, den Du schon selbst gefunden hast.

Eine andere Möglichkeit fällt mir im Investox-Kontext dazu jetzt auch nicht ein (ausser natürlich, dass man den im AWS benötigten Indikator auch als externen Indikator mit Visual Basic oder C# umsetzen könnte, aber das ändert ja nichts an der grundsätzlichen Aufruf-Logik, die Dich wohl stört).
Gruss
Bernd

HP1973

unregistriert

5

Dienstag, 2. Dezember 2014, 11:39

Externe Programmierung - Stop

Hallo Bernd!
Eine kurze Frage weil's gerade Thema in der Diskussion mit Farewell ist ... (zwar jetzt nicht mein Problem als solches sondern Markttechnik & Programmierung)

Gibt es eine Möglichkeit in der externen Programmierung die Ticks (benötige hier die Information Kurs sowie Zeitstempel) einzeln "abzugreifen" (ohne sich auf die Komprimierung festzulegen)?

Für mein Verständnis wird ja die externe Programmierung je Aktualisierungsperiode aufgerufen -> ergo auf einem 5-Min-Kerzenchart kann ich
mit Open, Low, etc. operieren - jedoch verändert sich das "Ergebnis" mit einer Umstellung auf 5-Punkt-Spannenchart natürlich.
Grundsätzlich ist das ja natürlich schon die Idee - in meinem konkreten Fall jedoch leider nicht das gewünschte Ergebnis.

Um es anders zu formulieren:
Ich will einen Stop-Algorithmus schreiben, der sozusagen nativ immer auf Tick-Ebene kalkuliert wird - und zwar unabhängig davon ob ich (zB auch unabsichtlich) diesen
Algo in einen 5-Min-Kerzenchart "hineinsetze".

Ich hoffe ich habe mich einigermassen verständlich ausgedrückt ...

Grüße aus Wien sendet
Peter

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

6

Dienstag, 2. Dezember 2014, 18:50

Hallo Peter

Ich denke schon, dass ich verstanden habe, was Du meinst. Ob es klappt, hängt wohl von Deiner Erwartung ab: nämlich ob Du nur auf Ticks zugreifst, die in der letzten Periode (der Basis-Komprimierung, Stichwort Ref,-1) aufgetreten sind oder in der aktuellen Periode. Greifst Du auf Ticks der aktuellen Periode zu bei höher als Tick komprimierter Basis-Komprimierung, wird es zu den allbekannten "Flattersignalen" kommen, wo der Backtest prima aussieht - nur der Handel dann so gar nicht klappt.

Im Tickbereich müsstest Du also wahrscheinlich mit zwei Ref(,-1) und Komp() arbeiten (siehe NS), weil alle anderen Komprimierungen, die dieses Coding verarbeiten, sicher höher als Tick komprimiert sind. Also in etwa: Ref( Komp(#Ref( <Dein Coding>, -1)#,#1T#), -1)

Solch einen Ausdruck kannst Du natürlich direkt in den Zusatzbedingungen eines Stops einsetzen, oder wenn die Komplexität Deiner Aufgabe ähnlich umfangreich ist wie die Markttechnik-Umsetzung von Thomas W. Farewell, auch in [VBScript, VBasic, C#] externen Indikatoren über ScriptBerechneFormel() schachteln.


NS:
event. kannst Du entgegen der gängigen Investox Doku bei 1-Tick "Komprimierung" (also dem Verzicht auf die Komprimierung überhaupt, wie von Dir unabhängig von der Basis-Komprimierung gewünscht), auf das innere Ref-1 verzichten, da die innere Periode ja gar nicht komprimiert ist, und somit m.E. auch ohne Ref-1 nicht flattern können wird. Es müsste also in Deinem Fall gehen: Ref( Komp(# <Dein Coding>#,#1T#), -1)

Aber das ist nur eine theoretische Überlegung meinerseits aufgrund meines bisherigen Investox-Verständnisses - ohne Praxiserfahrung in diesem Extrem-Bereich ;( , die der Verification (Papertrading oder mindestens Datenfeed-Simulation) bedarf. Auf diese Weise wärst Du dann immerhin "einen Tick näher" am Marktgeschehen.

... es sei aber darauf hingewiesen, dass durch das äussere Ref-1 immer "irgendwie" eine Kopplung Deines "Tick-Stops" an die Basis-Komprimierung gegeben sein wird
Gruss
Bernd

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Bernd« (2. Dezember 2014, 19:33)


Farewell

unregistriert

7

Dienstag, 2. Dezember 2014, 19:27

Hallo Bernd,

vielen Dank für Deine Einschätzung und die Bestätigung meiner Lösung. Ich werde den beschriebenen Ansatz dann wohl beibehalten müssen.

LG
Thomas

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

8

Dienstag, 2. Dezember 2014, 19:45

Hallo Thomas

Immer gerne.

Es mach mir Freude, komplexe Fragestellungen zu diskutieren, desswegen gefällt mir dieser Foren-Thread hier gerade besonders gut!

Respekt! Obwohl Du noch nicht lange dabei bist, hast Du den wahrscheinlich einzigen Lösungsweg für Deine Aufgabe (ausgerechnet Markttechnik, am oberen Ende der Komplexitäts-Skala von Investox abgesehen überhaupt) mit den gegebenen Möglichkeiten selbst gefunden!

Ich freue mich auf weitere gute Diskussion im Forum von und mit Dir :)
Gruss
Bernd

HP1973

unregistriert

9

Mittwoch, 3. Dezember 2014, 11:29

Hallo Bernd!
Danke für Dein rasches Feedback - ich bin mir allerdings nicht sicher ob ICH Dich da richtig verstehe ...

Mein Ziel:
Ein HS das auf Markttechnik beruht wobei Einstiege und auch Ausstiege als Enter-Stop bzw. Exit-Stop realisiert werden.
Meiner Idee zufolge wird mein externer Indikator jeweils mit dem aktuellen Tick aufgerufen - der Returnvalue ist (zumindest noch in C#)
ein Objekt das die notwendigen Informationen "beinhaltet" (zB Exit-Stop, Position (Long/Short), Next-Entry, ...).

In Investox selbst/erst wird der Stop auf Basis des Wertes in Exit-Stop nachgezogen (dieser Wert liegt also "hinter" dem aktuellen Kurs).
Die Position läuft so lange bis der Stop erreicht ist.
Weiters sollte Investox (je nach Einstellung) dann bei Erreichen des Entry-Stops pyramidisieren.
(Selbstredend ist/muss das Entry-Level natürlich "vor" dem aktuellen Kurs liegen).

Weiters würde ich mal schätzen dass es hier sehr auf CPU-Power ankommt wenn auf kleiner Zeiteinheit operiert wird.
(Meine Einschätzung: Wenn ich bei DAX 9000 ein Entry-Level bei 9010 "errechne" ist zwar der DAX beim Return schon bei 9001
jedoch sollte die CPU-Performance ausreichen um den Entry-Stop bei 9010 noch "rechtzeitig" abzusetzen).
Der CPU-Flaschenhals wird somit mit kleinerer Zeiteinheit immer enger.

Wie schätzt Du das ein?
Meiner Ansicht nach ist die rechnerische Logik jetzt nicht überdramatisch.
Seit geraumer Zeit beschäftigt mich eher die Objektkomplexität (um die Realität auch korrekt zu modellieren).

Grüße aus Wien sendet

Peter

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

10

Mittwoch, 3. Dezember 2014, 18:14

Hallo Peter

Ja die (technische) Performance wird ein Herausforderung werden bei Deinem Vorhaben, wie immer, wenn es in den Tickbereich geht.

Neben der CPU Power schau', dass Du auch die schnellst mögliche I/O Performance hinbekommst, also eine aktuelle SSD an 6GB/s darf es schon sein.

Ausserdem wird in den Investox Windows Address-Space nur ein Teil der Ticks reinpassen (z.B. bezogen auf einen Forex-Titel mit 1 GB Size oder mehr auf der Platte); Du kannst Dich darauf einstellen, dass Du wahrscheinlich immer nur Junks von wenigen Wochen Backtesten kannst oder vielleicht weniger, je nach Deiner Programmierung resp. der benötigten Komplexität, und trotzdem wirst Du viel Geduld brauchen bei den Backtest.

Lege die Periodenlängen der verwendetetn Indikatoren auf jedenfall so aus, dass im Life-Betrieb dann nur wenige Minuten oder wenigsten wenige Stunden ausreichen, um das aktuelle Signal zu berechnen, dann hast Du eine Chance, dass das Signal unter Anwendung aller Kniffe, Häckchen und Buffer von Investox und dem ORM in Echtzeit gerechnet und im Markt umgesetzt werden kann.

(Allerdings dachte ich mich zu erinnern, was so alles im Grossen Buch der Markttechnik drinsteht - und sehe grad' gar nicht, warum man dazu auf Tickebene runtergehen muss. Vielleicht prüfst Du noch einmal, ob der Tickbereich wirklich das ist, wo Du hin musst. Wenn doch dann prüfe mal, ob Du nicht wenigstens auf Tick-Change gehen kannst, das hilft ein wenig aus Performance Sicht).
Gruss
Bernd

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Bernd« (3. Dezember 2014, 18:25)


HP1973

unregistriert

11

Montag, 8. Dezember 2014, 13:36

Hallo Bernd!

Zu "… glaube mich an die Markttechnik zu erinnern … Tickbereich …":

Natürlich ist bei der Markttechnik nicht vom Tickbereich per se die Rede. So wie ich's verstehe reichen natürlich auch 5-Min, 10min oder welche Komprimierung auch immer … Das Problem meiner Ansicht nach ist vielmehr die Tatsache, dass die Komprimierung (welche auch immer) mitunter die untere Zeitebene verschluckt oder man aus einer bestimmten CandleStick-"Formation" nicht zwangsläufig auf den Verlauf der kleineren Zeiteinheit schliessen kann. Wenngleich ein Trailing-Stop natürlich meist oK ist ist er doch in manchen Situationen eben markttechnisch nicht korrekt (diese Frage läßt sich jedoch nur bei Kenntnis des "Innenlebens" des 10-Min-Chart (zB) mit Sicherheit sagen).

Das es mit ziemlicher Sicherheit für das statistische Gesamtergebnis nicht von sonderlichem Belang sein wird will ich dabei jedoch garnicht abstreiten.

Mein Zugang war jedoch der, dass aufbauend auf dem Tick-Chart (also der Times&Sales-Liste) die markttechnisch relevanten Trends zur Laufzeit auf- und auch wieder abgebaut werden. Die unterschiedlichen Zeiteinheiten lassen sich so dann auch nicht in üblicher Form (10-Min, …) "messen" sondern ergeben sich zur Laufzeit.

Weiters denke ich dass ich für die Implementierung jeweils nur den aktuellen Tick benötige … von daher kann ich das Thema "Kurshistorie" jetzt nicht ad hoc nachvollziehen. In meiner Idee greife ich nicht auf den Tick t-10 oder so zu. Wichtig wäre in meiner Implementierungsidee natürlich schon der Punkt, dass ich mir den aktuellen Trend in irgendeiner Art merken muss (persistent auf der SSD und nicht nur im RAM). Die laufende Berechnung der Trends kann ja wohl nicht jeden Tag zum Open erneut angeworfen werden. Ebenso ist eine "Startkalkulation" bei t minus X auch nur eine Krücke.

Der größte markttechnische Trend kann ja seinen Beginn irgendwo haben - d.h. vor 3 Tagen oder auch vor 3 Monaten. VOR dem TradingStart (nachdem Computer down war) müsste also der aktuelle Status "hergestellt" werden. Eine Rechenzeit von ein paar Minuten sind da problemlos (wobei ich garnicht glaube, dass es sooo lange dauern wird wenn hier ein paar 10000 Ticks durchrauschen). Sollte die Rechenzeit doch problematisch sein bleibt immer noch der Kompromiss, dass der größte Trend (der zB schon ewig "sichtbar" ist) beim Neustart "verschwindet".

Andere Frage dazu:
Kann ich im C#-Coding irgendwie auf die RTT-Daten zugreifen (wenn ja auch zur Laufzeit? oder wird der File hier von RTT blockiert).

Schönen Feiertag noch wünscht

Peter aus Wien

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

12

Montag, 8. Dezember 2014, 23:01

Hallo Peter

Kann ich im C#-Coding irgendwie auf die RTT-Daten zugreifen (wenn ja auch zur Laufzeit? oder wird der File hier von RTT blockiert).

Du kannst mit jeder der von Investox unterstützten Sriptsprachen auf die Datenreihen aus dem Investox Titelverzeichnis mit Investox Sprach-Mitteln ohne Seiteneffekte zugreifen (also ohne dass Dein Coding RTT blokiert; eigenes Filehandling auf die RTT Titeldateien ist aufgrund des RTT Sharelevels umgekehrt dagegen auf Deiner Coding-Strecke zunächst kein Problem, musst dann halt selbst aufpassen, dass Du RTT nicht abklemmst und es während Deiner File-Akrobatik Daten verliert. Die Schreibvorgänge und das Caching, besonders wenn der hohe Datenload an Umkehrpunkten hereinkommt, sind ziemlich zeitkritisch).
Gruss
Bernd

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Bernd« (8. Dezember 2014, 23:20)