private void RealTimeDataReader_RealTimeChanged(object sender, RealTimeChangedArgument e) { lock (lockObj) { this.time = e.Time; //过了新的一天,昨日的委托需要全部清除 if (e.TradingDayChanged) { CancelAllOrder(); return; } loopOrders.Clear(); loopOrders.AddRange(waitingOrders); //TODO 价格变化后需要修改现金余额 for (int i = 0; i < loopOrders.Count; i++) { OrderInfo order = loopOrders[i]; if (AccountSetting.TradeType == AccountTradeType.DELAYTIME) { double delayTime = AccountSetting.DelayTime; double betweenTime = e.Time - order.OrderTime; if (betweenTime <= delayTime) { continue; } } else if (accountSetting.TradeType == AccountTradeType.DELAYTICK) { ITickData tickData = this.realTimeDataReader.GetRealTimeData(order.Instrumentid).GetTickData(); if (tickData != null) { if (this.dic_Code_OrderDelayInfo.ContainsKey(order.OrderID)) { OrderDelayInfo delayInfo = this.dic_Code_OrderDelayInfo[order.OrderID]; int tickIndex = delayInfo.orderTickIndex; int delayTick = AccountSetting.DelayTick; if (tickData.BarPos - tickIndex < delayTick) { continue; } } } } DoTrade(order); } } }
private OrderInfo OpenInternal(string code, double price, OrderSide orderSide, int mount) { //准备委托 double buymoney; OrderInfo orderInfo = PrepareOrderInfo(code, price, orderSide, mount, out buymoney); if (orderInfo == null) { return(null); } //将委托加入列表,并锁定金额 this.waitingOrders.Add(orderInfo); this.historyOrders.Add(orderInfo); this.money -= buymoney; this.dic_OrderID_LockMoney.Add(orderInfo.OrderID, buymoney); //执行委托后事件 if (orderInfo != null) { OnReturnOrder?.Invoke(this, ref orderInfo); } //立即成交或用市场价格成交,则立即执行交易 if (AccountSetting.TradeType == AccountTradeType.IMMEDIATELY || accountSetting.TradeType == AccountTradeType.MARKETPRICE ) { this.DoTrade(orderInfo); } else if (AccountSetting.TradeType == AccountTradeType.DELAYTICK) { ITickData tickData = this.realTimeDataReader.GetRealTimeData(code).GetTickData(); if (tickData != null) { OrderDelayInfo delayInfo = new OrderDelayInfo(); delayInfo.orderTickIndex = tickData.BarPos; this.dic_Code_OrderDelayInfo.Add(orderInfo.OrderID, delayInfo); } } return(orderInfo); }