private void FireLevel2Snapshot(SortedSet <int> Ids, DateTime _dateTime, DateTime _exchangeDateTime, DepthMarketDataNClass pDepthMarketData, DepthMarketDataNClass DepthMarket) { //行情过来时是今天累计成交量,得转换成每个tick中成交量之差 double volume = pDepthMarketData.Volume - DepthMarket.Volume; // 以前第一条会导致集合竞价后的第一条没有成交量,这种方法就明确了上一笔是空数据 if (0 == DepthMarket.TradingDay && 0 == DepthMarket.ActionDay) { //没有接收到最开始的一条,所以这计算每个Bar的数据时肯定超大,强行设置为0 volume = 0; } else if (volume < 0) { //如果隔夜运行,会出现今早成交量0-昨收盘成交量,出现负数,所以当发现为负时要修改 volume = pDepthMarketData.Volume; } foreach (var _id in Ids) { List <Bid> bids = new List <Bid>(); if (pDepthMarketData.Bids != null) { foreach (var d in pDepthMarketData.Bids) { Bid bid = new Bid( _dateTime, _exchangeDateTime, id, _id, d.Price, d.Size); bids.Add(bid); } } List <Ask> asks = new List <Ask>(); if (pDepthMarketData.Asks != null) { foreach (var d in pDepthMarketData.Asks) { Ask ask = new Ask( _dateTime, _exchangeDateTime, id, _id, d.Price, d.Size); asks.Add(ask); } } var l2s = new Level2Snapshot(_dateTime, _exchangeDateTime, id, _id, bids.ToArray(), asks.ToArray()) { }; // 启用底层数据上传 EmitData(l2s); } }
public void OnLevel2(Level2Snapshot snapshot) { var list = _orders[snapshot.InstrumentId]; if (FillOnLevel2 && list != null) { for (int i = 0; i < list.Count; i++) { var order = list[i]; OnLevel2(order, snapshot); } RemoveDoneOrders(); } }
private bool OnAucFill(Order order) { if (order.Type == OrderType.Limit) { int instrumentId = order.Instrument.Id; if (FillOnQuote) { Ask ask = framework.DataManager.GetAsk(instrumentId); if (ask != null && OnAsk(order, ask)) { return(true); } Bid bid = framework.DataManager.GetBid(instrumentId); if (bid != null && OnBid(order, bid)) { return(true); } } if (FillOnTrade) { Trade trade = framework.DataManager.GetTrade(instrumentId); if (trade != null && OnTrade(order, trade)) { return(true); } } if (FillOnBar) { Bar bar = framework.DataManager.GetBar(instrumentId); if (BarFilter.Count != 0 && !BarFilter.Contains(bar.Type, bar.Size)) { return(false); } if (bar != null && OnBar(order, bar)) { return(true); } } if (FillOnLevel2) { Level2Snapshot snapshot = framework.DataManager.GetAggregatedSnapshot(instrumentId); if (snapshot != null) { return(OnLevel2(order, snapshot)); } } } return(false); }
internal void method_10(Level2Snapshot level2Snapshot_0) { if (this.strategy__0 != null && this.Status == StrategyStatus.Running) { List <Strategy> list; if (this.Mode == StrategyMode.Backtest) { list = this.idArray_2[level2Snapshot_0.int_0]; } else { list = this.idArray_3[level2Snapshot_0.int_0][(int)level2Snapshot_0.byte_0]; } for (int i = 0; i < list.Count; i++) { list[i].vmethod_13(level2Snapshot_0); } } }
private bool OnLevel2(Order order, Level2Snapshot snapshot) { if (CheckDataProvider && !IsProviderPassed(order, snapshot.ProviderId)) { return(false); } bool result = false; if (order.Side == OrderSide.Sell) { for (int i = 0; i < snapshot.Bids.Length; i++) { bool flag = false; if (order.LeavesQty > 0.0) { flag = OnBid(order, snapshot.Bids[i]); } if (!flag) { break; } result = true; } } else if (order.Side == OrderSide.Buy) { for (int i = 0; i < snapshot.Asks.Length; i++) { bool flag2 = false; if (order.LeavesQty > 0.0) { flag2 = OnAsk(order, snapshot.Asks[i]); } if (!flag2) { break; } result = true; } } return(result); }
internal void method_10(Level2Snapshot level2Snapshot_0) { if (this.strategy__0 != null && this.Status == StrategyStatus.Running) { List<Strategy> list; if (this.Mode == StrategyMode.Backtest) { list = this.idArray_2[level2Snapshot_0.int_0]; } else { list = this.idArray_3[level2Snapshot_0.int_0][(int)level2Snapshot_0.byte_0]; } for (int i = 0; i < list.Count; i++) { list[i].vmethod_13(level2Snapshot_0); } } }