Skip to content
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Modale Form

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

Featured Replies

 

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

  • Author

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;

  • Author

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

  • Author
Leider funktioniert die Lösung doch nicht. :gum: :gum:
  • Author

 

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?

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?

  • Author

Hasst dus schon mal im Ninja-Support Forum gefragt?

 

Gerade gemacht.

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.

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

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

  • Author

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

  • Author

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:

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
}

  • Author

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.

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?

  • Author

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.

if(!historical)

 

könnte da vielleicht helfen und update on bar close = false.

 

Oder mußt du jeden Tick verarbeiten ...

  • Author

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.

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

@Eddy: Wenn es nur um Abhängigkeiten zwischen Parametern geht, kannst Du diese auch in

den gettern der Properties verarbeiten. Ich mach das so, um Ranges von Parametern

einzugrenzen und je nach den Values von anderen Parametern zu berechnen.

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

  • Author

@DarthTrader

Das habe ich bisher auch so gemacht. Aber die Parameterliste wird immer länger. Und damit unhandlicher.

 

Wie ich schon gesagt habe, möchte ich ein HS entwickeln, das auf der Markttechnik basiert. Eine Handelsentscheidung in einem Timeframe muss immer im übergeordeneten TF bestätigt werden. Das Nachziehen des StoppLoss, ggfs. auch der Initial-SL, soll im untergeordneten TF durchgeführt werden. Ich muss also für alle 3 TFs die 123-Erkennung durchführen. Grundsätzlich kann ich in allen TF dafür die gleichen Parameter benutzten. Ich möchte aber mit unterschiedlichen Parametern experimentieren. Ob das was bringt, weiss ich aber auch noch nicht.

 

Mittlerweile glaube ich aber, dass es ist sinnvoller ist, die Erfassung der Parametersätzte außerhalb von NT durchzuführen und dem HS bzw. Indikator nur die Namen der zu verwendenden Parametersätze über die Properties mitzugeben. In der OnStartUp-Methode werden dann die entsprechenden Parametersätze eingelesen und an die Indiaktoren übergeben.

 

@wh

Der Vorschlag ist gut, wenn man zur Laufzeit des HS/Indikators die Parameter verändern möchte. In meinem Fall sind die Parameter aber statisch.

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

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.