private bool ProcessLimitOrder(Order order, MarketDataPoint currentMarketDataPoint) { Log.Debug($"Processing limit order {order}"); var orderProcessed = false; switch (order.Side) { case OrderSide.Buy: if (order.Price >= currentMarketDataPoint.Price) { if (Portfolio.UnfreezeSecurity(order.BaseCurrency, order.Volume * order.Price * (1 + _TradeFee)) && Portfolio.RemoveSecurity(order.BaseCurrency, order.Volume * currentMarketDataPoint.Price * (1 + _TradeFee))) { Portfolio.AddSecurity(order.Security, order.Volume); orderProcessed = true; } } break; case OrderSide.Sell: if (order.Price <= currentMarketDataPoint.Price) { if (Portfolio.UnfreezeSecurity(order.Security, order.Volume) && Portfolio.RemoveSecurity(order.Security, order.Volume)) { var transactionAmount = order.Volume * currentMarketDataPoint.Price * (1 - _TradeFee); Portfolio.AddSecurity(order.BaseCurrency, transactionAmount); orderProcessed = true; } } break; } if (orderProcessed) { Log.Debug($"Limit order processed"); _PendingOrders.Remove(order); OnTradeExecuted(new Trade() { Timestamp = currentMarketDataPoint.Timestamp, Order = order, ExecutionPrice = currentMarketDataPoint.Price, ExecutionVolume = order.Volume }); } else { Log.Warn($"Cannot place order: {order.ToFormattedString()}"); } return(orderProcessed); }
private Order ProcessMarketOrder(Order order, MarketDataPoint currentMarketDataPoint) { Log.Debug($"Processed market order {order}"); var orderProcessed = false; switch (order.Side) { case OrderSide.Buy: if (Portfolio.RemoveSecurity(order.BaseCurrency, order.Volume * currentMarketDataPoint.Price * (1 + _TradeFee))) { Portfolio.AddSecurity(order.Security, order.Volume); orderProcessed = true; } break; case OrderSide.Sell: if (Portfolio.RemoveSecurity(order.Security, order.Volume)) { Portfolio.AddSecurity(order.BaseCurrency, order.Volume * currentMarketDataPoint.Price * (1 - _TradeFee)); orderProcessed = true; } break; } if (orderProcessed) { Log.Debug($"Market order processed"); OnTradeExecuted(new Trade() { Timestamp = currentMarketDataPoint.Timestamp, Order = order, ExecutionPrice = currentMarketDataPoint.Price, ExecutionVolume = order.Volume }); return(order); } else { Log.Warn($"Unable to place order: {order.ToFormattedString()}"); return(null); } }
public void OpenOrder_LimitOrder() { var startingPortfolio = new Portfolio(); startingPortfolio.AddSecurity("USD", 1000m); var market = new HistoricalMarket(TimeSpan.FromHours(1), startingPortfolio, 0); GenerateConstantDataCsv("test.csv", 100, 100, TimeSpan.FromHours(1)); market.LoadDataFromCsv("test.csv", "SPX", "USD"); market.Tick(); market.OpenOrder(new Order() { BaseCurrency = "USD", Price = 100, Security = "SPX", Side = OrderSide.Buy, Type = OrderType.LimitOrder, Volume = 1 }); }