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?
Ich arbeite mich gerade in das Orderhandlimg anhand der Beispielstrategie "SampleOnOrderUpdate" ein.
Hier wird eine Order angelegt mit
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