Beispiel #1
0
        public bool TryAddTradingNode(TradingNode tradingNode)
        {
            bool isSuccess = false;

            switch (tradingNode.TradeSide)
            {
            case TradeSide.Unknown:
                break;

            case TradeSide.Buy:
                if (m_WorkingBuyNodes.ContainsKey(tradingNode.TradeLevel))
                {
                    m_WorkingBuyNodes[tradingNode.TradeLevel] = tradingNode;
                }
                else
                {
                    m_WorkingBuyNodes.Add(tradingNode.TradeLevel, tradingNode);
                }
                isSuccess = true;
                break;

            case TradeSide.Sell:
                if (m_WorkingSellNodes.ContainsKey(tradingNode.TradeLevel))
                {
                    m_WorkingSellNodes[tradingNode.TradeLevel] = tradingNode;
                }
                else
                {
                    m_WorkingSellNodes.Add(tradingNode.TradeLevel, tradingNode);
                }
                isSuccess = true;
                break;
            }
            return(isSuccess);
        }
Beispiel #2
0
        public virtual void AddSubElement(IStringifiable subElement)
        {
            Type elementType = subElement.GetType();

            if (elementType == typeof(TradingNode))
            {
                TradingNode tradingNode = (TradingNode)subElement;
                this.TryAddTradingNode(tradingNode);
            }
        }
Beispiel #3
0
        protected bool TryGetValidSells(out double minPrice, out int sellQty)
        {
            sellQty  = 0;
            minPrice = double.NaN;
            TradingNode node = null;

            int buyLevel  = m_WorkingBuyNodes.Count - 1;
            int sellLevel = 0;

            while (buyLevel >= 0 && double.IsNaN(minPrice))
            {
                node = m_WorkingBuyNodes[buyLevel];
                if (node.WorkingExitQty > 0)
                {
                    minPrice = node.WorkingStopProfitPrice;
                    sellQty  = node.WorkingExitQty;
                    m_CurrentSellNodes.Add(node);
                }
                buyLevel--;
            }
            if (double.IsNaN(minPrice))
            {
                while (sellLevel < m_WorkingSellNodes.Count && double.IsNaN(minPrice))
                {
                    node = m_WorkingSellNodes[sellLevel];
                    if (node.IsEnterEnable && node.WorkingEnterQty > 0)
                    {
                        minPrice = node.WorkingEnterPrice;
                        sellQty  = node.WorkingEnterQty;
                        m_CurrentSellNodes.Add(node);
                    }
                    sellLevel++;
                }
                while (sellLevel < m_WorkingSellNodes.Count)
                {
                    node = m_WorkingSellNodes[sellLevel];
                    if (node.IsEnterEnable && node.WorkingEnterQty > 0 && node.WorkingEnterPrice < minPrice)
                    {
                        m_CurrentSellNodes.Clear();
                        minPrice = node.WorkingEnterPrice;
                        sellQty  = node.WorkingEnterQty;
                        m_CurrentSellNodes.Add(node);
                    }
                    else if (node.IsEnterEnable && node.WorkingEnterQty > 0 && node.WorkingEnterPrice == minPrice)
                    {
                        sellQty += node.WorkingEnterQty;
                        m_CurrentSellNodes.Add(node);
                    }
                    sellLevel++;
                }
            }
            else
            {
                while (buyLevel >= 0)
                {
                    node = m_WorkingBuyNodes[buyLevel];
                    if (node.WorkingExitQty > 0 && node.WorkingStopProfitPrice < minPrice)
                    {
                        m_CurrentSellNodes.Clear();
                        minPrice = node.WorkingStopProfitPrice;
                        sellQty  = node.WorkingExitQty;
                        m_CurrentSellNodes.Add(node);
                    }
                    else if (node.WorkingExitQty > 0 && node.WorkingStopProfitPrice == minPrice)
                    {
                        sellQty += node.WorkingExitQty;
                        m_CurrentSellNodes.Add(node);
                    }
                    buyLevel--;
                }
                while (sellLevel < m_WorkingSellNodes.Count)
                {
                    node = m_WorkingSellNodes[sellLevel];
                    if (node.IsEnterEnable && node.WorkingEnterQty > 0 && node.WorkingEnterPrice < minPrice)
                    {
                        m_CurrentSellNodes.Clear();
                        minPrice = node.WorkingEnterPrice;
                        sellQty  = node.WorkingEnterQty;
                        m_CurrentSellNodes.Add(node);
                    }
                    else if (node.IsEnterEnable && node.WorkingEnterQty > 0 && node.WorkingEnterPrice == minPrice)
                    {
                        sellQty += node.WorkingEnterQty;
                        m_CurrentSellNodes.Add(node);
                    }
                    sellLevel++;
                }
            }
            return(!double.IsNaN(minPrice) && sellQty > 0);
        }
Beispiel #4
0
        public void TryProcessFills(UV.Lib.Fills.Fill fill)
        {
            int filledQty = fill.Qty;

            m_NetPosition += filledQty;
            Log.NewEntry(LogLevel.Minor, "****Filled {0} @ {1} at {2}. Start Level:{3} / {4} Net Position:{5}****", filledQty, fill.Price, fill.LocalTime, m_CurrentBuyNodes.Count, m_CurrentSellNodes.Count, m_NetPosition);
            Log.NewEntry(LogLevel.Minor, "Start : {0}", DumpCurrentNodesInfo());
            TradeSide   tradeSide    = (filledQty > 0) ? TradeSide.Buy : TradeSide.Sell;
            int         absFilledQty = Math.Abs(filledQty);
            TradingNode tradingNode  = null;

            if (filledQty > 0)
            {
                int buyLevel = m_CurrentBuyNodes.Count - 1;
                while (absFilledQty > 0 && buyLevel >= 0)
                {
                    tradingNode = m_CurrentBuyNodes[buyLevel];
                    switch (tradingNode.TradeSide)
                    {
                    case TradeSide.Unknown:
                        break;

                    case TradeSide.Buy:
                        if (tradingNode.WorkingEnterQty >= absFilledQty)
                        {
                            tradingNode.WorkingExitQty  += absFilledQty;
                            tradingNode.WorkingEnterQty -= absFilledQty;
                            absFilledQty = 0;
                        }
                        else
                        {
                            tradingNode.WorkingExitQty += tradingNode.WorkingEnterQty;
                            absFilledQty -= tradingNode.WorkingEnterQty;
                            tradingNode.WorkingEnterQty = 0;
                        }
                        break;

                    case TradeSide.Sell:
                        if (tradingNode.WorkingExitQty >= absFilledQty)
                        {
                            tradingNode.WorkingEnterQty += absFilledQty;
                            tradingNode.WorkingExitQty  -= absFilledQty;
                            absFilledQty = 0;
                        }
                        else
                        {
                            absFilledQty -= tradingNode.WorkingExitQty;
                            tradingNode.WorkingEnterQty += tradingNode.WorkingExitQty;
                            tradingNode.WorkingExitQty   = 0;
                        }
                        break;
                    }
                    buyLevel--;
                }
            }
            else
            {
                int sellLevel = m_CurrentSellNodes.Count - 1;
                while (absFilledQty > 0 && sellLevel >= 0)
                {
                    tradingNode = m_CurrentSellNodes[sellLevel];
                    switch (tradingNode.TradeSide)
                    {
                    case TradeSide.Unknown:
                        break;

                    case TradeSide.Buy:
                        if (tradingNode.WorkingExitQty >= absFilledQty)
                        {
                            tradingNode.WorkingEnterQty += absFilledQty;
                            tradingNode.WorkingExitQty  -= absFilledQty;
                            absFilledQty = 0;
                        }
                        else
                        {
                            absFilledQty -= tradingNode.WorkingExitQty;
                            tradingNode.WorkingEnterQty += tradingNode.WorkingExitQty;
                            tradingNode.WorkingExitQty   = 0;
                        }
                        break;

                    case TradeSide.Sell:
                        if (tradingNode.WorkingEnterQty >= absFilledQty)
                        {
                            tradingNode.WorkingExitQty  += absFilledQty;
                            tradingNode.WorkingEnterQty -= absFilledQty;
                            absFilledQty = 0;
                        }
                        else
                        {
                            tradingNode.WorkingExitQty += tradingNode.WorkingEnterQty;
                            absFilledQty -= tradingNode.WorkingEnterQty;
                            tradingNode.WorkingEnterQty = 0;
                        }
                        break;
                    }
                    sellLevel--;
                }
            }
            if (absFilledQty > 0)
            {
                Log.NewEntry(LogLevel.Minor, "There is overfill at {0} @ {1}", absFilledQty, tradeSide);
                switch (tradeSide)
                {
                case TradeSide.Unknown:
                    break;

                case TradeSide.Buy:
                    break;

                case TradeSide.Sell:
                    break;
                }
            }
            Log.NewEntry(LogLevel.Minor, "End : {0}", DumpCurrentNodesInfo());
        }