protected override void recv(RealtimeDataCenter.RealtimeData rd) { if (DateTime.Now.Date != rd.dt.Date) { return; } //expired data if (this.dcWindow.ContainsKey(rd.code)) { Tuple <decimal, decimal> wind = this.dcWindow[rd.code]; if (rd.L <= wind.Item2) //当日将不再会形成跳空式的关闭窗口(即RI) { removeObj(rd.code); } else { if (rd.C >= wind.Item1) { bool bCreate = false; Reactor.EPriceType pt = Reactor.EPriceType.REALTIME; if ((rd.C / rd.lastC - 1) * 100 > 9.0m) //推测其将limit-up,先买入(此点需继续验证) { bCreate = true; pt = Reactor.EPriceType.REALTIME; } else if (string.Compare(rd.dt.ToString("HHmmss"), "145940") > 0) { bCreate = true; pt = Reactor.EPriceType.CLOSE; } if (bCreate) { Reactor.CInstruction instruction = new Reactor.CInstruction(); instruction.id = 0; instruction.priceAsc = wind.Item2 + 0.01m; instruction.priceDesc = Limit.getInstance().getLimitUp(rd.code, rd.lastC) - 0.01m; //-0.01m, don't buy when limit-up instruction.generateTime = DateTime.Now; instruction.priceType = (short)pt; instruction.category = (short)Reactor.ECategory.BUY; instruction.state = (short)Reactor.EInstructionState.WATING; instruction.desc = "entry"; instruction.quantity = (int)(Math.Round(CASH_SIZE / (decimal)instruction.priceAsc / 100m) * 100m); instruction.codeReference = rd.code; if (instruction.quantity > 0) { instruction.sso = new Reactor.CSimplifiedStrategiesObject() { id = 0, idForStrategies = (long)Reactor.EIFS.RI, code = rd.code, state = (short)Reactor.ESSOState.WAIT_CREATE, planQuantity = instruction.quantity, lastStopPrice = (decimal)instruction.priceAsc, createTime = instruction.generateTime, direction = (short)Reactor.EDirection.LONG, }; instruction.analyseEntryOrExit((Reactor.EDirection)(instruction.sso.direction)); removeObj(rd.code); Reactor.getInstance().addInstruction2Wating(rd.code, instruction); } } } } } }
protected override void recv(RealtimeDataCenter.RealtimeData rd) { if (DateTime.Now.Date != rd.dt.Date) { return; } //expired data if (this.dcTendency.ContainsKey(rd.code)) { decimal[] dcps = this.dcTendency[rd.code].ToArray(); foreach (var dcp in dcps) { if (rd.C >= dcp) { bool bCreate = false; Reactor.EPriceType pt = Reactor.EPriceType.REALTIME; if ((rd.C / rd.lastC - 1) * 100 < 3.0m) { bCreate = true; pt = Reactor.EPriceType.REALTIME; } if (bCreate) { Reactor.CInstruction instruction = new Reactor.CInstruction(); instruction.id = 0; instruction.priceAsc = dcp + 0.01m; instruction.priceDesc = Limit.getInstance().getLimitUp(rd.code, rd.lastC) - 0.01m; //-0.01m, don't buy when limit-up instruction.generateTime = DateTime.Now; instruction.priceType = (short)pt; instruction.category = (short)Reactor.ECategory.BUY; instruction.state = (short)Reactor.EInstructionState.WATING; instruction.desc = "entry"; instruction.quantity = (int)(Math.Round(CASH_SIZE / (decimal)instruction.priceAsc / 100m) * 100m); instruction.codeReference = rd.code; if (instruction.quantity > 0) { instruction.sso = new Reactor.CSimplifiedStrategiesObject() { id = 0, idForStrategies = (long)Reactor.EIFS.RT, code = rd.code, state = (short)Reactor.ESSOState.WAIT_CREATE, planQuantity = instruction.quantity, lastStopPrice = (decimal)instruction.priceAsc, createTime = instruction.generateTime, direction = (short)Reactor.EDirection.LONG, }; instruction.analyseEntryOrExit((Reactor.EDirection)(instruction.sso.direction)); //直接removeObj,以及下面的break (foreach),而不使用下面的注释部分,原因在于:Reactor.EIFS.RT中,同一对象有多个tendency line时,当日只进入一次 removeObj(rd.code); /* * this.dcTendency[rd.code].Remove(dcp); * if (this.dcTendency[rd.code].Count == 0) * { removeObj(rd.code); } */ Reactor.getInstance().addInstruction2Wating(rd.code, instruction); break; } } } } } }