예제 #1
0
        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);
                            }
                        }
                    }
                }
            }
        }
예제 #2
0
파일: RT.cs 프로젝트: 296083197/ts
        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;
                            }
                        }
                    }
                }
            }
        }