Exemplo n.º 1
0
        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>();
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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;
                }
            }
        }
Exemplo n.º 4
0
        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);
                    }
                }
            }
        }