Alle Inhalte von Eddy
-
Markttechnisches Handelssystem programmieren
Vor einiger Zeit hatte ich mal geschrieben, das ich ein (vollautomatisches) Handelssystem, das nach Markttechnik arbeitet, entwickeln möchte. Die generelle Schwierigkeit Markttechnik zu programmieren liegt m.M.n. in der Erkennung der 123's. Lt. Voigt sollten nur sogenannte 5 Sterne Setups gehandelt werden. Als besondere Herausforderung empfinde ich die Erkennung der 123's, die die Basis der 5 Sterne Setups darstellen. Nach vielen Wochen (oder waren es Monate) in meinem Programmierkeller (leider bin ich kein Super-Programmierer) habe ich nun eine erste Version, über die die 123-Erkennung durchgeführt wird. Die 123-Erkennung kann über verschiedene Parameter beeinflußt werden. Z.B. Anzahl Bars zur Erkennung eines P2 bzw. P3 Sollen Insidebars ignoriert werden, Wie stehen High/Low des aktuellen Bars zum High/Low des vorherigen Bars Wie stehen Open/Close des aktuellen Bars zum High/Low des aktuellen Bars Gibt es hier im Forum Interesse an einem Ideenaustausch? Gerne stelle ich dann auch die DLL zum experimentieren bereit. Ich würde mich freuen, wenn Interesse besteht. Jedoch möchte ich nicht über Sinn/Unsinn von Markttechnik diskuttieren. Damit sind andere Foren schon voll. Mein System habe ich in C# unter Visual Studio programmiert. Es wird als DLL in ein NinjaTrader-Script eingebunden. Zum Testen kann das System aber auch außerhalb von NinjaTrader benutzt werden. Die Kursdaten werden dann über eine Textdatei (im NT-Format) eingelesen. Eddy
-
Problem: Indikatoren nur vorwärts berechenbar
Hallo Johannes, versuche mal: double value = MIN(Low, 10)[0]; Low[0] == aktueller Bar Low[1] == vorherige Bar ... Eddy
-
Debuggen mit SharpDevelop
"Irgendjemand" ist NinjaTrader. Obwohl ich NT normal beendet habe, ist der Prozess noch aktiv gewesen. Erst das Beenden im Taskmanager hat die DLL wieder freigegeben. Bleibt nur die Frage: warum hat sie NT nicht sauber beendet? Nachtrag: ich habe den Debug-Prozess in SharpDevelop terminiert und anschließend NT beendet. Der NT-Prozess bleibt aber weiterhin aktiv.
-
Debuggen mit SharpDevelop
Das Problem hat sich wohl aufgelöst. Nachdem ich meine DLLs nicht mehr in das NT-Custom-Verzeichnis kopieren konnte (waren von Irgendjemanden belegt, obwohl keine Anwendung mehr gestartet war), habe ich zwangsläufing mein System neu gestartet. Und siehe da, jetzt funktioniert auch das debuggen innerhalb meiner DLL. Super Teil das SharpDevelop .
-
Debuggen mit SharpDevelop
Ich habe mir mal SharpDevelop zum Testen von NT Scripts angeschaut. Es funktionert sehr gut. Leider habe ich ein Problem beim debuggen von Methoden, die in einer von mir in C# geschriebenen DLL liegen. Ich kann zwar durch das NT Script schrittweise debuggen. Wenn ich aber eine Methode aus der DLL aufrufe, sehe ich nicht den Source-Code dieser Methode. Ich habe dem Testprojekt das DLL-Projekt über 'Add Reference / Projects' zugeordnet. Kennt jemand einen Weg, wie man die aufgerufende DLL debuggen kann? Oder geht da nur mit Visual Studio? Danke, Eddy.
-
Neujahrs-NT-Crash ?
@ronner Also ich hatte keine Schwierigkeiten beim Starten von NT. Allerdings musste ich NT häufiger runterfahren, da ich DLLs einbinde und diese erst nach einem Neustart aktiv sind. Vielleicht habe ich die Probleme somit gar nicht mitbekommen.
-
Guten Rutsch ins neue...
Auch von mir ein gesundes neues Jahr. Eddy
-
Dataseries an einen Indikator übergeben
Ich habe eine Lösung gefunden. Muss allerdings noch prüfen, ob es irgendwelche Probleme damit gibt. protected override void OnBarUpdate() { bool doI123B = true;; if (doI123B) { i123B = I123(Inputs[1], 2); doI123B = false; }
-
Dataseries an einen Indikator übergeben
Ich möchte in einer Strategie zwei Timeframes nutzten, wobei jeder Timeframe einem Indikator zugeordnet werden soll. Ich bekomme das nicht hin. Hier ein kurzes Beispiel: Der Indikator heißt I123. dataseries_2 soll die 60 Min. Periode sein. Hierfür habe ich Inputs[0] bzw. Inputs[1] probiert. Der Chart ist ein 10 Min. Chart. protected override void Initialize() { Add(PeriodType.Minute, 60); I123 i123A = I123(1); I123 i123B = I123(dataseries_2, 2); ... Im Indikator drucke ich die Periode mit Print ("TF: " + tf + " / BarsPeriod.BasePeriodType: " + BarsPeriod.BasePeriodType + " / BarsPeriod.Value: " + BarsPeriod.Value); Inputs[0] und Inputs[1] als Parameter liefern die Ausgabe: TF: 1 / BarsPeriod.BasePeriodType: Minute / BarsPeriod.Value: 10 TF: 2 / BarsPeriod.BasePeriodType: Minute / BarsPeriod.Value: 10 Hat jemand eine Idee wie man das Problem löst? Eddy
-
Modale Form
@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.
- Modale Form
-
Modale Form
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.
-
Modale Form
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.
-
Modale Form
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.
-
Modale Form
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.
-
Modale Form
Hallo Roy, ES FUNKTIONIERT SO. Danke für diesen Tipp. Eddy
- Modale Form
-
Modale Form
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?
-
Modale Form
Leider funktioniert die Lösung doch nicht. :gum:
-
Modale Form
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();
-
Modale Form
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;
-
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
-
Orderhandling
Vielen Dank für die Info. Dein Blog ist auch sehr interessant. Eddy
-
Orderhandling
Das verstehe ich nicht ganz. Warum muss ich mit CancelOrder(targetOrder) die Order löschen, wenn doch das System die Orders intern managed?
-
Orderhandling
Ich arbeite mich gerade in das Orderhandlimg anhand der Beispielstrategie "SampleOnOrderUpdate" ein. Hier wird eine Order angelegt mit 'entryOrder = EnterLong(1, "MyEntry"); Eine Stop- und Target-Order werden angelegt mit: protected override void OnExecution(IExecution execution) { /* We advise monitoring OnExecution to trigger submission of stop/target orders instead of OnOrderUpdate() since OnExecution() is called after OnOrderUpdate() which ensures your strategy has received the execution which is used for internal signal tracking. */ if (entryOrder != null && entryOrder.Token == execution.Order.Token) { if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled || (execution.Order.OrderState == OrderState.Cancelled && execution.Order.Filled > 0)) { // Stop-Loss order 4 ticks below our entry price stopOrder = ExitLongStop(0, true, execution.Order.Filled, execution.Order.AvgFillPrice - 4 * TickSize, "MyStop", "MyEntry"); // Target order 8 ticks above our entry price targetOrder = ExitLongLimit(0, true, execution.Order.Filled, execution.Order.AvgFillPrice + 8 * TickSize, "MyTarget", "MyEntry"); // Resets the entryOrder object to null after the order has been filled or partially filled if (execution.Order.OrderState != OrderState.PartFilled) { entryOrder = null; } } } // Reset our stop order and target orders' IOrder objects after our position is closed. if ((stopOrder != null && stopOrder.Token == execution.Order.Token) || (targetOrder != null && targetOrder.Token == execution.Order.Token)) { if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled) { stopOrder = null; targetOrder = null; } } } Wenn die Entry-Order ausgeführt wird, erscheint im NT-ControlCenter unter State der Status 'Filled' und kurz danach die Stop- und die Target Order. Die Stop-Order hat den Status 'Accepted', die Target-Order den Status 'Working'. Soweit habe ich das verstanden. Unklar ist mir aber noch: 1. Wenn jetzt eine der beiden Orders ausgeführt wird, wird die andere automatisch gelöscht, obwohl sie nicht als OCO-Order (im NT-ControlCenter) markiert wurden. Ist das immer so (im 'Advanced Order Handling') oder passiert das nur unter bestimmten Bedingungen? Wenn man eine SetStopLoss-Order (entspricht ExitLongStop) und eine SetProfitTarget-Order (entspricht ExitLongLimit) auf die gleiche Entry-Order absetzt, werden sie als OCO-Order ins System gestellt. 2. Kann man im 'Advanced Order Handling' überhaupt OCO-Orders erzeugen? Eddy