/// <summary> /// Updates the specified order in the brokerage until it fills or reaches a timeout /// </summary> /// <param name="order">The order to be modified</param> /// <param name="parameters">The order test parameters that define how to modify the order</param> /// <param name="secondsTimeout">Maximum amount of time to wait until the order fills</param> protected void ModifyOrderUntilFilled(Order order, OrderTestParameters parameters, double secondsTimeout = 90) { if (order.Status == OrderStatus.Filled) { return; } var filledResetEvent = new ManualResetEvent(false); EventHandler<OrderEvent> brokerageOnOrderStatusChanged = (sender, args) => { if (args.Status == OrderStatus.Filled) { filledResetEvent.Set(); } if (args.Status == OrderStatus.Canceled || args.Status == OrderStatus.Invalid) { Log.Trace("ModifyOrderUntilFilled(): " + order); Assert.Fail("Unexpected order status: " + args.Status); } }; Brokerage.OrderStatusChanged += brokerageOnOrderStatusChanged; Log.Trace(""); Log.Trace("MODIFY UNTIL FILLED: " + order); Log.Trace(""); var stopwatch = Stopwatch.StartNew(); while (!filledResetEvent.WaitOne(3000) && stopwatch.Elapsed.TotalSeconds < secondsTimeout) { filledResetEvent.Reset(); if (order.Status == OrderStatus.PartiallyFilled) continue; var marketPrice = GetAskPrice(order.Symbol, order.SecurityType); Log.Trace("BrokerageTests.ModifyOrderUntilFilled(): Ask: " + marketPrice); var updateOrder = parameters.ModifyOrderToFill(Brokerage, order, marketPrice); if (updateOrder) { if (order.Status == OrderStatus.Filled) break; Log.Trace("BrokerageTests.ModifyOrderUntilFilled(): " + order); if (!Brokerage.UpdateOrder(order)) { Assert.Fail("Brokerage failed to update the order"); } } } Brokerage.OrderStatusChanged -= brokerageOnOrderStatusChanged; }
public void ShortFromLong(OrderTestParameters parameters) { Log.Trace(""); Log.Trace("SHORT FROM LONG"); Log.Trace(""); // first go long PlaceOrderWaitForStatus(parameters.CreateLongMarketOrder(GetDefaultQuantity())); // now go net short var order = PlaceOrderWaitForStatus(parameters.CreateShortOrder(2 * GetDefaultQuantity()), parameters.ExpectedStatus); if (parameters.ModifyUntilFilled) { ModifyOrderUntilFilled(order, parameters); } }
public void ShortFromZero(OrderTestParameters parameters) { Log.Trace(""); Log.Trace("SHORT FROM ZERO"); Log.Trace(""); PlaceOrderWaitForStatus(parameters.CreateShortOrder(GetDefaultQuantity()), parameters.ExpectedStatus); }
public void LongFromZero(OrderTestParameters parameters) { Log.Trace(""); Log.Trace("LONG FROM ZERO"); Log.Trace(""); PlaceOrderWaitForStatus(parameters.CreateLongOrder(GetDefaultQuantity()), parameters.ExpectedStatus); }
public void LongFromShort(OrderTestParameters parameters) { Log.Trace(""); Log.Trace("LONG FROM SHORT"); Log.Trace(""); // first fo short PlaceOrderWaitForStatus(parameters.CreateShortMarketOrder(-GetDefaultQuantity()), OrderStatus.Filled); // now go long var order = PlaceOrderWaitForStatus(parameters.CreateLongOrder(2 * GetDefaultQuantity()), parameters.ExpectedStatus); if (parameters.ModifyUntilFilled) { ModifyOrderUntilFilled(order, parameters); } }
public void CloseFromShort(OrderTestParameters parameters) { Log.Trace(""); Log.Trace("CLOSE FROM SHORT"); Log.Trace(""); // first go short PlaceOrderWaitForStatus(parameters.CreateShortMarketOrder(GetDefaultQuantity()), OrderStatus.Filled); // now close it PlaceOrderWaitForStatus(parameters.CreateLongOrder(GetDefaultQuantity()), parameters.ExpectedStatus); }
public void CloseFromLong(OrderTestParameters parameters) { Log.Trace(""); Log.Trace("CLOSE FROM LONG"); Log.Trace(""); // first go long PlaceOrderWaitForStatus(parameters.CreateLongMarketOrder(1), OrderStatus.Filled); // now close it PlaceOrderWaitForStatus(parameters.CreateShortOrder(1), parameters.ExpectedStatus); }
public virtual void CancelOrders(OrderTestParameters parameters) { const int secondsTimeout = 20; Log.Trace(""); Log.Trace("CANCEL ORDERS"); Log.Trace(""); var order = PlaceOrderWaitForStatus(parameters.CreateLongOrder(GetDefaultQuantity()), parameters.ExpectedStatus); var canceledOrderStatusEvent = new ManualResetEvent(false); EventHandler <OrderEvent> orderStatusCallback = (sender, fill) => { if (fill.Status == OrderStatus.Canceled) { canceledOrderStatusEvent.Set(); } }; Brokerage.OrderStatusChanged += orderStatusCallback; var cancelResult = false; try { cancelResult = Brokerage.CancelOrder(order); } catch (Exception exception) { Log.Error(exception); } Assert.AreEqual(IsCancelAsync() || parameters.ExpectedCancellationResult, cancelResult); if (parameters.ExpectedCancellationResult) { // We expect the OrderStatus.Canceled event canceledOrderStatusEvent.WaitOneAssertFail(1000 * secondsTimeout, "Order timedout to cancel"); } var openOrders = Brokerage.GetOpenOrders(); var cancelledOrder = openOrders.FirstOrDefault(x => x.Id == order.Id); Assert.IsNull(cancelledOrder); canceledOrderStatusEvent.Reset(); var cancelResultSecondTime = false; try { cancelResultSecondTime = Brokerage.CancelOrder(order); } catch (Exception exception) { Log.Error(exception); } Assert.AreEqual(IsCancelAsync(), cancelResultSecondTime); // We do NOT expect the OrderStatus.Canceled event Assert.IsFalse(canceledOrderStatusEvent.WaitOne(new TimeSpan(0, 0, 10))); Brokerage.OrderStatusChanged -= orderStatusCallback; }