Eddy Posted December 14, 2010 Report Posted December 14, 2010 Ich möchte die Input-Parameter für einen Indikator über eine C#Form erfassen. Der Aufruf der OnBarUpdate-Methode soll so lange unterbleiben, bis die Form geschlossen wird. So bin ich vorgegangen: public class ParmsForm : Form { public ParmsForm () { this.Text = "C# - einfaches Form"; this.Size = new Size(600, 400); AddContextMenuAndItems(); addControls(); } .... .... .... Die Form rufe ich modal in der OnStartUp-Methode auf: protected override void OnStartUp() { ParmsForm parmsForm = new ParmsForm(); parmsForm.ShowDialog(); } Die Form wird angezeigt. Jedoch wird auch die OnBarUpdate-Methode aufgerufen, bevor die Form geschlossen wird. Meine Parameter sind damit im Indikator noch nicht bekannt. Hat jemand hierfür eine Lösung oder eine Idee? GrußEddy Quote
Roy Awesome Posted December 14, 2010 Report Posted December 14, 2010 Die Form rufe ich modal in der OnStartUp-Methode auf: protected override void OnStartUp() { ParmsForm parmsForm = new ParmsForm(); parmsForm.ShowDialog(); } Die Form wird angezeigt. Jedoch wird auch die OnBarUpdate-Methode aufgerufen, bevor die Form geschlossen wird. Meine Parameter sind damit im Indikator noch nicht bekannt. Hat jemand hierfür eine Lösung oder eine Idee? GrußEddy Probier mal: parmsForm.ShowDialog(this); Quote
Eddy Posted December 14, 2010 Author Report Posted December 14, 2010 Probier mal: parmsForm.ShowDialog(this); Habe ich probiert. Es kommt dann die Fehlermeldung CS0029. Damit kann ich aber nichts anfangen. this (der Indikator) muss das Interface IWin32Window implementieren, was aber wiederum zu einer Fehlermeldung führt. NinjaScript File;Error;Code;Line;Column; Indicator\I123.cs;"NinjaTrader.Indicator.I123" implementiert den Schnittstellenmember "System.Windows.Forms.IWin32Window.Handle" nicht.;CS0535 - click for info;42;18; Quote
Eddy Posted December 14, 2010 Author Report Posted December 14, 2010 Ich glaube, ich habe eine Lösung gefunden. Muss sie aber morgen noch weiter prüfen. DialogResult dr = new DialogResult (); ParmsForm parmsForm = new ParmsForm(); dr = parmsForm.ShowDialog(); Quote
Eddy Posted December 15, 2010 Author Report Posted December 15, 2010 Leider funktioniert die Lösung doch nicht. :gum: Quote
wh Posted December 15, 2010 Report Posted December 15, 2010 Schaust Du hier: public class ParamsForm : System.Windows.Forms.IWin32Window 1 Quote
Eddy Posted December 15, 2010 Author Report Posted December 15, 2010 Schaust Du hier: public class ParamsForm : System.Windows.Forms.IWin32Window Hallo wh, ich glaube, hierzu fehlen mir WPF und oder c#-Kenntnisse. Kannst du ein bischen mehr dazu schreiben? Im NinjaTrader-Formum habe ich folgendes gefunden: [Description("")] [GridCategory("Parameters")] [Editor(typeof(System.Windows.Forms.Design.FileNameEditor), typeof(System.Drawing.Design.UITypeEditor))] public string Open { get{return open;} set{open = value;} } Bedeutet das, dass ein Editor (also auch meine eigene Form) als Parameter eingebunden werden kann? Hat das schon mal jemand hier gemacht? Quote
wh Posted December 15, 2010 Report Posted December 15, 2010 Habe keine Zeit um mich damit auseinander zusetzen. Aber vielleicht hier Bzw. WPF http://java2s.com/Code/CSharp/Windows-Presentation-Foundation/CatalogWindows-Presentation-Foundation.htm 1 Quote
Roy Awesome Posted December 15, 2010 Report Posted December 15, 2010 Hm. Eventuell probieren ob die ShowDialog() Methode unter WPF ein modales Fenster erzeugt. Die Dokumentation liest sich irgendwie so. Wäre sicher einfacher, einen Ninja-Indikator mit WPF in VisualStudio zu entwickeln, da Ninja kein XAML kann. Ich kanns leider nicht selbst probieren, da ich Ninja nicht verwende. Hasst dus schon mal im Ninja-Support Forum gefragt? Quote
Eddy Posted December 15, 2010 Author Report Posted December 15, 2010 Hasst dus schon mal im Ninja-Support Forum gefragt? Gerade gemacht. Quote
wh Posted December 17, 2010 Report Posted December 17, 2010 Pass Data between two forms (http://www.codeproject.com/KB/cs/pass_data_between_forms.aspx). Eddy an Deiner Sache sind ein paar Leute interessiert. Du kannst Dich mal an Max-TD von BMTwenden. Ich denke da wird Dir mehr geholfen als im Ninja Support Forum. Die Sache ist nicht schwer umzusetzen. Visual Studio 2008Integration von Ninja und du kannst mit C#als alter Java-Usermachen, was Du möchtest. Beispiele gibt es ja genug im Netz. Vielleicht hilft es auch, wenn man ein Thema ein wenig mehrspezifiziert bzw. ein abstraktes Bild schafft. 2 Quote
Roy Awesome Posted December 17, 2010 Report Posted December 17, 2010 Ich glaub nicht, das normale modale Winforms funktionieren, da das 2 Forms (parent/child) vorraussetzt. Eine stinknormale MessageBox wird Ninja ja auch nicht blockieren, oder? Man könnte versuchen, ein ähnliches Verhalten selbst zu basteln, ungefähr so: using System.Threading; ParmsForm parmsForm = new ParmsForm(); while(!ParamsForm.IsDisposed) Thread.Sleep(10); 1 Quote
wh Posted December 17, 2010 Report Posted December 17, 2010 Bin mir da auch nicht sicher, aber Parent in diesem Fall ist dein Chart aus dem Du dieStrategie rufst. Ich denke da gibt es eine Menge Ideen. Schaue mal hier http://www.youtube.com/watch?v=LQlq54WXUeo&feature=player_embedded#! Und hier ist der Download Link. http://www.volumedigger.com/NinjaTrader/Strategies/dsChartTrader.aspx 1 Quote
Eddy Posted December 17, 2010 Author Report Posted December 17, 2010 Ich glaub nicht, das normale modale Winforms funktionieren, da das 2 Forms (parent/child) vorraussetzt. Eine stinknormale MessageBox wird Ninja ja auch nicht blockieren, oder? Man könnte versuchen, ein ähnliches Verhalten selbst zu basteln, ungefähr so: using System.Threading; ParmsForm parmsForm = new ParmsForm(); while(!ParamsForm.IsDisposed) Thread.Sleep(10); Hallo Roy, ES FUNKTIONIERT SO. Danke für diesen Tipp. Eddy Quote
Eddy Posted December 20, 2010 Author Report Posted December 20, 2010 Hallo Roy, ES FUNKTIONIERT SO. Danke für diesen Tipp. Eddy Muss mich leider schon wieder korrigieren. Es HATTE funktioniert, weil keine Kursdaten vom Provider geliefet wurden. Deshalb wurde auch der Event 'OnBarUpdate' nicht aufgerufen.Deshalb sah es so aus, als ob es funktioniert hätte. Quote
Roy Awesome Posted December 20, 2010 Report Posted December 20, 2010 Muss mich leider schon wieder korrigieren. Es HATTE funktioniert, weil keine Kursdaten vom Provider geliefet wurden. Deshalb wurde auch der Event 'OnBarUpdate' nicht aufgerufen.Deshalb sah es so aus, als ob es funktioniert hätte. Ich hab nicht wirklich Ahnung von Ninja, aber du kannst ja einfach eine globale Variable auf true setzen, wenn das Parameter-Form geschlossen wird, und in der OnBarUpdate Methode überprüfen, ob die true oder false ist. bool IsInit = false; protected override void OnStartUp() { ParmsForm parmsForm = new ParmsForm(); while(!ParamsForm.IsDisposed) Thread.Sleep(10); IsInit = true; } protected override void OnBarUpdate(Bar bar) { if(!IsInit) return; //blabla } Quote
Eddy Posted December 20, 2010 Author Report Posted December 20, 2010 Ich hab nicht wirklich Ahnung von Ninja, aber du kannst ja einfach eine globale Variable auf true setzen, wenn das Parameter-Form geschlossen wird, und in der OnBarUpdate Methode überprüfen, ob die true oder false ist. bool IsInit = false; protected override void OnStartUp() { ParmsForm parmsForm = new ParmsForm(); while(!ParamsForm.IsDisposed) Thread.Sleep(10); IsInit = true; } protected override void OnBarUpdate(Bar bar) { if(!IsInit) return; //blabla } Habe ich auch probiert. Das Problem ist wohl folgendes:NT ist ein Event-gesteuertes System. Wenn ein Tick hereinkommt, wird sofort das Ereignis OnBarUpdate ausgelöst. Mit deinem Vorschlag kann ich, solange die Parameter-Form offen ist, den Tick nichtmehr verarbeiten (was ich aber will!). Eine Lösung wird es wahrscheinlich nur über den NT-Parameterdialog geben. Hier muss ich irgendwie meine Form aufrufen. Ich habe auch die Variante, die Parameterform über ein Property des Parameterdialogs aufzurufen, probiert. Nur wird hier die Form mehrere male hintereinander aufgerufen. Ist auch Mist. Quote
Roy Awesome Posted December 20, 2010 Report Posted December 20, 2010 Ich verstehs nicht ganz. Was heisst verarbeiten? Soll die OnBarMethode aufgerufen werden oder nicht? Mit o.g. Methode kannst du einfach checken, ob das Form geschlossen wurde oder nicht, und abhängig davon gewisse Dinge machen oder nicht. Wo ist das Problem? Quote
Eddy Posted December 20, 2010 Author Report Posted December 20, 2010 Ich verstehs nicht ganz. Was heisst verarbeiten? Soll die OnBarMethode aufgerufen werden oder nicht? Mit o.g. Methode kannst du einfach checken, ob das Form geschlossen wurde oder nicht, und abhängig davon gewisse Dinge machen oder nicht. Wo ist das Problem? Obwohl die Form modal aufgerufen wird und aktiv ist, feuert NT verschiedene Events (u.A. OnBarUpdate). In der OnBarUpdate-Methode berechne ich (Markttechnik) den 123-Trendverlauf. Hierfür benötige ich verschiedene Input-Parameter (z.B. wie soll ein Punkt 2 erkannt werden). Diese Parameter kann ich allerdings auch über den Standard-NT-Parameterdialog erfassen. Da ich aber Abhängigkeiten unter den Parametern habe, wollte ich dies in einer C#-Form lösen. Das Problem ist jetzt folgendes: Wenn OnBarUpdate aufgerufen wird, wird z.B. eine Methode zur Punkt 2-Erkennung ebenfalls aufgerufen. Jedoch nicht mit den Parametern aus meiner Form (die ist ja noch aktiv) sondern mit den im NT-Code festgelegten Default-Werten. Unterdrücke ich aber die Verarbeitung in OnBarUpdate, erkenne ich bestimmte Situationen nicht mehr, da die Berechnung an einigen Bars nicht erfolgt ist. Quote
wh Posted December 20, 2010 Report Posted December 20, 2010 if(!historical) könnte da vielleicht helfen und update on bar close = false. Oder mußt du jeden Tick verarbeiten ... Quote
Eddy Posted December 20, 2010 Author Report Posted December 20, 2010 if(!historical) könnte da vielleicht helfen und update on bar close = false. Oder mußt du jeden Tick verarbeiten ...Wenn ich die Bewegung am Punkt 2 handeln will, soll man eine Stop-Order vor erreichen des P2 (das Delta zum P2 ist einer meiner Parameter) erstellen. Diese Auswertung soll mit jedem Tick erfolgen. Die Parameter über eine C#-Form einzugeben hat folgenden Hintergrund:Um meine Strategie reproduzierbar und OHNE großen manuellen Aufwand (Parametereingabe) zu testen, speichere ich die Parameter in einem XML-Format. In der Form lade ich alle Parametersätze in eine Tabelle. Aus dieser kann ich dann den entsprechenden Parametersatz auswählen. Z.Z. entwickle ich einen Workaround: im NT-Parameterdialog gebe ich den Namen der Parameterdatei ein. In der OnStartUp-Methode lese ich dann den Parametersatz ein. Quote
ronner Posted December 20, 2010 Report Posted December 20, 2010 @Eddy, bitte sei so nett und zitiere nicht immer den kompletten Post des Vorredners - das bläht sonst zu sehr unnötig den Thread auf. Einfach den Text, den Du nicht brauchst zwischen den Klammern löschen. Thx Quote
DarthTrader Posted December 21, 2010 Report Posted December 21, 2010 @Eddy: Wenn es nur um Abhängigkeiten zwischen Parametern geht, kannst Du diese auch inden gettern der Properties verarbeiten. Ich mach das so, um Ranges von Parameterneinzugrenzen und je nach den Values von anderen Parametern zu berechnen. Quote
wh Posted December 21, 2010 Report Posted December 21, 2010 @Eddy Wie sieht es mit einem Timer aus, der alle Sekunde deine Form oder vice versa anspricht. Timer t1 = new Timer(); // Timer anlegen t1.Interval = 1000; // Intervall festlegen, hier 1000 ms t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird t1.Start(); // Timer starten void t1_Tick(object sender, EventArgs e) { // dieser Code wird ausgeführt, wenn der Timer abgelaufen ist } Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.