Jump to content
Tom Next - Daytrading Community

Managed vs. Unmanaged approach


Eddy

Recommended Posts

Ich stehe jetzt an einer Stelle, wo ich mich für einen Weg entscheiden sollte: managed vs. unmanaged approach. Mich würde interesieren, welchen Weg ihr gegangen seid und warum.

 

Auslöser ist folgende Anforderung:

Ich möchte den Bewegungshandel aus der Korrektur heraus handeln und dafür gestaffelte Orders absetzten. Im managed approach muss ich die Orders mit jedem neuen Bar neu absetzten. Im unmanaged approch bleiben sie stehen.

 

Im managed approach nimmt mir aber NinjaTrader eine Menge Arbeit ab. Speziell was die Vermeidung von 'nichtgewollten' Orders angeht. Das ist mit Sicherheit eine riesige Vereinfachung in der Programmierung.

 

Noch zwei Zusatzfragen:

1. Kann man eine StopBuy- und eine LimitBuy-Order als OCO Order sowohl im managed wie im unmanaged approach erzeugen?

2. Kann man im unmanaged approach eine "StopLoss"-Order erzeugen (macht man doch mit SellStop für Long-Orders, oder?) OHNE das die entsprechene Buy-Order vorhanden ist und was hätte das für folgen?

 

Eddy

Link to comment
Share on other sites

Hallo Eddy,

 

wie so oft, würde ich ganz klar sagen ... es kommt darauf an :-)

 

Einer der wichtigsten Punkte ist, dass du, egal bei welchem Ansatz, immer eigen IOrder-Objekte zu verwenden.

Nur hiermit erhältst du Zugriff auf die OrderStates, die im Live-Handel äußerst wichtig sind.

Gerade bei Scale-In oder Scale-Out Ansätzen solltest du pro Entry/Exit eigene Order verwalten.

 

 

Ich stehe jetzt an einer Stelle, wo ich mich für einen Weg entscheiden sollte: managed vs. unmanaged approach. Mich würde interesieren, welchen Weg ihr gegangen seid und warum.

Für Breakoutsystem funktioniert nur der Unmanaged-Approach, da dort oft parallele Stop-Orders im Markt liegen.

Für viele andere Ansätze nehme ich gern auch noch den Managed-Approach.

 

 

Auslöser ist folgende Anforderung:

Ich möchte den Bewegungshandel aus der Korrektur heraus handeln und dafür gestaffelte Orders absetzten. Im managed approach muss ich die Orders mit jedem neuen Bar neu absetzten. Im unmanaged approch bleiben sie stehen.

Das stimmt so nicht. Auch im Managed-Approach kannst du Orders über mehr als einen Bar im Markt halten:

Siehe Parameter 'liveUntilCancelled'

 

 

1. Kann man eine StopBuy- und eine LimitBuy-Order als OCO Order sowohl im managed wie im unmanaged approach erzeugen?

Nein. Im ManagedApproach hast du diese Möglichkeit, soweit ich weiß, nicht.

Aber vorsicht. OCOs werden je nach Broker lokal bei NT vorgehalten und eine Internet-Börsen-Verbindung ist zwinged notwendig.

 

 

2. Kann man im unmanaged approach eine "StopLoss"-Order erzeugen (macht man doch mit SellStop für Long-Orders, oder?) OHNE das die entsprechene Buy-Order vorhanden ist und was hätte das für folgen?

Im Unmanaged-Approach wird alles mit Submit-, Change-, oder CancelOrder programmiert. Mit Submit kannst du Sell-/Buy-Stops usw. setzen.

Es kommt dabei darauf an, auf welcher Marktseite der Kurs ist, sonst wird die Order Rejected. Ein StopLoss ohne Entry macht m.M. keinen

wirklichen Sinn. Bist du Long im Markt, kannst du einen StopLoss folgendermaßen absetzen:

 

IOrder stopOrder = SubmitOrder(0, OrderAction.Sell, OrderType.Stop, execution.Order.Filled, 0, stopLevel, "ocoName", "exitName");

 

Beste Grüße

Darth

  • Upvote 2
Link to comment
Share on other sites

wie so oft, würde ich ganz klar sagen ... es kommt darauf an :-) ...

Hallo DarthTrader,

danke für die Ausführungen. Ich denke auch, das der Unmanaged Approach der richtige Weg ist. Dann werde ich mich jetzt mal mit dem Orderhandling in meinem HS beschäftigen.

Link to comment
Share on other sites

Ich benötige nochmal Hilfe. Ist diese Vorgehensweise zum Erstellen / Vervollständigen eines StopLoss so richtig?

 

protected override void OnExecution(IExecution execution)
       {
		if (entryOrder != null && entryOrder.Token == execution.Order.Token)
		{
			// Order vollständig oder teilweise ausgeführt
			if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled)
			{
				// Order vollständig ausgeführt
				if (stopOrder == null && execution.Order.OrderState == OrderState.Filled)
				{
					stopOrder = SubmitOrder(0, OrderAction.Sell, OrderType.Stop, execution.Order.Filled, 0, stopLevel, "ocoName", "exitName");
					entryOrder 	= null;
					return;
				}
				
				// Order teilweise ausgeführt
				if (stopOrder == null && execution.Order.OrderState == OrderState.PartFilled)
				{
					stopOrder = SubmitOrder(0, OrderAction.Sell, OrderType.Stop, execution.Order.Filled, 0, stopLevel, "ocoName", "exitName");
					return;
				}
				
				// Nächste Teilausführung
				if (stopOrder != null)
				{
					ChangeOrder(stopOrder, stopOrder.Filled + execution.Order.Filled, 0, stopLevel);
					return;
				}
			}
		}
	}

Muss bei der ChangeOrder die Gesamtemenge oder die teilausgeführte Menge angegeben werden?

 

In welche Situation macht diese Abfrage Sinn?

 

execution.Order.OrderState == OrderState.Cancelled && execution.Order.Filled > 0)

Link to comment
Share on other sites

Sieht nicht so verkehrt aus :-)

 

NT empfiehlt wohl neben Filled und PartFilled noch auf den State Cancelled und Filled > 0 abzufragen.

Wahrscheinlich um auch im Overfill-Fall oder anderen Grenzfällen noch einen Stop oder ein Target

in den Markt legen zu können. Sehe gerade, das beantwortet deine Frage von unten :nictation:

 

Wenn Du erst den Fill / PartFilled-State abfragst und dann die Orders, hast du nur eine solche

Abfrage im Code und kannst dann die Stop/Targets usw. prüfen und ggf. setzen.

 

 if (entryOrder != null && entryOrder.Token == execution.Order.Token)
  ...
 if (stopOrder != null && stopOrder.Token == execution.Order.Token)
  ...

 

 

Des Weiteren brauchst du den OrderState.Filled nicht ein zweites Mal bei der StopOrder abfragen.

Die Ablaufgeschwindigkeit des Codes hier ist sehr wichtig, um nicht in merkwürdige Situationen reinzukommen,

in denen die MarketPosition o.ä. noch nicht aktuell sind.

 

 

// Nächste Teilausführung
if (stopOrder != null)
{
 ChangeOrder(stopOrder, stopOrder.Filled + execution.Order.Filled, 0, stopLevel);
 ...
}

Hier reicht execution.Order.Filled. NT kennt die StopOrder bereits und weist die restlichen Kontakte aut. zu.

 

 

Noch ein Tipp: So etwas kannst du sehr gut im MarketReplay nachstellen. Es gibt eine Option, die da heißt:

"Enforce Partial Fills", damit kannst du sehen, ob er in den Code reinläuft und dir die Anzahl der Kontrakte

gefillten Kontrakte und der Gesamtquantity ausgeben lassen.

 

 

Beste Grüße

DT

  • Upvote 1
Link to comment
Share on other sites

Wenn Du erst den Fill / PartFilled-State abfragst und dann die Orders, hast du nur eine solche

Abfrage im Code und kannst dann die Stop/Targets usw. prüfen und ggf. setzen.

Du meinst wahrscheinlich diese Abfrage:

 if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled || (execution.Order.OrderState == OrderState.Cancelled && execution.Order.Filled > 0))

Ich habe die Abfrage entzerrt, um sie erstmal besser zu verstehen.

 

Des Weiteren brauchst du den OrderState.Filled nicht ein zweites Mal bei der StopOrder abfragen.

 

Die erste Abfrage soll den StopLoss für den Fall erstellen, das die Order vollständig ausgeführt wird. (Da ich nicht unbedingt ein Fan von geschachtelten IF's bin, habe ich die zweite Abfrage ohne ELSE geschrieben. Dafür der RETURN im ersten Block. Muss man nicht mögen, aber ist halt mein Programmierstil.)

 

                                       // Order vollständig ausgeführt
                                       if (stopOrder == null && execution.Order.OrderState == OrderState.Filled)
                                       {
                                               stopOrder = SubmitOrder(0, OrderAction.Sell, OrderType.Stop, execution.Order.Filled, 0, stopLevel, "ocoName", "exitName");
                                               entryOrder      = null;
                                               return;
                                       }

 

Die zweiteAbfrage soll den StopLoss für den Fall erstellen, das für die Order die erste Teilausführung stattgefunden hat.

                                       // Order teilweise ausgeführt
                                       if (stopOrder == null && execution.Order.OrderState == OrderState.PartFilled)
                                       {
                                               stopOrder = SubmitOrder(0, OrderAction.Sell, OrderType.Stop, execution.Order.Filled, 0, stopLevel, "ocoName", "exitName");
                                               return;
                                       }

 

Die dritte Abfrage soll für alle weiteren Teilausführungen (2 .. n) die zu verkaufende Menge in der bestehenden Stop-Order erhöhen.

 

Hier reicht execution.Order.Filled. NT kennt die StopOrder bereits und weist die restlichen Kontakte aut. zu.

Was meinst du mit "die restlichen Kontakte". Wenn die Teilausführung noch nicht dazu geführt hat, das die Order vollständig gefilled wurde, muss ich dann nicht die teilausgeführte Anzahl verwenden um die Anzahl im Stop zu erhöhen?

 

Die Ablaufgeschwindigkeit des Codes hier ist sehr wichtig, um nicht in merkwürdige Situationen reinzukommen,

in denen die MarketPosition o.ä. noch nicht aktuell sind.

Kannst du das bitte etwas genauer beschreiben? Muss ich im Code die MarketPosition im Auge behalten?

 

 

Danke für den Tipp zum MarketReplay. Lade mir mal ein paar Videos dazu runter.

Eddy

Link to comment
Share on other sites

Was meinst du mit "die restlichen Kontakte". Wenn die Teilausführung noch nicht dazu geführt hat, das die Order vollständig gefilled wurde, muss ich dann nicht die teilausgeführte Anzahl verwenden um die Anzahl im Stop zu erhöhen?

Ich meine die Kontrakte, die bei Teilausführungen nachkommen, dass können ja 2-n weitere sein. Ich verwende nur execution.Order.Filled,

das funktioniert wunderbar. Aber wie schon erwähnt, im Replay-Modus kann man das vorzüglich nachstellen.

 

 

Kannst du das bitte etwas genauer beschreiben? Muss ich im Code die MarketPosition im Auge behalten?

Man soll generell nicht auf MarketPosition in der OnExecution-Methode-Abfragen. Das hatte ich anfangs mal drin, wurde aber eines besseren belehrt.

MarketPosition wird erst bei Aufruf von OnPositionUpdate aktualisiert und in schnellen Märkten mit vielen Kontrakten kann es dann zu Unstimmigkeiten kommen, gerade bei PartialFills.

 

 

Bitte halte mich auf dem Laufenden, wenn Dir noch was spezielles auffällt. Dieses Order-Handling bei NT ist manchmal für Überraschungen gut

und ich habe schon oft, auch erst Monate später Kleinigkeiten ändern müssen, da dann erst produktive Merkwürdigkeiten aufgetreten sind.

 

Interessant wird es auch, wenn du zur OnPositionChange-Methode kommst. Kann man, muss man aber nicht machen ... :guitar:

Link to comment
Share on other sites

Bitte halte mich auf dem Laufenden, wenn Dir noch was spezielles auffällt.

Mache ich.

 

Kann man eigentlich gleichzeitig Long und Short in einem Instrument aktiv sein. Z.B. möchte ich den Trend Long handeln, in der Korrektur im kleineren Timeframe aber einen Short-Ausbruch handeln? Oder gibt es hier grundsätzliche Probleme?

Link to comment
Share on other sites

Ich meine die Kontrakte, die bei Teilausführungen nachkommen, dass können ja 2-n weitere sein. Ich verwende nur execution.Order.Filled,

das funktioniert wunderbar. Aber wie schon erwähnt, im Replay-Modus kann man das vorzüglich nachstellen.

Kann ich jetzt auch bestätigen. Im Log und in der Performance-Übersicht sieht man dann schön, wie Partfill abgearbeitet wird. Das hilft in der Tat.

 

Leider habe ich auch noch keine Möglichkeit gefunden, Overfill-Situationen zu erzeugen.

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