示例#1
0
    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);
    }