Jump to content
Tom Next - Daytrading Community

Modale Form


Eddy

Recommended Posts

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

Link to comment
Share on other sites

 

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);

Link to comment
Share on other sites

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;

Link to comment
Share on other sites

 

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?

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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 BMT

wenden. Ich denke da wird Dir mehr geholfen als im Ninja Support Forum. Die Sache ist nicht

schwer umzusetzen.

 

Visual Studio 2008

Integration von Ninja

und du kannst mit C#

als alter Java-User

machen, was Du möchtest.

 

Beispiele gibt es ja genug im Netz. Vielleicht hilft es auch, wenn man ein Thema ein wenig mehr

spezifiziert bzw. ein abstraktes Bild schafft.

  • Upvote 2
Link to comment
Share on other sites

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);

  • Upvote 1
Link to comment
Share on other sites

Bin mir da auch nicht sicher, aber Parent in diesem Fall ist dein Chart aus dem Du die

Strategie 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

  • Upvote 1
Link to comment
Share on other sites

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. :good2:

 

Danke für diesen Tipp.

 

Eddy

Link to comment
Share on other sites

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. :gum:

Link to comment
Share on other sites

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. :gum:

 

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
}

Link to comment
Share on other sites

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 nicht

mehr 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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

@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
}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...