public ParentOrder(int ID, string symbol, double openQty, Algo algo, double?cash = null) { this.ID = ID; this.Symbol = symbol; this.InitialQty = openQty; this.Algo = algo; this.AvailableCash = cash; Qty = openQty; this.IsActive = true; TradeOrders = new List <TradeOrder>(); }
public ParentOrder CreateParentOrder(string symbol, double openQty, Algo algo) { int id = -1; do { id = new Random().Next(1000 * 1000); } while (Parent_Child_Order_Map.ContainsKey(id)); ParentOrder parentOrder = new ParentOrder(id, symbol, openQty, algo); Log.Info(string.Format("ParentOrder {0} is created, symbol {1}", id, symbol)); return(parentOrder); }
private void HandleTradeExecution(TradeExecution tradeExec) { if (ContainExeution(tradeExec)) { Log.Info(string.Format("Received duplicated Execution, ID: {0}, Side: {1}, Qty: {2}, Price: {3}", tradeExec.ExecID, tradeExec.Side, tradeExec.Shares, tradeExec.Price)); return; } lock (locker) { Algo.HandleExecutionMsg(this, tradeExec); Executions.Add(tradeExec); if (tradeExec.Side == Constant.ExecutionBuy) { Qty += tradeExec.Shares; } else if (tradeExec.Side == Constant.ExecutionSell) { Qty -= tradeExec.Shares; } } }
internal void Eval() { lock (locker) { /* * 1. On waking up, check if last open orders has been filled on canclled. * 2. if none of order filled or cancelled then sleep again * 3. else cancel all op * * */ //if(lastSendOrders.Count==0 && this.Qty == this.InitialQty) if (lastSendOrders.Count == 0 && GetOpenOrders().Count == 0) { try { List <TradeOrder> orders = Algo.Eval(this); lastSendOrders.AddRange(orders); } catch (Exception ex) { Log.Error(ex.Message); Log.Error(ex.StackTrace); } return; } bool changed = false; if (lastSendOrders.Count > 0) { foreach (var order in lastSendOrders) { if (TradeManager.Instance.Broker == Broker.TD) { TDOrder tdOrder = TradeManager.Instance.GetTDOrderById(order.OrderID); if (tdOrder != null) { //TODO: update tradeOrder status -- refer handle order status msg UpdateTDOrderStatus(tdOrder); //TODO: check if there is new execution List <TradeExecution> executions = TradeManager.Instance.GetTDTradeExecution(tdOrder); List <TradeExecution> newExecutions = FindNewExecutions(executions, order); if (newExecutions.Count > 0) { foreach (var exec in newExecutions) { HandleTradeExecution(exec); } } } } if (order.Status == TradeOrderStatus.Filled || order.Status == TradeOrderStatus.Cancelled) { changed = true; Log.Info("Order status changed, start cancel open orders!"); break; } } } if (changed) { try { //cancel all open orders, synchronized call, wait for cancel event back var openOrders = GetOpenOrders(); if (openOrders.Count > 0) { TradeManager.Instance.CancelOrders(openOrders); //wait for cancel back Thread.Sleep(1000); if (TradeManager.Instance.Broker == Broker.TD) { //update cancel order status here. foreach (var order in openOrders) { TDOrder tdOrder = TradeManager.Instance.GetTDOrderById(order.OrderID); if (tdOrder != null) { UpdateTDOrderStatus(tdOrder); } } } } lastSendOrders.Clear(); //place buy and sell order List <TradeOrder> orders = Algo.Eval(this); lastSendOrders.AddRange(orders); } catch (Exception ex) { Log.Error(ex.Message); Log.Error(ex.StackTrace); } } } }