protected override bool doJob() { bool ret = false; BarFeeder.Init(this.provider, this.dealTime); BarFeeder.ClearBars(); string dealTimeString = Utils.FormatTime(this.dealTime); List <TradeStateRecord> tradeStateRecords = new List <TradeStateRecord>(); List <string> positionSymbols = new List <string>(); //处理已有的头寸 Dictionary <string, DQNExit> exitDict = new Dictionary <string, DQNExit>(); foreach (Behavior behavior in this.strategy.Behaviors) { DQNExit exit = behavior as DQNExit; if (exit != null) { string symbol = exit.Instrument.Symbol; exitDict.Add(symbol, exit); TradeStateRecord aStateRecord = new TradeStateRecord(); aStateRecord.Symbol = symbol; aStateRecord.HoldingPeriod = exit.HoldingPeriod; tradeStateRecords.Add(aStateRecord); positionSymbols.Add(symbol); } } //Dictionary<String,Trade> lastTradeDict=this.provider.GetLastTrades(positionSymbols,true); Dictionary <String, Trade> lastTradeDict = new Dictionary <String, Trade>(); foreach (string symbol in positionSymbols) { List <Trade> trades = this.provider.GetLastNTrades(symbol, dealTimeString, 1); if (trades.Count > 0 && trades[0].DateTime.Date == this.dealDate) { lastTradeDict[symbol] = trades[0]; } else { lastTradeDict[symbol] = null; } } this.GetDataAndPrediction(tradeStateRecords, lastTradeDict); foreach (BsonDocument record in DQNTradeDBAccess.GetExitingTempRecords()) { string symbol = record["Symbol"].AsString; exitDict[symbol].Deal(record["QValueIn"].AsDouble, record["QValueOut"].AsDouble); } //处理当天入场 tradeStateRecords.Clear(); List <string> activeSymbols = new List <String>(); activeSymbols.AddRange(this.provider.GetSymbols("SHSE", 1, 1)); activeSymbols.AddRange(this.provider.GetSymbols("SZSE", 1, 1)); //lastTradeDict=this.provider.GetLastTrades(activeSymbols,true); foreach (string symbol in activeSymbols) { List <Trade> trades = this.provider.GetLastNTrades(symbol, dealTimeString, 1); if (trades.Count > 0 && trades[0].DateTime.Date == this.dealDate) { lastTradeDict[symbol] = trades[0]; } else { lastTradeDict[symbol] = null; } } foreach (KeyValuePair <String, Trade> kvp in lastTradeDict) { if (kvp.Value == null) { continue; } GMTrade gmTrade = (GMTrade)kvp.Value; if (gmTrade.Price <= 0) { continue; } if (gmTrade.Price == gmTrade.UpperLimit) { continue; } if (gmTrade.Price / gmTrade.LastClose - 1 <= 0) { continue; } if (positionSymbols.Contains(kvp.Key)) { continue; } TradeStateRecord aStateRecord = new TradeStateRecord(); aStateRecord.Symbol = kvp.Key; aStateRecord.HoldingPeriod = 1; tradeStateRecords.Add(aStateRecord); } this.GetDataAndPrediction(tradeStateRecords, lastTradeDict); List <string> enteringSymbols = new List <string>(); MongoCursor enteringCursor = DQNTradeDBAccess.GetEnteringTempRecords(5); foreach (BsonDocument record in enteringCursor) { string symbol = record["Symbol"].AsString; enteringSymbols.Add(symbol); } Dictionary <string, Trade> newTradeDict = this.provider.GetLastTrades(enteringSymbols, false); foreach (BsonDocument record in enteringCursor) { string symbol = record["Symbol"].AsString; double dealPrice = lastTradeDict[symbol].Price; double newPrice = newTradeDict[symbol].Price; if (Math.Abs(newPrice / dealPrice - 1) < 0.01) { Instrument inst = InstrumentManager.Instruments[symbol]; if (inst != null) { DQNEntry entry = new DQNEntry(inst, this.strategy); this.strategy.AddBehavior(inst, entry); entry.Deal(record["QValueIn"].AsDouble, record["QValueOut"].AsDouble); } } } ret = true; return(ret); }