Beispiel #1
0
		internal void OnLevel2Snapshot(Level2Snapshot snapshot)
		{
			OrderBook orderBook = this.book[snapshot.instrumentId];
			if (orderBook == null)
			{
				orderBook = new OrderBook();
				this.book[snapshot.instrumentId] = orderBook;
			}
			orderBook.Set(snapshot);
		}
Beispiel #2
0
		internal void OnLevel2Update(Level2Update update)
		{
			OrderBook orderBook = this.book[update.instrumentId];
			if (orderBook == null)
			{
				orderBook = new OrderBook();
				this.book[update.instrumentId] = orderBook;
			}
			orderBook.Set(update);
		}
Beispiel #3
0
		private void Process(Order order, OrderBook curOrderBook)
		{
			if (!order.isQueueCalculated)
			{
				this.SetQueueSizeByOrderBook(order);
			}
			if (order.type == OrderType.Limit)
			{
				if (curOrderBook.bids.Count == 0 || curOrderBook.asks.Count == 0)
				{
					return;
				}
				if (order.isOutPrice)
				{
					double queueSize = order.queueSize;
					this.SetQueueSizeByOrderBook(order);
					if (order.isOutPrice)
					{
						order.queueSize = queueSize;
					}
				}
				if (order.side == OrderSide.Buy)
				{
					if (curOrderBook.bids[0].price < order.price)
					{
						order.queueSize = 0.0;
						this.Fill(order, curOrderBook.bids[0].price, (int)order.leavesQty);
						return;
					}
					Tick tick = null;
					for (int i = 0; i < curOrderBook.bids.Count; i++)
					{
						tick = curOrderBook.bids[i];
						if (tick.Price == order.price)
						{
							break;
						}
					}
					if (tick != null && order.queueSize > (double)tick.size + order.qty)
					{
						order.queueSize = (double)tick.size + order.qty;
						return;
					}
				}
				else
				{
					if (order.side == OrderSide.Sell)
					{
						if (curOrderBook.asks[0].price > order.price)
						{
							order.queueSize = 0.0;
							this.Fill(order, curOrderBook.asks[0].price, (int)order.leavesQty);
							return;
						}
						Tick tick2 = null;
						for (int j = 0; j < curOrderBook.asks.Count; j++)
						{
							tick2 = curOrderBook.asks[j];
							if (tick2.price == order.price)
							{
								break;
							}
						}
						if (tick2 != null && order.queueSize > (double)tick2.size + order.qty)
						{
							order.queueSize = (double)tick2.size + order.qty;
							return;
						}
					}
				}
			}
			else
			{
				if (order.side == OrderSide.Buy && curOrderBook.asks.Count > 0)
				{
					Tick tick3 = null;
					for (int k = 0; k < curOrderBook.asks.Count; k++)
					{
						tick3 = curOrderBook.asks[k];
						if ((double)tick3.size >= order.leavesQty)
						{
							this.Fill(order, tick3.price, (int)order.leavesQty);
							break;
						}
						this.Fill(order, tick3.price, tick3.size);
					}
					if (tick3 != null && order.leavesQty > 0.0)
					{
						double num = tick3.price + order.instrument.tickSize;
						double num2 = Math.Ceiling(order.leavesQty / (double)tick3.size);
						if (num2 >= 1.0)
						{
							int num3 = 0;
							while ((double)num3 < num2)
							{
								if (order.leavesQty >= (double)tick3.size)
								{
									this.Fill(order, num + (double)num3 * order.instrument.tickSize, tick3.size);
								}
								else
								{
									if (order.leavesQty < (double)tick3.size)
									{
										this.Fill(order, num + (double)num3 * order.instrument.tickSize, (int)order.leavesQty);
										return;
									}
								}
								num3++;
							}
							return;
						}
						this.Fill(order, num, (int)order.leavesQty);
						return;
					}
				}
				else
				{
					if (order.side == OrderSide.Sell && curOrderBook.bids.Count > 0)
					{
						Tick tick4 = null;
						for (int l = 0; l < curOrderBook.bids.Count; l++)
						{
							tick4 = curOrderBook.bids[l];
							if ((double)tick4.Size >= order.leavesQty)
							{
								this.Fill(order, tick4.price, (int)order.leavesQty);
								break;
							}
							this.Fill(order, tick4.price, tick4.size);
						}
						if (tick4 != null && order.leavesQty > 0.0)
						{
							double num4 = tick4.price - order.instrument.tickSize;
							double num5 = Math.Ceiling(order.leavesQty / (double)tick4.size);
							if (num5 >= 1.0)
							{
								int num6 = 0;
								while ((double)num6 < num5)
								{
									if (order.leavesQty >= (double)tick4.size)
									{
										this.Fill(order, num4 - (double)num6 * order.instrument.tickSize, tick4.size);
									}
									else
									{
										if (order.leavesQty < (double)tick4.size)
										{
											this.Fill(order, num4 - (double)num6 * order.instrument.tickSize, (int)order.leavesQty);
											return;
										}
									}
									num6++;
								}
								return;
							}
							this.Fill(order, num4, (int)order.leavesQty);
						}
					}
				}
			}
		}