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); }
public virtual void AddSubElement(IStringifiable subElement) { Type elementType = subElement.GetType(); if (elementType == typeof(TradingNode)) { TradingNode tradingNode = (TradingNode)subElement; this.TryAddTradingNode(tradingNode); } }
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); }
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()); }