private void HandleSellExecution(ParentOrder parentOrder, TradeExecution execution) { TradeOrder order = parentOrder.GetChildOrderByID(execution.OrderID); if (order == null) { Log.Error(string.Format("Cannot find trade order, orderID: {0}", execution.OrderID)); } else { if (string.IsNullOrWhiteSpace(order.Notes)) { Log.Warn("HandleSellExecution error. Cannot resolve execution level due to emtpy order notes"); } else { int exeLevel = int.Parse(order.Notes); TradeMap[exeLevel].CurrentQty -= execution.Shares; if (TradeMap[exeLevel].CurrentQty < 0) { //should not hit here Log.Error(string.Format("Negative CurrentQty detected. level: {0}, qty: {1}", exeLevel, TradeMap[exeLevel].CurrentQty)); } if (TradeMap[exeLevel].CurrentQty <= 0) { if (TradeMap.ContainsKey(CurrentLevel)) { TradeMap[CurrentLevel].WasFilledSellOnPartial = false; TradeMap[CurrentLevel].LastBuyPrice = 0; } CurrentLevel--; //TradeMap.Remove(CurrentLevel); //for (int i = CurrentLevel + 1; i <= ScaleLevel; i++) //{ // if (TradeMap.ContainsKey(i)) TradeMap.Remove(i); //} //if (CurrentLevel >= 0) //{ // GenerateTradeMapNextLevel(TradeMap[CurrentLevel].LastBuyPrice); //} } } Log.Info("After sld execution." + Util.PrintTradeMapCurrLvl(this)); } }
private void HandleBuyExecution(ParentOrder parentOrder, TradeExecution execution) { /* * check if buy execution create new tradeMap entry * 1.curr level =-1; * 2. Curre level filled and next level exist * 3. curr level partial filled but wasfilled and next level exist * 4. curr level is zero and partial filled and buyback enabled * * */ TradeOrder order = parentOrder.GetChildOrderByID(execution.OrderID); if (order == null) { Log.Error(string.Format("Cannot find trade order, orderID: {0}", execution.OrderID)); } else { int exeLevel = int.Parse(order.Notes); TradeMap[exeLevel].CurrentQty += execution.Shares; if (TradeMap[exeLevel].CurrentQty > TradeMap[exeLevel].TargetQty) { //should not hit here Log.Error(string.Format("Overbot Qty detected. level: {0}, qty: {1}, target qty: {2}", exeLevel, TradeMap[exeLevel].CurrentQty, TradeMap[exeLevel].TargetQty)); } TradeMap[exeLevel].LastBuyPrice = execution.Price; //TradeMap[exeLevel].TargetSellPrice = (exeLevel == 0) ? int.MaxValue : TradeMap[exeLevel - 1].LastBuyPrice; CurrentLevel = Math.Max(CurrentLevel, exeLevel); if (TradeMap[CurrentLevel].Filled) { TradeMap[CurrentLevel].WasFilledSellOnPartial = true; //GenerateTradeMapNextLevel(TradeMap[CurrentLevel].LastBuyPrice); } Log.Info("After bot execution." + Util.PrintTradeMapCurrLvl(this)); } }