Donnerstag, 16. August 2018, 14:22 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.

Ganesha

unregistriert

1

Montag, 20. Februar 2012, 21:38

Externe Indikatoren von .net

Hallo,

ich möchte einen externen Indikator in einer .Net-Sprache bauen. Also VB oder besser C#.

Leider funktioniert es nicht. Ich bilde mir ein, getreulich alle Anweisungen befolgt zu haben, die ich hier im Forum sowie diversen Readmes gefunden habe. Ich bilde mir außerdem ein gründlich gegoogelt zu haben und systematisch alles ein- und ausgeschalten zu haben, wo man nur klicken kann.

Ich habe außerdem Investox komplett neu installiert (was für eine Arbeit, zuerst alles irgendwie exportierbare exportieren, dann Investox deinstallieren, neu installieren, Updates, Indikatoren neu einrichten ...)

Fehlermeldungen bleiben immer die gleichen, wenn ich einen dieser Indikator-Versuche zum Chart zuzufügen, kommt eine der zwei Fehlermeldungen siehe Bild.

Habt Ihr eine Idee was falsch laufen könnte?

Viele Grüße

Edit: Betriebssystem ist WinXP Prof. aber unter Parallels Desktop mit allen Updates in 32bit, Investox ist V6 mit allen Updates. Entwicklungswerkzeuge sind VS2010 Express(!!) einmal Basic, einmal C#.

Edit2: Ich bin Informatiker. Aber ein Unix-Mensch. Kann sein das es bei Windows einen geheimen Button gibt, den ich noch irgendwie drücken muss.. :engel:
»Ganesha« hat folgende Bilder angehängt:
  • Parallels Picture 1.png
  • Parallels Picture.png

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 685

Wohnort: Köln

2

Montag, 20. Februar 2012, 22:05

Hallo Ganesha,

mit der .Net-Integration ist es, wenn man die ersten Hürden geschafft hat, nicht so problematisch.

Schicke mir ein paar mehr Infos, vielleicht kann ich dir einfach weiterhelfen.

Gruß

Martin

Ganesha

unregistriert

3

Montag, 20. Februar 2012, 23:09

Hallo Martin,

ich hänge mal ein Projektverzeichnis an. Das habe ich IMO hier aus dem Forum. Enthalten ist ein einfacher Indikator in VB.
Außerdem zwei Bilder wie ich den Indikator in Investox registriert habe.

Alles was ich mache ist das Projekt öffnen. "Neu erstellen" klicken. Es kommt diese Warnung:

Warnung 1 Der Typbibliothekexporter hat eine nicht von IUnknown abgeleitete Schnittstelle gefunden: "_HiddenInterface". ExterneDotNetIndis

Ich führe dieses Script im Release-Verzeichnis aus:

Quellcode

1
2
3
4
5
6
7
copy Interop.KSEImportExport6.dll c:\windows\system32
copy ExterneDotNetIndis.dll c:\windows\system32

gacutil /i c:\windows\system32\Interop.KSEImportExport6.dll 
gacutil /i c:\windows\system32\ExterneDotNetIndis.dll 

regasm /tlb c:\windows\system32\ExterneDotNetIndis.dll


Ausgabe ist dann

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2010\P
rojects\ex\ExterneDotNetIndis\bin\Release>start.cmd

C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2010\P
rojects\ex\ExterneDotNetIndis\bin\Release>copy Interop.KSEImportExport6.dll c:\w
indows\system32
    	1 Datei(en) kopiert.

C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2010\P
rojects\ex\ExterneDotNetIndis\bin\Release>copy ExterneDotNetIndis.dll c:\windows
\system32
    	1 Datei(en) kopiert.

C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2010\P
rojects\ex\ExterneDotNetIndis\bin\Release>gacutil /i c:\windows\system32\Interop
.KSEImportExport6.dll
Microsoft (R) .NET Global Assembly Cache Utility.  Version 2.0.50727.42
Copyright (c) Microsoft Corporation.  All rights reserved.

Die Assembly wurde dem Cache erfolgreich hinzugefügt.

C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2010\P
rojects\ex\ExterneDotNetIndis\bin\Release>gacutil /i c:\windows\system32\Externe
DotNetIndis.dll
Microsoft (R) .NET Global Assembly Cache Utility.  Version 2.0.50727.42
Copyright (c) Microsoft Corporation.  All rights reserved.

Die Assembly wurde dem Cache erfolgreich hinzugefügt.

C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2010\Projects\ex\ExterneDotNetIndis\bin\Release>regasm /tlb c:\windows\system32\ExterneDotNetIndis.dll
Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.42
Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved.

Types registered successfully
Assembly exported to 'c:\windows\system32\ExterneDotNetIndis.tlb', and the type library was registered successfully
»Ganesha« hat folgende Bilder angehängt:
  • Parallels Picture 2.png
  • Parallels Picture 3.png

Ganesha

unregistriert

4

Montag, 20. Februar 2012, 23:10

Und das Projekt
»Ganesha« hat folgende Datei angehängt:
  • ex.zip (86,56 kB - 102 mal heruntergeladen - zuletzt: 27. Juli 2018, 16:44)

Ganesha

unregistriert

5

Montag, 20. Februar 2012, 23:15

Hallo Martin,

was brauchst Du noch für Informationen?

Ich vermute das es weniger an meinem Projekt oder Investox liegt, sondern möglicherweise das ich mir meine Windows-Installation irgendwie verbogen habe.
Im Verzeichnis c:\windows\system32 gibt es eine ganze Reihe von interop.*.dll

Vielen Dank

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 685

Wohnort: Köln

6

Dienstag, 21. Februar 2012, 10:37

Hallo Ganesha,

das mit dem Projektverzeichnis macht mir die Untersuchtung einfach. Ich komme aber erst heute abend dazu draufzuschauen.

Gruß

Martin

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 685

Wohnort: Köln

7

Dienstag, 21. Februar 2012, 19:43

Hallo Ganesha,

die Lösung ist recht einfach.

1. du musst bei den Compile-Options "Register for COM interop" wählen


2. auf der gleichen Maske öffnest du die "Build Events" und trägst die folgenden Zeilen zur Registrierung deiner DLL ein:


"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil" /i "$(TargetPath)"
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm /tlb "$(TargetPath)"

Die Zeilen verwenden auf meinem System die Utilities für .NET 4.0. Da du .NET 3.5 verwendest musst du die passenden Programme gacutil und regasm auf deinem Rechner suchen und statt meiner verwenden.

Wenn du dann noch Investox als Startapplikation einträgst kannst du aus Visual Studio deine DLL starten. Investox öffnet sich dann. Wenn du nun ein HS mit deiner DLL verwendest kannst du im Debugger das Programm sauber verfolgen.


Viel Erfolg mit deiner Entwicklung

Martin

P.S. wenn's noch nicht klappt, bitte einfach nochmals nachfragen

Bernd

Erleuchteter

Registrierungsdatum: 5. Juni 2005

Beiträge: 3 853

Wohnort: Iringsweg

8

Dienstag, 21. Februar 2012, 20:23

Entwicklungswerkzeuge sind VS2010 Express(!!) einmal Basic, einmal C#


Wenn du nun ein HS mit deiner DLL verwendest kannst du im Debugger das Programm sauber verfolgen.

Der Laufzeit-Debugger geht also mit Express 2010 für .dll's? Mit Express 2008 geht das nicht, erst ab Prof. glaube ich hat das hier geklappt; nun da muss ich mir die neue Express Version ja auch mal besorgen! Danke für den Hinweis.
Gruss
Bernd

-----------------------------------------------
http://www.13quants.ch

Ganesha

unregistriert

9

Dienstag, 21. Februar 2012, 22:16

Hallo,

vielen Dank für Deine Mühe. Allerdings befürchte ich, dass ich bei Basic nicht die richtige Version habe. Die Inter-Op-Option gibt es bei mir nicht. :(
Du hast die Professionell-Variante von VB?

Grummel: Die 800,- EUR wollte ich mir kneifen. :)

Aber: Es gibt die Option im C#-Teil. Mal gucken wie weit ich damit komme. Anhängend ein Bild der Compiler-Optionen von VB

Viele Grüße
»Ganesha« hat folgendes Bild angehängt:
  • Parallels Picture.png

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 685

Wohnort: Köln

10

Dienstag, 21. Februar 2012, 22:57

Hi,

mit der Express-Version kannst du weder mit VB noch mit C# debuggen,

nur, für die Entwicklung über die Investox-Schnittstelle ist Debuggen mehr als nur bequem.

Gruß

Martin

Ganesha

unregistriert

11

Dienstag, 21. Februar 2012, 22:59

Hallo,

also Fazit: Ich komme mit C# ein Stück weiter. Denke ich jedenfalls.

Fehlermeldung ist jetzt diese, nach dem der Indikator etwas rechnet.

Quellcode

1
2
3
4
5
6
7
8
9
10
Projekt: test3
System: l5
Vorgang: Indikatorberechnung
Titel: FDAX-5Minuten
Indikator: Class1
Meldung: Fehler im Programmablauf aufgetreten: Invalid procedure call or argument (Fehler Nr. 5).
Abschnitt:
Class1()
Berechnung:
Class1()


@Bernd: Nein Debugging einer Fremdapplikation geht mit der Express-Version nicht. Man muss also Investox runterfahren. Compilieren, Investox starten, gucken und überlegen ...

Bezüglich C#
Ich vermute mal, dass ich da irgendwie ein Problem der Methoden-Signatur habe:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Class1
	{
    	float[] open;
    	float[] high;
    	float[] low;
    	float[] close;

    	public bool Calculate(ref KSEImportExport6.KSEDataCollection cDaten, ref object Parameter, ref object[] ergebnis)
    	{
        	open = new float[cDaten.get_UpperBound("Open") - 1];
        	high = new float[cDaten.get_UpperBound("High") - 1];
        	low = new float[cDaten.get_UpperBound("Low") - 1];
        	close = new float[cDaten.get_UpperBound("Close") - 1];

        	for (int i = 0; i < close.Length; ++i)
        	{
            	ergebnis[i] = i;

        	}
        	return true;
    	}
	};


statt des object[]-Objekttyps habe ich wahlweise auch mal float[] und simple[] versucht. Teilweise unterschiedliche Fehlermeldungen, aber ansonsten das gleiche. Was für einen Objekttyp verlangt denn Investox in der Calculate-Methode?

Viele Grüße

MartinP Männlich

Meister

Registrierungsdatum: 13. März 2007

Beiträge: 685

Wohnort: Köln

12

Dienstag, 21. Februar 2012, 23:06

Hi Ganesha,

C# ist mir mit meiner Erfahrung her deutlich vertrauter, aber VB ist vom Sprachumfang her mit C# identisch. Es sind nur "persönliche" Aspekte die für die eine oder die andere Sprache sprechen. Abgesehen vielleicht davon, dass es für C# etwas mehr Support im Internet gibt, aber der Unterschied ist nicht so gewaltig. Das neue VB hat nichts mit den schrägen Ursprüngen zu tun. Daher probier erstmal deine Idee für den Indi, dann schaue nach der "eleganteren" Sprache. Und, du kannst C# Assembleys später ohne Probleme mit dem VB-Rumpf mischen.

Gruß

Martin

Ganesha

unregistriert

13

Dienstag, 21. Februar 2012, 23:07

So, Sch... drauf: Ich habe mir kurzerhand die Prof-Variante bestellt...

Ganesha

unregistriert

14

Dienstag, 21. Februar 2012, 23:21

C# ist mir mit meiner Erfahrung her deutlich vertrauter, aber VB ist vom Sprachumfang her mit C# identisch. Es sind nur "persönliche" Aspekte die für die
Ja, ich weiß. Ist mein Programmierer-Ego. :D
Aber nach fast 25 Jahren C/C++/Java ist mir C# doch deutlich näher als Basic.

ivu

Benutzer

Registrierungsdatum: 19. November 2009

Beiträge: 43

15

Dienstag, 21. Februar 2012, 23:45

Für die ganz Sparsamen: es reicht, wenn man von der freien Express-Version auf die Professional-Version upgradet.
Siehe dazu beim Hersteller:
http://www.microsoft.com/germany/visuals…ofessional.aspx

Ganesha

unregistriert

16

Donnerstag, 23. Februar 2012, 22:07

Hallo alle Zusammen,

Vielen Dank für Eure Hilfe.

Ich habe jetzt VC2010 Prof und nun tut alles.

Anhängend ein Beispiel für einen C#-Indikator.

Für C# muss die Methoden-Signatur so aussehen:

Quellcode

1
public bool Calculate(ref KSEImportExport6.KSEDataCollection cDaten, ref object Parameter, ref object o)


Das Ergebnis-Objekt muss man allerdings noch auf ein float-Array casten:

Quellcode

1
float[] ergebnis = (float[])o;


Viele Grüße
PS: Die Indikator tut nichts aufregendes. Lediglich das Äquivalent zu

Quellcode

1
calc typical: (high+low+close)/3;
»Ganesha« hat folgende Datei angehängt:
  • TypicalCSharp.zip (10,02 kB - 92 mal heruntergeladen - zuletzt: 3. August 2018, 23:28)

Ganesha

unregistriert

17

Donnerstag, 23. Februar 2012, 22:11

Für die ganz Sparsamen: es reicht, wenn man von der freien Express-Version auf die Professional-Version upgradet.
Siehe dazu beim Hersteller:
http://www.microsoft.com/germany/visuals…ofessional.aspx
Was witzigerweise wirklich geht. :) Man spart damit um die 200,- EUR.

Ganesha

unregistriert

18

Samstag, 25. Februar 2012, 00:39

Hallo,

ich habe noch eine Frage: Ich will als Parameter eine Datenreihe übergeben. Bei der Deklaration des Indikators habe ich in Investox daher (testweise) drei Parameter definiert. Der dritte Parameter ist als datenreihe definiert. Im Chart wird ein macd(close) übergeben.

Um im Indikator die Daten zu bekommen, mache ich dieses:

Quellcode

1
2
3
4
Dim Zeiger As String
    	Dim Daten() As Single
    	Zeiger = Parameter(3)
    	Daten = cDaten(Zeiger)


Dabei bekomme ich allerdings einen Laufzeitfehler:
Das Objekt des Typs "System.Single[*]" kann nicht in Typ "System.Single[]" umgewandelt werden.

Was auch immer ein System.Single[*] sein mag. (Array von Zeigern?)

Mit dem Debugger kann ich auf cDaten(Zeiger) gehen und bekomme die erwarteten Daten anzeigt. Die Daten kommen also an, allein mein Code ist irgendwie falsch.

Im Beispiel benutze ich Visual Basic 2010 .net


Für einen Hint wäre ich dankbar.

Viele Grüße

Ganesha

unregistriert

19

Freitag, 2. März 2012, 22:47

Ich will als Parameter eine Datenreihe übergeben.
So, habs raus bekommen:

So wird aus dem Parameterobjekt ein String-Array gemacht.

Quellcode

1
2
3
4
5
Object[] o = (Object[])Parameter;
        	String[] daten = new string[o.Length];
        	for(int i = 0; i < o.Length; i++) {
            	daten[i] = (string)o[i];
        	}


Die Nummer der Parameter ist der Index. In Abweichung zu den C#-Üblichkeiten beginnt das Array mit 1 und nicht mit 0. Angenommen die Wertereihe ist der zweite Parameter, muss also daten[2] sagen. Was man dann hat, ist aber nur ein Pointer bzw. Variable die auf eine Map zugreift.

Die eigentliche Datenreihe bekommt man so:

Quellcode

1
2
3
4
string zeiger = daten[2]; //Zeiger holen
        	int size = cDaten.get_UpperBound(zeiger); //Groesse abschaetzen
        	float[] datenreihe = new float[size]; //Speicherbereich anlegen
        	cDaten.CopySingleFeldToAddress(zeiger, ref datenreihe[0], size); //kopieren


In Datenreihe steht dann die Wertereihe.