Dienstag, 16. April 2024, 23:53 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Lieber Besucher, herzlich willkommen bei: INVESTOX-Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Trader

Fortgeschrittener

Registrierungsdatum: 2. März 2012

Beiträge: 110

1

Freitag, 2. März 2012, 11:01

Frage externer Indikator

Hallo,

ich würde gerne einen externen Indikator ( VB DLL) schreiben der als Ergebnis eine Candlestick Reihe zurück gibt. Im externen Indikator ist es aber nur möglich eine Zeitreihe zurück zugeben. Um Rechenzeit zu sparen möchte ich den Indikator nicht viermal aufrufen. Besteht die Möglichkeit mittels VB auf den globalen Datenspeicher zuzugreifen und dort die Zeitreihen abzulegen?

Danke

Trader

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

2

Freitag, 2. März 2012, 14:12

Im externen Indikator ist es aber nur möglich eine Zeitreihe zurück zugeben.

Mit VBS ab Investox V6 Du kannst soviele Zeitreihen zurückgeben, wie Du möchtest (jeden ist mir die Obergrenze nicht bekannt, mehr als ich selber bisher brauchte); seither habe ich keine VB mehr gebraucht (ich nehme im weiteren Text an, dass Du mit der Fantasiewort-Kombination "VB DLL" VB6 oder VB .net oder C# meinst, im Gegensatz zu VBS).

Um Rechenzeit zu sparen möchte ich den Indikator nicht viermal aufrufen. Besteht die Möglichkeit mittels VB auf den globalen Datenspeicher zuzugreifen und dort die Zeitreihen abzulegen?

Das geht in VBS mit SetGlobalVar. Damit Du den gewünschten Effekt erreichst, musst Du natürlich in derselben Iteration alle Daten einsammeln (hat nix mit Investox zu tun, sondern mit den Basics der Programmier-Logik), sonst spartst Du keine Rechenzeit. Ob VB (im Unterschied zu VBS) dagegen noch weitere Rechenzeit spart, hängt davon ab, wie komplex Deine geplanten Berechnungen abseits der Investox Formelmaschine sind. Eine simple Schleife wird kaum schneller werden, ebensowenig wie der Rückgriff auf die Investox Formelmaschine aus VB kontra VBS.

Tauchst Du in Deinen nativen Moduln dagegen Richtung Infinitesimalrechnung, Kelly, R-Quadrate, Fourier-Transformation oder anderen mathematischen Konstrukten mit eigenem Coding ab, kann es unter Umständen schneller werden (wenn Du mathematisch sehr effizient programmieren kannst, allerdings nur). Ob SetGlobalVar unmittelbar in VB (also .net oder VB6) unterstütz wird, weiss ich nicht; spätestens über die Formelmaschine sollte aber auch aus VB SetGlobalVar erreichbar, und damit das Übergabeproblem zu lösen sein; an der Stelle ist dann auch kaum mit einem Geschwindigkeitsvorteil nur für die Datenübergabe zu rechnen, so oder so.

Langer Rede, kurzer Unsinn: guck' die Doku zu SetGlobalVar mit VBS, es sei denn Du bist ein Mathe- und Programmierfreak mit einer sehr speziellen Anforderung - in diesem Fall Du sehen müsstest, wie SetGlobalVar über VB zu erreichen ist.
Gruss
Bernd

Trader

Fortgeschrittener

Registrierungsdatum: 2. März 2012

Beiträge: 110

3

Freitag, 2. März 2012, 14:27

Danke für deine Antwort.
Fantasiewort-Kombination "VB DLL

VB-DLL= Visual Basic Dynanmic Link Library
Ob SetGlobalVar unmittelbar in VB (also .net oder VB6) unterstütz wird, weiss ich nicht; spätestens über die Formelmaschine sollte aber auch aus VB SetGlobalVar erreichbar


Nur wie übergebe ich einen Ergebis Array aus VB in einen String für die Formelmaschine. Meiner Meinung geht das nicht.
Langer Rede, kurzer Unsinn: guck' die Doku zu SetGlobalVar mit VBS, es sei denn Du bist ein Mathe- und Programmierfreak mit einer sehr speziellen Anforderung.

Ich denke in compilierter Form ist es schon etwas schneller zudem ist er in VB praktisch fertig ( 8) . Es sind mehrere geschachtelte Schleifen für eine Statistik Auswertung.

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

4

Freitag, 2. März 2012, 14:33

VB-DLL= Visual Basic Dynanmic Link Library

Schon klar, ist aber im Investox Sprachgebrauch keine übliche Wort-Kombination. Es gibt VB (was natürlich dll ist im Zusammenhang mit Investox, was denn sonst; VB DLL ist also redundant, und so wusste ich nicht ob Du wirklich VB meinst, oder doch VBS, und ob VB6 oder .net mit einem der Spraqchderivate gemeint sein könnte mit Deiner Sprachschöpfung) und VBS.

Schau Dir doch jetzt erstmal die Doku zu SetGlobalVar an. Ich wüsste nicht, warum man SetGlobalVar nicht wie jedes andere über die Formelmaschine erreichbare Kontrukt aufrufen können sollte aus VB (ggf. über den Indikator VBScript).

Ich denke in compilierter Form ist es schon etwas schneller

Das müsste mal jemand testen; nur denken nützt da nix. Beim Aufruf muss die .dll erst geladen und initialisiert werden, während der VBS Host ja schon parat steht. Ich bezweifle, dass ein 0-8-15 Script ohne eigene Mathe Moduln, nur wegen 2 drei Schleifchen, signifikant schneller ist in VB als in VBS, aber auch das ist eine Vermutung. Ob dem so ist kann nur ein korrekter Test darstellen.
Gruss
Bernd

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Bernd« (2. März 2012, 14:49)


Ganesha

unregistriert

5

Freitag, 2. März 2012, 15:11

Bezüglich Performance:

VBS compiliert auch! Der Unterschied ist, dass VBS zur Laufzeit compiliert.
Externe Indikatoren müssen (große) Arrays kopieren.

Damit ist keine Variante per se performanter.

Der Vorteil einer externen Programmiersprache liegt für mich darin, dass es dort eine vernünftige Entwicklungsumgebung gibt. VBS von Investox ist nur ein einfacher Editor. Relevant wird das aber erst, wenn man wirklich komplexe Logik umsetzen will.

Bezüglich Candlesticks: Ist IMO nichts was man selbst bauen muss: Es gibt Ankes Candlestick-Plugin. Ist zwar etwas zäh (soviel zum Thema Performance von externen Indikatoren...) aber für rund 400,- EUR(???) lohnt es sich IMO nicht selber was zu bauen. Anke hat vor Investox schon mal ein Plugin für Metatrader geschrieben und in das Plugin die geballte Kraft mehrerer Jahre Erfahrung gesteckt.

Die Entwicklung profitabler Handelssysteme ist schwierig genug, da muss man IMO nicht noch Zeit mit Nebentätigkeiten verbraten.

Ganesha

unregistriert

6

Freitag, 2. März 2012, 15:30

Nochwas: Eine Candlestick-Erkennung liefert ja eigentlich nur ein einen Boolean zurück. Entweder Hammer oder nicht Hammer, entweder Morning Star oder nicht Morning Star, ...

Investox benutzt für den Datenaustausch Floats. In einem Float kann man 22 Boolsche Werte kodieren (2 Bit gehen fürs Vorzeichen und Dezimalzeichen drauf):

Angenommen der Indikator berechnet vier Candlesticks A, B, C, D. Dann codiert man das so:

Quellcode

1
2
3
4
5
int A = 1;
int B = 0;
int C = 1;
int D = 0;
float ergebnis = A*1+B*2+C*4+D*8;


Decodiert wird das dann mit dem Modulo-Operator:

Quellcode

1
2
3
4
5
calc ergebnis: ExternerIndikator();
calc A=mod(ergebnis, 1);//=1
calc B=mod(ergebnis, 2);//=0
calc C=mod(ergebnis, 4);//=1
calc D=mod(ergebnis, 8);//=0


Das ganze jetzt nur als Gedanke und ungetestet.

Trader

Fortgeschrittener

Registrierungsdatum: 2. März 2012

Beiträge: 110

7

Freitag, 2. März 2012, 16:45

Candlestick-Erkennun


Ich glaube hier liegt ein Missverständnis vor. Es handelt sich nicht um Candlestick-Erkennung sondern um die Ausgabe einer Candlestick-Reihe oder genauer um einen Mittelwert mit Fehlerbalken.

SetGlobalVar


Ich glaube man kann in VB die Daten in Form eines VB-Arrays mit cdaten.Addsinglefield... übergeben und dann die Formelmaschine benutzen und von dort aus einen VBS-Indikator aufrufen, der dann die Werte in den globalen Datenspeicher überträgt. Ziemlich umständlich und gleich zwei Kopiervorgänge. Ich werde es bei aber mal testen.

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

8

Samstag, 3. März 2012, 15:51

Ziemlich umständlich und gleich zwei Kopiervorgänge. Ich werde es bei aber mal testen.

Immerhin sind es nur Kopiervorgänge im selben Adress-Raum, die kann die CPU Memory-to-Memory schnell alleine ausführen (PS *), ohne die auf Mutlicore Maschinen zwischen Hiperthreads geshare-te Floating-Point Arithmetic oder andere per Semaphore sequantialisierte Pipelines (was auf OS Ebene, und damit für Dich transparent im Hintergrund, stattfindet) zu bemühen.

Du könntest natürlich auch VBS gegentesten, ob Dein Indikator wegen der dort (VBS) vorhandenen SetGlobalVar Facility nicht am Ende doch schneller ist als vermittels Deines geliebten compilierten "VB-DLL"'s :D

Ich wäre ehrlich an den Ergebnissen dieses vergleichenden technischen Performance-Tests interessiert! Bitte posten!


PS *: wenn Du's geschickt anstellst, gelingt es auch, nur eine Referenz (Pointer) zu übrgeben, und nix wird kopiert; Du bist dann mit einem CPU Cycle durch
Gruss
Bernd

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Bernd« (3. März 2012, 16:13)