private void OnFill(object sender, FillEventArgs e) { try { Fill fill = e.fill; string action = fill.Buy ? "Sell" : "Buy"; //keep track of current positions if (fill.Product == procSpread.productOne.Product) { currentPosOne += fill.Buy ? fill.Qty : -fill.Qty; } else if (fill.Product == procSpread.productTwo.Product) { currentPosTwo += fill.Buy ? fill.Qty : -fill.Qty; } if (log.IsDebugEnabled) { log.Debug("closeouts size= " + closeouts.Count); log.Debug("fillbugs size= " + fillbugs.Count); log.Debug("orders count " + orders.Count + "\n" + fill.ToString()); log.Debug("offorders size= " + offOrders.Count); } if (fillbugs.ContainsKey(fill.Key) && fill.Full) { orders.Remove(fillbugs[fill.Key]); fillbugs.Remove(fill.Key); return; } SpreadOrder spo = findSpread(fill.Key); if (spo == null) { if (offOrders.ContainsKey(fill.Key)) { if (log.IsDebugEnabled) log.Debug("late fill in OffOrders " + fill.ToString() ); Order o = offOrders[fill.Key]; procSpread.SendOrder( o.buySell == "Buy" ? "Sell" : "Buy" ,o.buySell == "Buy" ? market.bid(o.IPROC.Product) - o.IPROC.TickPrice * 5 : market.ask(o.IPROC.Product) + o.IPROC.TickPrice * 5 ,fill.Qty ,o.IPROC ); offOrders.Remove(fill.Key); } return; } spo.AddFill(fill); /* * if we got back a full fill check to see if the whole spread is full * if its not then work the open leg in a seperate thread incrementing the price by * payUp params. add the thread to closeouts so we can stop it when it is full filled */ if( fill.Full ) { if( spo.IsFull() ) { lastfill.Clear(); if (log.IsDebugEnabled) log.Debug("removing spread from orders"); orders.Remove(spo); lastfill[spo.buySell] = spo.fillPrice(); if (log.IsInfoEnabled) log.Info( new System.Text.StringBuilder("SpreadID:").AppendFormat("{0} spreadType: {1} filled spreadcost: {2}" ,spo.spreadID,spo.buySell,spo.fillPrice() ) ); if (closeouts.ContainsKey(fill.Key)) { try { closeouts[fill.Key].Abort(); } catch(Exception exc){ if (log.IsErrorEnabled) log.Error(exc.StackTrace); } closeouts.Remove(fill.Key); } } else { Order wkLeg = spo.getWorkingLeg(); Order filledLeg = spo.getFilledLeg(); //we got a Full fill but the spread itself is not full. however we are already running the cleanup //thread which means TT sent back full fill error if (closeouts.ContainsKey(wkLeg.SOK)) { if (log.IsDebugEnabled) log.Debug("XXX fix for full fill bug: " + wkLeg.SOK); try{ closeouts[wkLeg.SOK].Abort(); } catch(Exception exc){ if (log.IsErrorEnabled) log.Error(exc.StackTrace); } closeouts.Remove(wkLeg.SOK); string k = procSpread.SendOrder(wkLeg.buySell , wkLeg.buySell == "Buy" ? market.ask(wkLeg.IPROC.Product) + wkLeg.IPROC.TickPrice * 5 : market.bid(wkLeg.IPROC.Product) - wkLeg.IPROC.TickPrice * 6 , wkLeg.WkQty , wkLeg.IPROC); fillbugs.Add(k, spo); } else{ if (log.IsDebugEnabled) log.Debug("closeout out remaing leg: " + wkLeg.SOK); Thread thrdCloseout = new Thread(delegate() { int PayUpTicks = spread.PayUpTicks; for (int i = 0; i < spread.PayUpCount; i++) { double price = action == "Buy" ? wkLeg.Price + wkLeg.IPROC.TickPrice * PayUpTicks : wkLeg.Price - wkLeg.IPROC.TickPrice * PayUpTicks; int wkqty = wkLeg.WkQty; if (wkqty > 0) { CancelReplace(action, wkLeg.SOK, wkLeg.IPROC, wkqty, price); } else { break; } Thread.Sleep(spread.PayUpPeriod); PayUpTicks++; } //if we exhausted payUpCount and still not filled then closeout full leg. if( wkLeg.WkQty == wkLeg.IPROC.Size ){ scratchLegs.Enqueue(filledLeg); closeouts.Remove(wkLeg.SOK); procSpread.Delete(wkLeg.SOK,wkLeg.IPROC.ttOrderSet); } }); thrdCloseout.Start(); closeouts.Add(wkLeg.SOK, thrdCloseout); } } } } catch (Exception ex) { if (log.IsErrorEnabled) log.Error(ex.StackTrace + "\n\n" + ex.Message); } }
private void OnFill(object sender, FillEventArgs e) { try { Fill fill = e.fill; string action = fill.Buy ? "Sell" : "Buy"; //keep track of current positions if (fill.Product == procSpread.productOne.Product) { currentPosOne += fill.Buy ? fill.Qty : -fill.Qty; } else if (fill.Product == procSpread.productTwo.Product) { currentPosTwo += fill.Buy ? fill.Qty : -fill.Qty; } if (log.IsDebugEnabled) { log.Debug("closeouts size= " + closeouts.Count); log.Debug("fillbugs size= " + fillbugs.Count); log.Debug("orders count " + orders.Count + "\n" + fill.ToString()); log.Debug("offorders size= " + offOrders.Count); } if (fillbugs.ContainsKey(fill.Key) && fill.Full) { orders.Remove(fillbugs[fill.Key]); fillbugs.Remove(fill.Key); return; } SpreadOrder spo = findSpread(fill.Key); if (spo == null) { if (offOrders.ContainsKey(fill.Key)) { if (log.IsDebugEnabled) { log.Debug("late fill in OffOrders " + fill.ToString()); } Order o = offOrders[fill.Key]; procSpread.SendOrder(o.buySell == "Buy" ? "Sell" : "Buy" , o.buySell == "Buy" ? market.bid(o.IPROC.Product) - o.IPROC.TickPrice * 5 : market.ask(o.IPROC.Product) + o.IPROC.TickPrice * 5 , fill.Qty , o.IPROC); offOrders.Remove(fill.Key); } return; } spo.AddFill(fill); /* * if we got back a full fill check to see if the whole spread is full * if its not then work the open leg in a seperate thread incrementing the price by * payUp params. add the thread to closeouts so we can stop it when it is full filled */ if (fill.Full) { if (spo.IsFull()) { lastfill.Clear(); if (log.IsDebugEnabled) { log.Debug("removing spread from orders"); } orders.Remove(spo); lastfill[spo.buySell] = spo.fillPrice(); if (log.IsInfoEnabled) { log.Info( new System.Text.StringBuilder("SpreadID:").AppendFormat("{0} spreadType: {1} filled spreadcost: {2}" , spo.spreadID, spo.buySell, spo.fillPrice()) ); } if (closeouts.ContainsKey(fill.Key)) { try { closeouts[fill.Key].Abort(); } catch (Exception exc) { if (log.IsErrorEnabled) { log.Error(exc.StackTrace); } } closeouts.Remove(fill.Key); } } else { Order wkLeg = spo.getWorkingLeg(); Order filledLeg = spo.getFilledLeg(); //we got a Full fill but the spread itself is not full. however we are already running the cleanup //thread which means TT sent back full fill error if (closeouts.ContainsKey(wkLeg.SOK)) { if (log.IsDebugEnabled) { log.Debug("XXX fix for full fill bug: " + wkLeg.SOK); } try{ closeouts[wkLeg.SOK].Abort(); } catch (Exception exc) { if (log.IsErrorEnabled) { log.Error(exc.StackTrace); } } closeouts.Remove(wkLeg.SOK); string k = procSpread.SendOrder(wkLeg.buySell , wkLeg.buySell == "Buy" ? market.ask(wkLeg.IPROC.Product) + wkLeg.IPROC.TickPrice * 5 : market.bid(wkLeg.IPROC.Product) - wkLeg.IPROC.TickPrice * 6 , wkLeg.WkQty , wkLeg.IPROC); fillbugs.Add(k, spo); } else { if (log.IsDebugEnabled) { log.Debug("closeout out remaing leg: " + wkLeg.SOK); } Thread thrdCloseout = new Thread(delegate() { int PayUpTicks = spread.PayUpTicks; for (int i = 0; i < spread.PayUpCount; i++) { double price = action == "Buy" ? wkLeg.Price + wkLeg.IPROC.TickPrice * PayUpTicks : wkLeg.Price - wkLeg.IPROC.TickPrice * PayUpTicks; int wkqty = wkLeg.WkQty; if (wkqty > 0) { CancelReplace(action, wkLeg.SOK, wkLeg.IPROC, wkqty, price); } else { break; } Thread.Sleep(spread.PayUpPeriod); PayUpTicks++; } //if we exhausted payUpCount and still not filled then closeout full leg. if (wkLeg.WkQty == wkLeg.IPROC.Size) { scratchLegs.Enqueue(filledLeg); closeouts.Remove(wkLeg.SOK); procSpread.Delete(wkLeg.SOK, wkLeg.IPROC.ttOrderSet); } }); thrdCloseout.Start(); closeouts.Add(wkLeg.SOK, thrdCloseout); } } } } catch (Exception ex) { if (log.IsErrorEnabled) { log.Error(ex.StackTrace + "\n\n" + ex.Message); } } }