public override bool CheckNeedEndTheChance(ChanceClass cc1, bool LastExpectMatched1)
 {
     return(LastExpectMatched1);
 }
Example #2
0
        public override List <ChanceClass> getChances(BaseCollection sc, ExpectData ed)
        {
            List <ChanceClass> ret = new List <ChanceClass>();
            DataTableEx        dt  = null;

            if (this.BySer)
            {
                dt = sc.SerialDistributionTable;
            }
            else
            {
                dt = sc.CarDistributionTable;
            }
            if (dt == null)
            {
                throw new Exception("无法获得概率分布表!");
            }
            string strCodes   = "";
            int    AllChipCnt = 0;

            for (int i = 0; i < 10; i++)
            {
                //获得各项的最小的
                List <double> coldata = null;
                string        strCol  = string.Format("{0}", (i + 1) % 10);
                dt.getColumnData(strCol, ref coldata);
                double    avgval  = coldata.Average();
                double    stdval  = ProbMath.CalculateStdDev(coldata);
                string    strSql  = string.Format("[{0}]<{1}", strCol, avgval - this.StdvCnt * stdval);
                string    strSort = string.Format("[{0}] asc", "Id");
                DataRow[] drs     = dt.Select(strSql, strSort);
                if (drs.Length < this.ChipCount)
                {
                    continue;
                }

                string        strCode = "";
                StringBuilder sb      = new StringBuilder();
                bool          Matched = false;
                for (int j = 0; j < drs.Length; j++)
                {
                    string strId  = drs[j]["Id"].ToString();
                    int    RowCnt = sc.FindLastDataExistCount(this.InputMinTimes, strCol, strId);
                    if (RowCnt > 0)//任何一个不匹配最近5期内出现,不满足条件
                    {
                        Matched = false;
                        break;
                    }
                    sb.Append(drs[j]["Id"].ToString());
                    Matched = true;
                }
                if (!Matched)
                {
                    continue;
                }
                AllChipCnt += drs.Length;
                if (BySer)
                {
                    strCode = string.Format("{0}/{1}", strCol, sb.ToString());
                }
                else
                {
                    strCode = string.Format("{0}/{1}", sb.ToString(), strCol);
                }
                if (strCode.Length > 0)
                {
                    strCodes = string.Format("{0}{1}{2}", strCodes, strCodes.Length > 0?"+":"", strCode);
                }
            }
            if (strCodes.Length < 2 * (this.ChipCount + 2))
            {
                return(ret);
            }
            ChanceClass cc = new ChanceClass();

            cc.SignExpectNo        = ed.Expect;
            cc.ChanceType          = 3;
            cc.InputTimes          = 1;
            cc.strInputTimes       = "1";
            cc.AllowMaxHoldTimeCnt = 1;
            cc.InputExpect         = ed;
            cc.ChipCount           = AllChipCnt;
            cc.ChanceCode          = strCodes;
            cc.CreateTime          = ed.OpenTime;
            cc.Closed = false;
            ret.Add(cc);
            return(ret);
        }
Example #3
0
        public void Run(DataTypePoint dtp, ExpectList <T> testData, BaseStragClass <T> teststrag, ref List <ChanceClass <T> > ChanceList, ref Dictionary <string, ChanceClass <T> > NoCloseChances, ref Dictionary <int, int> HoldCntDic)
        {
            tmpChances = new Dictionary <string, ChanceClass <T> >();
            if (ChanceList == null)
            {
                ChanceList = new List <ChanceClass <T> >();
            }
            BaseCollection <T> sc = new ExpectListProcessBuilder <T>(dtp, testData).getProcess().getSerialData(teststrag.ReviewExpectCnt, teststrag.BySer);

            foreach (string key in NoCloseChances.Keys)
            {
                ChanceClass <T> cc = NoCloseChances[key];
                if (cc.Closed == false)
                {
                    int matchcnt = 0;
                    if (teststrag.GetRev)                                      //如果求相反组合
                    {
                        if (cc.Matched(testData.LastData, out matchcnt, true)) //不关闭
                        {
                            cc.HoldTimeCnt = (int)(testData.LastData.ExpectIndex - cc.InputExpect.ExpectIndex);
                        }
                    }
                    if (cc.Matched(testData.LastData, out matchcnt, false))//如果用相反组合,不改变真正关闭
                    {
                        cc.Closed      = true;
                        cc.EndExpectNo = testData.LastData.Expect;
                        if (!teststrag.GetRev)//只有不求相反值的情况下,才赋持有是次数
                        {
                            cc.HoldTimeCnt = (int)(testData.LastData.ExpectIndex - cc.InputExpect.ExpectIndex);
                        }
                        cc.MatchChips = matchcnt;
                        cc.UpdateTime = testData.LastData.OpenTime;
                        ChanceList.Add(cc);
                        int HCnt = 1;
                        if (HoldCntDic == null)
                        {
                            HoldCntDic = new Dictionary <int, int>();
                        }
                        if (HoldCntDic.ContainsKey(cc.HoldTimeCnt))
                        {
                            HCnt = HoldCntDic[cc.HoldTimeCnt];
                            HCnt++;
                            HoldCntDic[cc.HoldTimeCnt] = HCnt;
                        }
                        else
                        {
                            HoldCntDic.Add(cc.HoldTimeCnt, 1);
                        }
                    }
                    else
                    {
                        tmpChances.Add(key, cc);
                    }
                }
            }
            //List<ChanceClass<T>> cs = teststrag.getChances(testData);

            List <ChanceClass <T> > cs = teststrag.getChances(sc, testData.LastData);

            if (ChanceList == null)
            {
                ChanceList = new List <ChanceClass <T> >();
            }
            //ret.ChanceList.AddRange(cs);
            NoCloseChances = new Dictionary <string, ChanceClass <T> >();
            foreach (string key in tmpChances.Keys)
            {
                ChanceClass <T> cc = tmpChances[key];
                NoCloseChances.Add(key, cc);
            }
            for (int i = 0; i < cs.Count; i++)
            {
                //string key = string.Format("{0}_{1}", cs[i].SignExpectNo, cs[i].ChanceCode);
                string key = string.Format("{0}", cs[i].ChanceCode);
                if (NoCloseChances.ContainsKey(key))
                {
                    if (teststrag.AllowRepeat)
                    {
                        string test = key;
                        //NoCloseChances.Add(key, cs[i]);
                    }
                }
                else
                {
                    NoCloseChances.Add(key, cs[i]);
                }
            }
        }
Example #4
0
        public override List <PK10CorePress.ChanceClass> getChances(PK10CorePress.CommCollection sc, PK10CorePress.ExpectData ed)
        {
            List <ChanceClass> ret = new List <ChanceClass>();
            DataTableEx        dt  = null;

            if (this.BySer)
            {
                dt = sc.SerialDistributionTable;
            }
            else
            {
                dt = sc.CarDistributionTable;
            }
            if (dt == null)
            {
                throw new Exception("无法获得概率分布表!");
            }
            int    MatchCnt    = 0;
            string strAllCodes = "";
            double MinSucRate  = 0;

            if (this.FixChipCnt)
            {
                MinSucRate = this.CommSetting.Odds / this.ChipCount; //指定注数需要的最小胜率
            }
            for (int i = 0; i < 10; i++)
            {
                //获得各项的最小的
                List <double> coldata = null;
                string        strCol  = string.Format("{0}", (i + 1) % 10);

                string strVal   = ed.ValueList[i];
                int    ExistCnt = sc.FindLastDataExistCount(this.InputMinTimes, strCol, strVal);
                if (ExistCnt > 1)//前n次不是最后一次才出现
                {
                    continue;
                }
                dt.getColumnData(strCol, ref coldata);
                double    avgval  = coldata.Average();
                double    stdval  = ProbMath.CalculateStdDev(coldata);
                string    strSql  = string.Format("[{0}]={1}", "Id", strVal);
                string    strSort = string.Format("[{0}] asc", "Id");
                DataRow[] drs     = dt.Select(strSql, "");
                if (drs.Length != 1)
                {
                    throw new Exception("概率数据表错乱!");
                }
                int InAllViewExistCnt = int.Parse(drs[0][strCol].ToString()); //前100(指定的viewcnt)期出现的次数
                if (InAllViewExistCnt > avgval - stdval * this.StdvCnt)       //如果前100期内出现的概率大于指定的标准差数,跳过
                {
                    continue;
                }
                if (InAllViewExistCnt > this.ReviewExpectCnt * (1 - MinSucRate))//如果成功数小于对应注数的失败数
                {
                    continue;
                }
                string strCode = string.Format("{0}/{1}", BySer ? strCol : strVal, BySer ? strVal : strCol);

                MatchCnt++;
                strAllCodes = string.Format("{0}{1}{2}", strAllCodes, MatchCnt > 1 ? "+" : "", strCode);
            }
            if (MatchCnt < this.ChipCount)
            {
                return(ret);
            }
            ChanceClass cc = new ChanceClass();

            cc.SignExpectNo        = ed.Expect;
            cc.ChanceType          = 3;
            cc.InputTimes          = 1;
            cc.strInputTimes       = "1";
            cc.AllowMaxHoldTimeCnt = 1;
            cc.InputExpect         = ed;
            cc.ChipCount           = MatchCnt;
            cc.ChanceCode          = strAllCodes;
            cc.CreateTime          = ed.OpenTime;
            cc.NeedConditionEnd    = true;
            cc.OnCheckTheChance   += CheckNeedEndTheChance;
            cc.Closed = false;
            ret.Add(cc);
            return(ret);
        }
Example #5
0
        public override List <ChanceClass> getChances(CommCollection sc, ExpectData ed)
        {
            List <ChanceClass> ret = new List <ChanceClass>();

            //ExpectListProcess elp = new ExpectListProcess(Data);
            //CommCollection sc = elp.getSerialData(ReviewExpectCnt,BySer);
            //            Log("策略关键参数",string.Format("name:{4};ViewCnt:{0};MinInput:{1};DataCnt:{2};Chipcnt:{3}",this.ReviewExpectCnt,this.InputMinTimes,sc.Data[0].Count,this.ChipCount,this.StragScript));
            for (int i = 0; i < 10; i++)
            {
                Dictionary <int, string> SerStrs = sc.Data[i];
                if (!SerStrs.ContainsKey(this.InputMinTimes - 1))
                {
                    continue;
                }
                if (SerStrs[this.InputMinTimes - 1].Length < this.ChipCount)
                {
                    continue;
                }
                int ishift = this.InputMinTimes - 1;
                //Log("起始位置", ishift.ToString());
                List <string> strCcs = ChanceClass.getAllSubCode(SerStrs[ishift].Trim(), this.ChipCount);
                for (int j = 0; j < strCcs.Count; j++)
                {
                    string strCars = strCcs[j];
                    if (this.ExcludeBS && ChanceClass.isBS(strCars))
                    {
                        continue;
                    }
                    if (this.ExcludeSD && ChanceClass.isSD(strCars))
                    {
                        continue;
                    }
                    if (this.OnlyBS && !ChanceClass.isBS(strCars))
                    {
                        continue;
                    }
                    if (this.OnlySD && !ChanceClass.isSD(strCars))
                    {
                        continue;
                    }
                    NolimitTraceChance cc = new NolimitTraceChance();
                    cc.SignExpectNo  = ed.Expect;
                    cc.ChanceType    = 0;
                    cc.ChipCount     = strCars.Length;
                    cc.InputTimes    = ishift + 1;
                    cc.strInputTimes = cc.InputTimes.ToString();
                    //cc.AllowMaxHoldTimeCnt = this.AllowMaxHoldTimeCnt;
                    cc.InputExpect = ed;
                    cc.StragId     = this.GUID;
                    cc.MinWinRate  = this.CommSetting.GetGlobalSetting().DefaultHoldAmtSerials.MaxRates[cc.ChipCount - 1];
                    cc.IsTracer    = 1;
                    cc.HoldTimeCnt = 1;
                    cc.Odds        = this.CommSetting.GetGlobalSetting().Odds;
                    cc.ExpectCode  = ed.Expect;
                    string strCode = "";
                    if (BySer)
                    {
                        strCode = string.Format("{0}/{1}", (i + 1) % 10, strCcs[j].Trim());
                    }
                    else
                    {
                        strCode = string.Format("{0}/{1}", strCcs[j].Trim(), i);
                    }
                    cc.ChanceCode = strCode;
                    cc.CreateTime = DateTime.Now;
                    cc.UpdateTime = DateTime.Now;
                    cc.Closed     = false;
                    ret.Add(cc);
                }
                //}
                //}
            }
            return(ret);
        }
        public override long getChipAmount(double RestCash, ChanceClass cc, AmoutSerials amts)
        {
            cc.AllowMaxHoldTimeCnt = 1;
            try
            {
                if (LastUseData().LastData.Expect != cc.ExpectCode)
                {
                    return(0);
                }
                if (cc.IncrementType == InterestType.CompoundInterest)
                {
                    if (cc.HoldTimeCnt > 1)
                    {
                        return(0);
                    }
                    if (cc.AllowMaxHoldTimeCnt > 0 && cc.HoldTimeCnt > cc.AllowMaxHoldTimeCnt)
                    {
                        return(0);
                    }
                    if (LastUseData().LastData.Expect != cc.ExpectCode)
                    {
                        return(0);
                    }
                    //
                    double rate = KellyMethodClass.KellyFormula(1, 10, 9.75, 1.001);
                    //double rate = KellyMethodClass.KellyFormula(1, 9.75, 0.1032);
                    long ret = (long)Math.Ceiling((double)(RestCash * rate));
                    return(ret);
                }
                //大于5码的不受限制
                int shift = 0;

                if (cc.ChipCount < this.InputMinTimes && cc.HoldTimeCnt > cc.AllowMaxHoldTimeCnt && cc.AllowMaxHoldTimeCnt > 0)
                {
                    int CurrChipCount = ChanceClass.getChipsByCode(cc.ChanceCode);
                    if (CurrChipCount >= 2)//大于等于3的,超过了一定期数以后可以跟号。4码5次,3码7次,2码11次。6-n+(6-n+1)^2
                    {
                        shift = (this.InputMinTimes + 1 - CurrChipCount) + (int)(Math.Pow((this.InputMinTimes + 1 - CurrChipCount + 1), 2));
                        //shift = (6 - CurrChipCount) + (6 - CurrChipCount + 1) ^ 2;
                    }
                    else
                    {
                        shift = 50;
                    }
                    //                [组合信息:1/0+6/7;组合长度:2;指定最小长度:6:Log]当前次数:10;最小入场次数:9
                    Log(string.Format("组合信息:{0};组合长度:{1};指定最小长度:{2}", cc.ChanceCode, CurrChipCount, this.InputMinTimes), string.Format("当前次数:{0};最小入场次数:{1}", cc.HoldTimeCnt, shift));
                    if (cc.HoldTimeCnt < shift)
                    {
                        return(0);
                    }
                }
                if (cc.HoldTimeCnt <= cc.AllowMaxHoldTimeCnt && cc.AllowMaxHoldTimeCnt > 0) //如果小于等于1
                {
                    return(cc.FixAmt.Value);
                }
                int hcnt = cc.HoldTimeCnt - shift;
                if (hcnt < 0)
                {
                    return(0);
                }
                int chips  = cc.ChipCount - 1;
                int maxcnt = amts.MaxHoldCnts[chips];
                int bShift = 0;
                if (hcnt > maxcnt)
                {
                    Log("风险", "达到最大上限", string.Format("机会{0}持有次数达到{1}次总投入金额已为{2}", cc.ChanceCode, hcnt, cc.Cost));
                    bShift = (int)maxcnt * 2 / 3;
                }
                int RCnt = (hcnt % (maxcnt + 1)) + bShift - 1;
                return(amts.Serials[chips][RCnt]);
            }
            catch (Exception e)
            {
                Log("错误", string.Format("二项分布,获取单码金额错误:{0}", e.Message), e.StackTrace);
            }
            return(1);
        }
Example #7
0
 public abstract bool CheckNeedEndTheChance <T>(ChanceClass <T> cc, bool LastExpectMatched) where T : TimeSerialData;
Example #8
0
        public void  Run()
        {
            LoopCnt   = 0;
            testIndex = 0;
            ret       = new BackTestReturnClass();
            long begNo = BegExpect;

            ExpectReader er  = new ExpectReader();
            ExpectList   el  = null;
            long         cnt = 0;

            ret.HoldCntDic    = new Dictionary <int, int>();
            ret.HoldWinCntDic = new Dictionary <int, int>();
            ret.InChipsDic    = new Dictionary <int, int>();
            ret.WinChipsDic   = new Dictionary <int, int>();

            ExpectList AllData = new ExpectList();

            testIndex = teststrag.ReviewExpectCnt - 1;
            ExpectList testData = null;
            Dictionary <string, ChanceClass> NoCloseChances = new Dictionary <string, ChanceClass>();
            Dictionary <string, ChanceClass> tmpChances     = new Dictionary <string, ChanceClass>();

            while (el == null || el.Count > 0) //如果取到的数据长度大于0
            {
                el = er.ReadHistory(begNo, LoopCnt);
                if (el == null)
                {
                    ret.LoopCnt = cnt * LoopCnt;
                    ret.succ    = false;
                    ret.Msg     = "读取历史数据错误!";
                    break;
                }
                if (el.Count == 0)
                {
                    ret.LoopCnt = testIndex;
                    ret.succ    = true;
                    ret.Msg     = string.Format("成功遍历{0}条记录!共发现机会{1}次!其中,{2}.", testIndex, ret.ChanceList.Count, ret.HoldInfo);
                    break;
                }
                AllData = ExpectList.Concat(AllData, el);
                begNo   = el.LastData.LExpectNo + 1;

                cnt++;
                //Todo:

                while (testIndex < AllData.Count)
                {
                    if (testData == null)
                    {
                        testData = AllData.getSubArray(0, teststrag.ReviewExpectCnt);
                    }
                    else
                    {
                        if (AllData[(int)testIndex].ExpectIndex != testData.LastData.ExpectIndex + 1)
                        {
                            throw new Exception(string.Format("{1}第{0}期后出现数据遗漏,请补充数据后继续测试!", testData.LastData.Expect, testData.LastData.OpenTime));
                        }
                        testData.RemoveAt(0);
                        testData.Add(AllData[(int)testIndex]);
                    }
                    tmpChances = new Dictionary <string, ChanceClass>();
                    foreach (string key in NoCloseChances.Keys)
                    {
                        ChanceClass cc = NoCloseChances[key];
                        if (cc.Closed == false)
                        {
                            int matchcnt = 0;
                            if (teststrag.GetRev)                                      //如果求相反组合
                            {
                                if (cc.Matched(testData.LastData, out matchcnt, true)) //不关闭
                                {
                                    if (cc.HoldTimeCnt < 0)
                                    {
                                        cc.HoldTimeCnt = (int)(testData.LastData.ExpectIndex - cc.InputExpect.ExpectIndex);
                                    }
                                }
                            }
                            bool Matched = cc.Matched(testData.LastData, out matchcnt, false);
                            if (cc.NeedConditionEnd)
                            {
                                cc.MatchChips += matchcnt;
                                if (Matched)
                                {
                                    int LastMatchId = cc.LastMatchTimesId;//最后一次匹配次序号
                                    int maxHoldCnt  = cc.MaxHoldTimeCnt;
                                    if (cc.HoldTimeCnt - cc.LastMatchTimesId > maxHoldCnt)
                                    {
                                        cc.MaxHoldTimeCnt = cc.HoldTimeCnt - cc.LastMatchTimesId;
                                    }
                                    cc.LastMatchTimesId = cc.HoldTimeCnt;
                                }
                                if (teststrag is ITraceChance)
                                {
                                    ITraceChance its = teststrag as ITraceChance;
                                    if (its == null)
                                    {
                                        cc.Closed = cc.OnCheckTheChance(cc, Matched);
                                    }
                                    else
                                    {
                                        cc.Closed = its.CheckNeedEndTheChance(cc, Matched);
                                    }
                                }
                                else
                                {
                                    cc.Closed = cc.OnCheckTheChance(cc, Matched);
                                }
                                if (cc.Closed)
                                {
                                    cc.EndExpectNo = testData.LastData.Expect;
                                    cc.UpdateTime  = testData.LastData.OpenTime;
                                }
                                else
                                {
                                    cc.HoldTimeCnt++;
                                    tmpChances.Add(key, cc);
                                }
                            }
                            else
                            {
                                if (Matched || (cc.HoldTimeCnt > 0 && cc.HoldTimeCnt == cc.AllowMaxHoldTimeCnt))//关闭
                                {
                                    cc.Closed      = true;
                                    cc.EndExpectNo = testData.LastData.Expect;
                                    cc.MatchChips  = matchcnt;
                                    if (!teststrag.GetRev)//只有不求相反值的情况下,才赋持有是次数
                                    {
                                        cc.HoldTimeCnt = (int)(testData.LastData.ExpectIndex - cc.InputExpect.ExpectIndex);
                                    }
                                    else
                                    {
                                        if (cc.HoldTimeCnt < 0)
                                        {
                                            cc.HoldTimeCnt = 999;
                                        }
                                    }
                                    cc.UpdateTime = testData.LastData.OpenTime;
                                    ret.ChanceList.Add(cc);
                                }
                                else
                                {
                                    cc.HoldTimeCnt++;
                                    tmpChances.Add(key, cc);
                                }
                            }
                            if (cc.Closed)
                            {
                                int HCnt = 1;
                                if (ret.HoldCntDic.ContainsKey(cc.HoldTimeCnt))
                                {
                                    HCnt = ret.HoldCntDic[cc.HoldTimeCnt];
                                    HCnt++;
                                    ret.HoldCntDic[cc.HoldTimeCnt]    = HCnt;
                                    ret.HoldWinCntDic[cc.HoldTimeCnt] = ret.HoldWinCntDic[cc.HoldTimeCnt] + matchcnt;
                                    ret.InChipsDic[cc.HoldTimeCnt]    = ret.InChipsDic[cc.HoldTimeCnt] + cc.ChipCount;
                                    ret.WinChipsDic[cc.HoldTimeCnt]   = ret.WinChipsDic[cc.HoldTimeCnt] + cc.MatchChips;
                                }
                                else
                                {
                                    ret.HoldCntDic.Add(cc.HoldTimeCnt, 1);
                                    ret.HoldWinCntDic.Add(cc.HoldTimeCnt, matchcnt);
                                    ret.InChipsDic.Add(cc.HoldTimeCnt, cc.ChipCount);
                                    ret.WinChipsDic.Add(cc.HoldTimeCnt, cc.MatchChips);
                                }
                            }
                        }
                    }
                    CommCollection sc = new ExpectListProcess(testData).getSerialData(teststrag.ReviewExpectCnt, teststrag.BySer);
                    if (testData.Count == 0)
                    {
                        break;
                    }
                    teststrag.SetLastUserData(testData);
                    List <ChanceClass> cs = teststrag.getChances(sc, testData.LastData);//获取所有机会
                    if (ret.ChanceList == null)
                    {
                        ret.ChanceList = new List <ChanceClass>();
                    }
                    //ret.ChanceList.AddRange(cs);
                    NoCloseChances = new Dictionary <string, ChanceClass>();
                    foreach (string key in tmpChances.Keys)
                    {
                        ChanceClass cc = tmpChances[key];
                        NoCloseChances.Add(key, cc);
                    }
                    for (int i = 0; i < cs.Count; i++)
                    {
                        //string key = string.Format("{0}_{1}", cs[i].SignExpectNo, cs[i].ChanceCode);
                        string key = string.Format("{0}", cs[i].ChanceCode);
                        if (NoCloseChances.ContainsKey(key))
                        {
                            if (teststrag.AllowRepeat)
                            {
                                string test = key;
                                //NoCloseChances.Add(key, cs[i]);
                            }
                        }
                        else
                        {
                            NoCloseChances.Add(key, cs[i]);
                        }
                    }
                    testIndex++;
                }
            }
            FinishedProcess();
            //return ret;
        }
Example #9
0
        public BackTestReturnClass VirExchange_oldLogic(ExchangeService es, StragRunPlanClass[] teststragplans)
        {
            long                begNo = BegExpect;
            ExpectReader        er    = new ExpectReader();
            ExpectList          el    = null;
            long                cnt   = 0;
            BackTestReturnClass ret   = new BackTestReturnClass();

            ret.HoldCntDic    = new Dictionary <int, int>();
            ret.HoldWinCntDic = new Dictionary <int, int>();
            ret.InChipsDic    = new Dictionary <int, int>();
            ret.WinChipsDic   = new Dictionary <int, int>();

            ExpectList AllData = new ExpectList();

            //long testIndex = teststrag.ReviewExpectCnt - 1;
            StragClass[] teststrags = teststragplans.Select(p => p.PlanStrag).ToArray <StragClass>();
            long         testIndex  = teststrags.Max <StragClass>(s => s.ReviewExpectCnt);//取所有策略中回览期最大的开始,之前的数据不看
            long         InitIndex  = testIndex;
            ExpectList   testData   = null;
            Dictionary <string, StragChance>   NoCloseChances    = new Dictionary <string, StragChance>();
            Dictionary <string, StragChance>   tmpChances        = new Dictionary <string, StragChance>();
            Dictionary <Int64, ExchangeChance> NewExchangeRecord = new Dictionary <Int64, ExchangeChance>();
            int AllCnt = 0;

            while (el == null || el.Count > 0) //如果取到的数据长度大于0
            {
                el = er.ReadHistory(begNo, LoopCnt);
                if (el == null)
                {
                    ret.LoopCnt = cnt * LoopCnt;
                    ret.succ    = false;
                    ret.Msg     = "读取历史数据错误!";
                    break;
                }
                if (el.Count == 0)
                {
                    ret.LoopCnt = testIndex;
                    ret.succ    = true;
                    ret.Msg     = string.Format("成功遍历{0}条记录!共发现机会{1}次!其中,{2}.", testIndex, ret.ChanceList.Count, ret.HoldInfo);
                    break;
                }
                AllData = ExpectList.Concat(AllData, el);
                begNo   = el.LastData.LExpectNo + 1;

                cnt++;
                //Todo:

                while (testIndex < AllData.Count)
                {
                    int CurrExpectClose = 0;
                    AllCnt++;
                    es.UpdateExpectCnt(AllCnt);
                    if (testData == null)
                    {
                        //testData = AllData.getSubArray(0, teststrag.ReviewExpectCnt);
                        testData = AllData.getSubArray(0, (int)InitIndex + 1);
                    }
                    else
                    {
                        if (AllData[(int)testIndex].ExpectIndex != testData.LastData.ExpectIndex + 1)
                        {
                            throw new Exception(string.Format("{1}第{0}期后出现数据遗漏,请补充数据后继续测试!", testData.LastData.Expect, testData.LastData.OpenTime));
                        }
                        testData.RemoveAt(0);
                        testData.Add(AllData[(int)testIndex]);
                    }
                    for (int i = 0; i < teststrags.Length; i++)//专门针对需要程序话关闭机会,且关闭时需要知道当前数据策略使用
                    {
                        teststrags[i].SetLastUserData(testData);
                    }
                    tmpChances = new Dictionary <string, StragChance>();

                    //关闭所有交易
                    foreach (int id in NewExchangeRecord.Keys)
                    {
                        ExchangeChance ec       = NewExchangeRecord[id];
                        int            matchcnt = 0;
                        ec.OwnerChance.Matched(testData.LastData, out matchcnt, false);
                        ec.MatchChips = matchcnt;
                        es.Update(ec);
                        ec = null;
                    }
                    NewExchangeRecord = new Dictionary <Int64, ExchangeChance>();

                    foreach (string key in NoCloseChances.Keys)
                    {
                        StragChance scc = NoCloseChances[key];
                        ChanceClass cc  = scc.Chance;
                        if (cc.Closed == false)
                        {
                            int matchcnt = 0;
                            //////if (teststrag.GetRev)//如果求相反组合
                            //////{
                            //////    if (cc.Matched(testData.LastData, out matchcnt, true))//不关闭
                            //////    {
                            //////        if (cc.HoldTimeCnt < 0)
                            //////        {
                            //////            cc.HoldTimeCnt = (int)(testData.LastData.ExpectIndex - cc.InputExpect.ExpectIndex);
                            //////        }
                            //////    }
                            //////}
                            bool Matched = cc.Matched(testData.LastData, out matchcnt, false);
                            if (cc.NeedConditionEnd) //需要策略自定义条件结束
                            {
                                cc.MatchChips += matchcnt;
                                if (Matched)                               //匹配到了
                                {
                                    int LastMatchId = cc.LastMatchTimesId; //最后一次匹配次序号
                                    int maxHoldCnt  = cc.MaxHoldTimeCnt;
                                    if (cc.HoldTimeCnt - cc.LastMatchTimesId > maxHoldCnt)
                                    {
                                        cc.MaxHoldTimeCnt = cc.HoldTimeCnt - cc.LastMatchTimesId;
                                    }
                                    cc.LastMatchTimesId = cc.HoldTimeCnt;
                                }
                                if (CurrExpectClose == 1)//如果当期已关闭,后面所有机会均关闭
                                {
                                    cc.Closed = true;
                                }
                                else if (CurrExpectClose == -1)
                                {
                                    cc.Closed = Matched;
                                }
                                else
                                {
                                    cc.Closed = cc.OnCheckTheChance(cc, Matched);
                                    if (teststrags[0].StagSetting.IsLongTermCalc) //如果是长期计算,设置当期是否关闭
                                    {
                                        if (!Matched && cc.Closed)                //匹配和状态相背,一定是状态已关闭
                                        {
                                            CurrExpectClose = 1;
                                        }
                                        if (!Matched && !cc.Closed)//第一次非匹配状态能判断出当期是否关闭
                                        {
                                            CurrExpectClose = -1;
                                        }
                                    }
                                }
                                if (cc.Closed)
                                {
                                    cc.EndExpectNo = testData.LastData.Expect;
                                    cc.UpdateTime  = testData.LastData.OpenTime;
                                }
                                else
                                {
                                    cc.HoldTimeCnt++;
                                    tmpChances.Add(key, scc);
                                }
                            }
                            else
                            {
                                if (Matched || cc.HoldTimeCnt == cc.AllowMaxHoldTimeCnt)//关闭
                                {
                                    cc.Closed      = true;
                                    cc.EndExpectNo = testData.LastData.Expect;
                                    cc.MatchChips  = matchcnt;
                                    //////if (!teststrag.GetRev)//只有不求相反值的情况下,才赋持有是次数
                                    //////{
                                    cc.HoldTimeCnt = (int)(testData.LastData.ExpectIndex - cc.InputExpect.ExpectIndex);
                                    //////}
                                    //////else
                                    //////{
                                    //////    if (cc.HoldTimeCnt < 0)
                                    //////    {
                                    //////        cc.HoldTimeCnt = 999;
                                    //////    }
                                    //////}
                                    cc.UpdateTime = testData.LastData.OpenTime;
                                    ret.ChanceList.Add(cc);
                                }
                                else
                                {
                                    cc.HoldTimeCnt++;
                                    tmpChances.Add(key, scc);
                                }
                            }
                            #region
                            //////////if (cc.Closed)
                            //////////{
                            //////////    int HCnt = 1;
                            //////////    if (cc.NeedConditionEnd)
                            //////////    {
                            //////////        if (ret.HoldCntDic.ContainsKey(cc.MaxHoldTimeCnt))
                            //////////        {
                            //////////            HCnt = ret.HoldCntDic[cc.MaxHoldTimeCnt];
                            //////////            HCnt++;
                            //////////            ret.HoldCntDic[cc.MaxHoldTimeCnt] = HCnt;
                            //////////            ret.HoldWinCntDic[cc.MaxHoldTimeCnt] = ret.HoldWinCntDic[cc.MaxHoldTimeCnt] + matchcnt;
                            //////////            ret.InChipsDic[cc.MaxHoldTimeCnt] = ret.InChipsDic[cc.MaxHoldTimeCnt] + cc.ChipCount * cc.HoldTimeCnt;
                            //////////            ret.WinChipsDic[cc.MaxHoldTimeCnt] = ret.WinChipsDic[cc.MaxHoldTimeCnt] + cc.MatchChips;
                            //////////        }
                            //////////        else
                            //////////        {
                            //////////            ret.HoldCntDic.Add(cc.MaxHoldTimeCnt, 1);
                            //////////            ret.HoldWinCntDic.Add(cc.MaxHoldTimeCnt, matchcnt);
                            //////////            ret.InChipsDic.Add(cc.MaxHoldTimeCnt, cc.ChipCount * cc.HoldTimeCnt);
                            //////////            ret.WinChipsDic.Add(cc.MaxHoldTimeCnt, cc.MatchChips);
                            //////////        }
                            //////////    }
                            //////////    else
                            //////////    {
                            //////////        if (ret.HoldCntDic.ContainsKey(cc.HoldTimeCnt))
                            //////////        {
                            //////////            HCnt = ret.HoldCntDic[cc.HoldTimeCnt];
                            //////////            HCnt++;
                            //////////            ret.HoldCntDic[cc.HoldTimeCnt] = HCnt;
                            //////////            ret.HoldWinCntDic[cc.HoldTimeCnt] = ret.HoldWinCntDic[cc.HoldTimeCnt] + matchcnt;
                            //////////            ret.InChipsDic[cc.HoldTimeCnt] = ret.InChipsDic[cc.HoldTimeCnt] + cc.ChipCount;
                            //////////            ret.WinChipsDic[cc.HoldTimeCnt] = ret.WinChipsDic[cc.HoldTimeCnt] + cc.MatchChips;
                            //////////        }
                            //////////        else
                            //////////        {
                            //////////            ret.HoldCntDic.Add(cc.HoldTimeCnt, 1);
                            //////////            ret.HoldWinCntDic.Add(cc.HoldTimeCnt, matchcnt);
                            //////////            ret.InChipsDic.Add(cc.HoldTimeCnt, cc.ChipCount);
                            //////////            ret.WinChipsDic.Add(cc.HoldTimeCnt, cc.MatchChips);
                            //////////        }
                            //////////    }
                            //////////}
                            #endregion
                        }
                    }

                    List <StragChance> cs = new List <StragChance>();
                    for (int i = 0; i < teststrags.Length; i++)
                    {
                        CommCollection sc = new ExpectListProcess(testData).getSerialData(teststrags[i].ReviewExpectCnt, teststrags[i].BySer);
                        if (testData.Count == 0)
                        {
                            break;
                        }
                        List <ChanceClass> scs = teststrags[i].getChances(sc, testData.LastData);//获取所有机会
                        for (int j = 0; j < scs.Count; j++)
                        {
                            ChanceClass CurrCc = scs[j];
                            ////scs[j].IncrementType = teststragplans[i].IncreamType;
                            ////scs[j].FixAmt = teststragplans[i].FixAmt;
                            ////scs[j].FixRate = teststragplans[i].FixRate;
                            StragRunPlanClass currPlan  = teststragplans[i];
                            StragClass        currStrag = currPlan.PlanStrag;
                            CurrCc.HoldTimeCnt    = 1;
                            CurrCc.Cost           = CurrCc.ChipCount * CurrCc.UnitCost;
                            CurrCc.Gained         = 0;
                            CurrCc.Profit         = 0;
                            CurrCc.ExecDate       = DateTime.Today;
                            CurrCc.CreateTime     = el.LastData.OpenTime;
                            CurrCc.UpdateTime     = CurrCc.CreateTime;
                            CurrCc.StragId        = currStrag.GUID;
                            CurrCc.ExpectCode     = el.LastData.Expect;
                            CurrCc.MaxHoldTimeCnt = currPlan.AllowMaxHoldTimeCnt;
                            CurrCc.FixAmt         = currPlan.FixAmt;
                            CurrCc.FixRate        = currPlan.FixRate;
                            CurrCc.IncrementType  = currPlan.IncreamType;
                            cs.Add(new StragChance(teststrags[i], CurrCc));
                        }
                    }
                    if (ret.ChanceList == null)
                    {
                        ret.ChanceList = new List <ChanceClass>();
                    }
                    //ret.ChanceList.AddRange(cs);
                    NoCloseChances = new Dictionary <string, StragChance>();
                    foreach (string key in tmpChances.Keys)
                    {
                        StragChance scc = tmpChances[key];
                        ChanceClass cc  = scc.Chance;
                        NoCloseChances.Add(key, scc);
                        //////ProbWaveSelectStragClass组合改为统一交易
                        ////if ((scc.Strag is ProbWaveSelectStragClass) == false)
                        ////{
                        ////    ExchangeChance ec = new ExchangeChance(scc.Strag, testData.LastData.Expect, cc);
                        ////    bool Suc = es.Push(ref ec);
                        ////    if (Suc)
                        ////        NewExchangeRecord.Add(ec.Id, ec);
                        ////}
                    }
                    tmpChances = null;
                    //如果设置了最大持仓,必须按照最大持仓限制下注。
                    for (int i = 0; i < Math.Min(cs.Count, teststrags[0].CommSetting.MaxHoldingCnt - NoCloseChances.Count); i++)
                    {
                        //string key = string.Format("{0}_{1}", cs[i].SignExpectNo, cs[i].ChanceCode);
                        string key = string.Format("{0}", cs[i].Chance.ChanceCode);

                        if (NoCloseChances.ContainsKey(key))
                        {
                            //////if (teststrag.AllowRepeat)
                            //////{
                            //////    string test = key;
                            //////    //NoCloseChances.Add(key, cs[i]);
                            //////}
                        }
                        else
                        {
                            cs[i].Chance.BaseAmount = es.summary < es.InitCash?1:es.summary / es.InitCash;
                            NoCloseChances.Add(key, cs[i]);
                            ////////ProbWaveSelectStragClass组合改为统一交易
                            //////if ((cs[i].Strag is ProbWaveSelectStragClass)==false)
                            //////{
                            //////    ExchangeChance ec = new ExchangeChance(cs[i].Strag, testData.LastData.Expect, cs[i].Chance);//交易
                            //////    bool Suc = es.Push(ref ec);
                            //////    if (Suc)
                            //////        NewExchangeRecord.Add(ec.Id, ec);
                            //////}
                        }
                    }
                    //if ((cs[0].Strag is ProbWaveSelectStragClass) == false)
                    //{
                    foreach (string key in NoCloseChances.Keys)
                    {
                        ExchangeChance ec = new ExchangeChance(es, NoCloseChances[key].Strag, testData.LastData.Expect, NoCloseChances[key].Chance); //交易
                        if (ec.OccurStrag is ProbWaveSelectStragClass)                                                                               //对于ProbWaveSelectStragClass,一开始就计算好了Amount
                        {
                            ProbWaveSelectStragClass strag = ec.OccurStrag as ProbWaveSelectStragClass;
                            if (!strag.UseAmountList().ContainsKey(testData.LastData.Expect))
                            {
                                Int64 AllAmt  = (ec.OccurStrag as ChanceTraceStragClass).getChipAmount(es.summary, ec.OwnerChance, ec.OccurStrag.CommSetting.GetGlobalSetting().DefaultHoldAmtSerials);
                                Int64 ChipAmt = (Int64)Math.Floor((double)AllAmt / NoCloseChances.Count);
                                ec.ExchangeAmount = ChipAmt;
                                ec.ExchangeRate   = ChipAmt / es.summary;
                                if (!strag.UseAmountList().ContainsKey(testData.LastData.Expect))
                                {
                                    strag.UseAmountList().Add(testData.LastData.Expect, ChipAmt);
                                }
                            }
                            else
                            {
                                ec.ExchangeAmount = strag.UseAmountList()[testData.LastData.Expect];
                            }
                        }
                        bool Suc = es.Push(ref ec);
                        if (Suc)
                        {
                            NewExchangeRecord.Add(ec.Id, ec);
                        }
                    }
                    //}
                    testIndex++;
                }
            }

            return(ret);
        }
Example #10
0
        public void ExecRun(object data)
        {
            ExpectList el = data as ExpectList;

            //Log("计算服务","准备数据", "为每个策略分配数据");
            foreach (string key in UseStrags.Keys)
            {
                UseStrags[key].SetLastUserData(el);
            }
            //准备数据
            CommCollection cc         = null;
            int            maxViewCnt = (int)this.UseStrags.Max(t => t.Value.ReviewExpectCnt);

            //Log("计算服务", "最大回览期数", maxViewCnt.ToString());
            cc = new ExpectListProcess(el).getSerialData(maxViewCnt, this.UseSerial);
            // cc.orgData = el;//必须指定原始数据?
            //Log("计算服务", "中间数据长度",cc.Data.Count.ToString());
            Dictionary <StragClass, List <ChanceClass> > css = new Dictionary <StragClass, List <ChanceClass> >();
            //Log("计算服务", "计算数据", "为每个策略计算最大回顾周期数据");
            //遍历每个策略获得机会
            DbChanceList OldDbList = new DbChanceList();
            Dictionary <string, ChanceClass> OldList = new Dictionary <string, ChanceClass>();
            List <ChanceClass> NewList = new List <ChanceClass>();

            //Log("计算服务", "遍历所有策略", string.Format("策略数量:{0}",this.UseStrags.Count));


            CloseAllExchance(el);//清空所有可视化机会



            #region 获取交易机会
            for (int i = 0; i < this.UseSPlans.Count; i++)
            {
                StragRunPlanClass currPlan = UseSPlans[i];
                if (currPlan.PlanStrag == null)//如果计划所执行的策略为空,只在chance上执行tracer
                {
                    List <ChanceClass> emptycs = CurrExistChanceList.Values.Where(p => p.StragId == null).ToList <ChanceClass>();
                    for (int c = 0; c < emptycs.Count; c++)
                    {
                        ChanceClass CurrCc = emptycs[c];
                        TraceChance tcc    = CurrCc as TraceChance;
                        CurrCc.UnitCost    = tcc.getChipAmount(GlobalClass.DefaultMaxLost, CurrCc, GlobalClass._DefaultHoldAmtSerials.Value);
                        CurrCc.HoldTimeCnt = CurrCc.HoldTimeCnt + 1;
                        CurrCc.Cost       += CurrCc.ChipCount * CurrCc.UnitCost;
                        CurrCc.UpdateTime  = CurrCc.CreateTime;
                        OldList.Add(CurrCc.GUID, CurrCc);
                        if (!IsBackTest)//非回测需要额外保存数据
                        {
                            OldDbList.Add(CurrCc.ChanceIndex, CurrCc);
                        }
                    }
                    continue;
                }
                StragClass currStrag = UseStrags[currPlan.PlanStrag.GUID];
                currStrag.SetLastUserData(el);                                 //必须给策略填充数据
                List <ChanceClass> cs = currStrag.getChances(cc, el.LastData); //获取该策略的机会
                if (currStrag is TotalStdDevTraceStragClass)                   //如果是整体标准差类,记录所有的标准差数据
                {
                    grpTotolStdDic = (currStrag as TotalStdDevTraceStragClass).getAllStdDev();
                }
                if (cs.Count > 0)
                {
                    Log("计算服务", string.Format("策略[{0}/{1}]", currStrag.GUID, currStrag.StragScript), string.Format("取得机会数量为:{0}", cs.Count));
                }
                Dictionary <string, ChanceClass> StragChances = CurrExistChanceList.Where(p => p.Value.StragId == currStrag.GUID).ToDictionary(p => p.Value.ChanceCode, p => p.Value);
                AmoutSerials amts    = GlobalClass.getOptSerials(CurrSetting.Odds, currPlan.InitCash, 1);
                Int64        restAmt = currStrag.CommSetting.GetGlobalSetting().DefMaxLost; //初始资金
                #region 遍历各机会
                for (int j = 0; j < cs.Count; j++)                                          //对每个机会,检查上期遗留的机会是否包括
                {
                    bool        NeedUseOldData = false;
                    ChanceClass CurrCc         = cs[j];
                    CurrCc.HoldTimeCnt         = 1;
                    CurrCc.AllowMaxHoldTimeCnt = currPlan.AllowMaxHoldTimeCnt;
                    CurrCc.IncrementType       = currPlan.IncreamType;
                    if (currPlan.IncreamType == InterestType.CompoundInterest)
                    {
                        CurrCc.FixRate = currPlan.FixRate;
                    }
                    else
                    {
                        CurrCc.FixAmt = currPlan.FixAmt;
                    }
                    //该语句存在机会重复的风险
                    if (StragChances.ContainsKey(CurrCc.ChanceCode))//未关闭的及机会列表中存在该机会
                    {
                        ChanceClass OldCc = StragChances[CurrCc.ChanceCode];
                        //Log("计算服务", "老机会信息", string.Format("idx:{0};holdcnt:{1}", OldCc.ChanceIndex, OldCc.HoldTimeCnt));
                        //Log("计算服务", "老记录", string.Format("上期相同的机会{0}", CurrCc.ChanceCode));
                        //Log("计算服务", "判断是否允许重复", currStrag.AllowRepeat.ToString());
                        if (!currStrag.AllowRepeat)//如果不允许重复
                        {
                            CurrCc             = OldCc;
                            CurrCc.HoldTimeCnt = CurrCc.HoldTimeCnt + 1;
                            NeedUseOldData     = true;
                            Log("计算服务", "相同处理", string.Format("出现相同的机会{0},持有次数增1->{1}", CurrCc.ChanceCode, CurrCc.HoldTimeCnt));
                        }
                    }
                    else
                    {
                        //Log("计算服务", string.Format("上期相同未关闭的机会数{0},{1}", CurrExistChanceList.Count, CurrCc.ChanceCode), "本期未出现");
                    }

                    if (currPlan.AssetUnitInfo != null)
                    {
                        if (this.UseAssetUnits.ContainsKey(currPlan.AssetUnitInfo.UnitId))
                        {
                            AssetUnitClass useUnit = UseAssetUnits[currPlan.AssetUnitInfo.UnitId];
                            if (!useUnit.Running)
                            {
                                useUnit.Run();
                            }
                            restAmt = (long)useUnit.ExchangeServer.summary;
                        }
                        else
                        {
                            continue;
                        }
                    }
                    //Log("计算服务", "再次检查数据", string.Format("出现相同的机会{0},持有次数增1->{1}", CurrCc.ChanceCode, CurrCc.HoldTimeCnt));
                    CurrCc.UnitCost = -1;         //先默认为-1
                    if (currStrag is ISpecAmount) //先从策略级别判断
                    {
                        ISpecAmount testStrag = (currStrag as ISpecAmount);
                        if (testStrag == null)
                        {
                            //等待下一步按机会级别判断
                        }
                        else
                        {
                            CurrCc.UnitCost = testStrag.getChipAmount(restAmt, CurrCc, amts);
                        }
                    }
                    if (CurrCc.UnitCost < 0)      //如果策略级别未改变值
                    {
                        if (CurrCc.IsTracer == 1) //如果是自我追踪机会
                        {
                            Log("计算服务", "自我跟踪机会,当前持有次数", string.Format("HoldTimes:{0}", CurrCc.HoldTimeCnt));
                            TraceChance useCc = Convert.ChangeType(CurrCc, currStrag.getTheChanceType()) as TraceChance;
                            //Log("计算服务", "使用的机会持有次数", string.Format("HoldTimes:{0}", useCc.HoldTimeCnt));
                            if (useCc == null) //获得的类型并非跟踪类型
                            {
                                CurrCc.UnitCost = (currStrag as ChanceTraceStragClass).getChipAmount(restAmt, CurrCc, amts);
                            }
                            else
                            {
                                CurrCc.UnitCost = useCc.getChipAmount(restAmt, CurrCc, amts);
                            }
                        }
                        else//默认为ChanceTraceStragClass,其实是不可能触发的,而且会出错,因为ChanceTraceStragClass本身就是ispaceamount
                        {
                            Log("计算服务", "非跟踪机会,持有次数", string.Format("HoldTimes:{0}", CurrCc.HoldTimeCnt));
                            CurrCc.UnitCost = (currStrag as ChanceTraceStragClass).getChipAmount(restAmt, CurrCc, amts);
                        }
                    }
                    //Log("计算服务", "再二次检查数据", string.Format("出现相同的机会{0},持有次数增1->{1}", CurrCc.ChanceCode, CurrCc.HoldTimeCnt));
                    if (NeedUseOldData)//未关闭的及机会列表中存在该机会
                    {
                        Log("计算服务", "策略不可以出现重复", string.Format("策略编号:{0}", CurrCc.UnitCost));
                        CurrCc.Cost      += CurrCc.UnitCost * CurrCc.ChipCount;
                        CurrCc.UpdateTime = DateTime.Now;
                        OldList.Add(CurrCc.GUID, CurrCc);
                        if (!IsBackTest)
                        {
                            OldDbList.Add(CurrCc.ChanceIndex, CurrCc);
                        }
                        continue;
                    }
                    CurrCc.HoldTimeCnt    = 1;
                    CurrCc.Cost           = CurrCc.ChipCount * CurrCc.UnitCost;
                    CurrCc.Gained         = 0;
                    CurrCc.Profit         = 0;
                    CurrCc.ExecDate       = DateTime.Today;
                    CurrCc.CreateTime     = DateTime.Now;
                    CurrCc.UpdateTime     = CurrCc.CreateTime;
                    CurrCc.StragId        = currStrag.GUID;
                    CurrCc.ExpectCode     = el.LastData.Expect;
                    CurrCc.MaxHoldTimeCnt = currPlan.AllowMaxHoldTimeCnt;
                    CurrCc.ChanceType     = currPlan.OutPutType;
                    NewList.Add(CurrCc);
                }
                #endregion

                #region 未关闭的机会需要自我跟踪
                foreach (string code in StragChances.Keys)
                {
                    ChanceClass CurrCc = StragChances[code];
                    //if (!CurrCc.Tracerable) continue;
                    int cnt = OldList.Values.Where(p => p.ChanceCode.Equals(code)).Count();
                    if (cnt > 0)
                    {
                        continue;
                    }
                    if (currStrag is ISpecAmount)//先从策略级检查
                    {
                        ISpecAmount specStrag = currStrag as ISpecAmount;
                        if (specStrag != null)//如果没有方法,再从机会级检查
                        {
                            CurrCc.HoldTimeCnt++;
                            CurrCc.UnitCost   = specStrag.getChipAmount(restAmt, CurrCc, amts);
                            CurrCc.Cost      += CurrCc.ChipCount * CurrCc.UnitCost;
                            CurrCc.UpdateTime = DateTime.Now;
                            OldList.Add(CurrCc.GUID, CurrCc);
                            if (!IsBackTest)
                            {
                                OldDbList.Add(CurrCc.ChanceIndex, CurrCc);
                            }
                            continue;
                        }
                    }
                    if (CurrCc.Tracerable)//再检查机会级
                    {
                        CurrCc.HoldTimeCnt++;
                        TraceChance testCc = (TraceChance)CurrCc;
                        if (testCc == null)
                        {
                            continue;
                        }
                        CurrCc.UnitCost   = testCc.getChipAmount(restAmt, CurrCc, amts);
                        CurrCc.Cost      += CurrCc.ChipCount * CurrCc.UnitCost;
                        CurrCc.UpdateTime = DateTime.Now;
                        OldList.Add(CurrCc.GUID, CurrCc);
                        if (!IsBackTest)
                        {
                            OldDbList.Add(CurrCc.ChanceIndex, CurrCc);
                        }
                        continue;
                    }
                    else
                    {
                        CurrCc.HoldTimeCnt++;
                        ISpecAmount Strag = (ISpecAmount)currStrag;
                        if (Strag == null)
                        {
                            continue;
                        }
                        CurrCc.UnitCost   = Strag.getChipAmount(restAmt, CurrCc, amts);
                        CurrCc.Cost       = CurrCc.ChipCount * CurrCc.UnitCost;
                        CurrCc.UpdateTime = DateTime.Now;
                        OldList.Add(CurrCc.GUID, CurrCc);
                        if (!IsBackTest)
                        {
                            OldDbList.Add(CurrCc.ChanceIndex, CurrCc);
                        }
                    }
                }
                #endregion
            }
            #endregion

            if (!IsBackTest)//额外保存
            {
                int savecnt = OldDbList.Save(null);
                if (OldList.Count > 0)
                {
                    Log("计算服务", "保存已有机会", string.Format("条数:{0};实际条数:{1}", OldList.Count, savecnt));
                }
                savecnt = new PK10ExpectReader().SaveChances(NewList, null);
                if (NewList.Count > 0)
                {
                    Log("计算服务", "保存新增机会", string.Format("条数:{0};实际条数:{1}", NewList.Count, savecnt));
                }
            }
            //合并到未关闭机会列表中
            NewList.ForEach(p => AllNoClosedChances.Add(p.GUID, p));
            OldList.Values.ToList <ChanceClass>().ForEach(p => AllNoClosedChances.Add(p.GUID, p)); //就算是老记录未有guid,当ToTable时已经生成了guid
            ExChange(AllNoClosedChances.Values.ToList <ChanceClass>());                            //执行交易提供可视化
        }
Example #11
0
        public override List <ChanceClass> getChances(CommCollection sc, ExpectData ed)
        {
            List <ChanceClass> ret = new List <ChanceClass>();

            ////ExpectListProcess elp = new ExpectListProcess(Data);
            ////CommCollection sc = elp.getSerialData(ReviewExpectCnt,BySer);
            for (int i = 0; i < 10; i++)
            {
                Dictionary <int, string> SerStrs = sc.Data[i];
                int MaxLen  = CommSetting.minColTimes[4];                                 //5码线
                int Max2Len = this.InputMaxTimes - 1;                                     //7码线
                if (SerStrs.ContainsKey(MaxLen + 1) && SerStrs[MaxLen].Trim().Length > 0) //最大长度超过了5码线,过滤
                {
                    continue;
                }
                string strKey = "";
                if (SerStrs.ContainsKey(Max2Len))
                {
                    strKey = SerStrs[Max2Len];
                }
                if (strKey.Trim().Length >= 2) //7码线所包括的内容大于等于2
                {
                    continue;
                }
                int ishift = sc.Data[0].Count - 1;
                while (ishift >= this.ChipCount)
                {
                    if (SerStrs.ContainsKey(ishift))
                    {
                        if (SerStrs[ishift].Trim().Length == (10 - this.ChipCount))
                        {
                            if (this.ExcludeBS && ChanceClass.isBS(SerStrs[ishift].Trim()))
                            {
                                break;
                            }
                            if (this.ExcludeSD && ChanceClass.isSD(SerStrs[ishift].Trim()))
                            {
                                break;
                            }
                            if (this.OnlyBS && !ChanceClass.isBS(SerStrs[ishift].Trim()))
                            {
                                break;
                            }
                            if (this.OnlySD && !ChanceClass.isSD(SerStrs[ishift].Trim()))
                            {
                                break;
                            }
                            ChanceClass cc = new ChanceClass();
                            cc.SignExpectNo = ed.Expect;
                            cc.ChanceType   = 2;
                            cc.InputTimes   = ishift;
                            cc.InputExpect  = ed;
                            string strCode = "";
                            if (BySer)
                            {
                                strCode = string.Format("{0}/{1}", (i + 1) % 10, SerStrs[ishift].Trim());
                            }
                            else
                            {
                                strCode = string.Format("{0}/{1}", SerStrs[ishift].Trim(), i);
                            }
                            cc.ChanceCode = ChanceClass.getRevChance(strCode);
                            cc.CreateTime = ed.OpenTime;
                            cc.Closed     = false;
                            ret.Add(cc);
                            break;
                        }
                        else
                        {
                            ishift--;
                            if (ishift < this.InputMinTimes - 1)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            return(ret);
        }
Example #12
0
        double getSucRate(ExpectList el, strag_CommOldClass coc, bool OnlyOnceChance)
        {
            Dictionary <string, ChanceClass> NoEndChances = new Dictionary <string, ChanceClass>();
            Dictionary <string, ChanceClass> TmpChances   = new Dictionary <string, ChanceClass>();
            int MatchTimes = 0;
            int AllTimes   = 0;

            for (int i = this.InputMaxTimes; i < el.Count; i++)//因为最后一次数据如果下注就不知道结果,所以最后一次排除下注,只做验证上次结果用
            {
                ExpectList useList  = el.getSubArray(i - this.InputMinTimes, this.InputMinTimes);
                ExpectData CurrData = useList.LastData;
                TmpChances = new Dictionary <string, ChanceClass>();
                foreach (string key in NoEndChances.Keys)
                {
                    ChanceClass cc       = NoEndChances[key];
                    int         MatchCnt = 0;
                    bool        Matched  = cc.Matched(CurrData, out MatchCnt, false);
                    if (Matched)
                    {
                        if (OnlyOnceChance)//如果是一次性机会
                        {
                            if (cc.HoldTimeCnt == 1)
                            {
                                MatchTimes++;
                                continue;
                            }
                        }
                        else
                        {
                            MatchTimes++;
                        }
                    }
                    else
                    {
                        if (!TmpChances.ContainsKey(key))
                        {
                            cc.HoldTimeCnt++;
                            cc.Closed = false;
                            TmpChances.Add(key, cc);
                            if (!OnlyOnceChance)//如果不是一次性机会,每次机会都加1
                            {
                                AllTimes++;
                            }
                        }
                    }
                }
                if (i == el.Count - 1)
                {
                    break;//最后一期不找机会
                }
                NoEndChances = new Dictionary <string, ChanceClass>();
                foreach (string key in TmpChances.Keys)//遗留机会
                {
                    NoEndChances.Add(key, TmpChances[key]);
                }
                BaseCollection     scc = new ExpectListProcess(useList).getSerialData(InputMinTimes, BySer) as BaseCollection;
                List <ChanceClass> ccs = coc.getChances(scc, CurrData);
                for (int j = 0; j < ccs.Count; j++)//新增机会
                {
                    if (!NoEndChances.ContainsKey(ccs[j].ChanceCode))
                    {
                        NoEndChances.Add(ccs[j].ChanceCode, ccs[j]);
                        AllTimes++;
                    }
                }
            }
            return((double)100 * MatchTimes / AllTimes);
        }
Example #13
0
 public abstract long getChipAmount <T>(double RestCash, ChanceClass <T> cc, AmoutSerials amts) where T : TimeSerialData;
Example #14
0
 public abstract long getChipAmount(double RestCash, ChanceClass cc, AmoutSerials amts);
Example #15
0
        public override List <ChanceClass> getChances(CommCollection sc, ExpectData ed)
        {
            List <ChanceClass> ret = new List <ChanceClass>();

            CurrChancesCnt = 0;//置零,防止后面留存
            if (this.LastUseData().Count < ReviewExpectCnt)
            {
                Log("基础数据数量不足", string.Format("小于回览期数:{0}", ReviewExpectCnt));
                return(ret);
            }
            ExpectList LastDataList = this.LastUseData();
            ExpectData PreData      = LastDataList[LastDataList.Count - 2];
            //Log(string.Format("前期{0}:{1}", PreData.Expect, PreData.OpenCode), string.Format("当期{0}:{1}", LastDataList.LastData.Expect, LastDataList.LastData.OpenCode));
            //Log(string.Format("el数据长度:{0},First:{1};Last{2}", LastDataList.Count,LastDataList.FirstData.Expect,LastDataList.LastData.Expect), string.Format("原始数据长度:{0};First:{1};Last:{2}", sc.orgData.Count,sc.orgData.FirstData.Expect,sc.orgData.LastData.Expect));
            DataTableEx   dt       = sc.getSubTable(sc.orgData.Count - this.ReviewExpectCnt, this.ReviewExpectCnt);
            List <string> strCodes = new List <string>();

            for (int i = 0; i < 10; i++)//遍历每个车号/名次
            {
                List <int> coldata = null;
                string     strCol  = string.Format("{0}", (i + 1) % 10);
                dt.getColumnData(strCol, ref coldata);
                //Log(string.Format("车/次:{0}",strCol), string.Format("取得的数据:{0}",string.Join(",",coldata)));
                int RepeatCnt = 0;
                for (int j = 1; j < ReviewExpectCnt; j++)
                {
                    if (coldata[j] == coldata[j - 1])
                    {
                        RepeatCnt++;
                    }
                }
                if (RepeatCnt < this.ReviewExpectCnt - 1)//如果重复次数小于回顾次数减一,表示重复次数不够,跳过
                {
                    continue;
                }
                string strCode = "";//其实无需比较,对单个车/名次来说,矩阵都一样,策略只需建立一个即可
                strCode = string.Format("{0}/{1}", strCol, coldata[0]);

                //Log(string.Format("车/次:{0}", strCol), strCode);
                strCodes.Add(strCode);

                if (HoldCnt >= 0) //当持有次数超过指定次数后,不再增加
                {
                    HoldCnt++;    //持有次数加1
                }
                //Log("获得机会处理", string.Format("当前持有次数:{0}", HoldCnt));
                RealCnt++;
            }

            if (strCodes.Count == 0)//机会数为0
            {
                return(ret);
            }
            if (!GetRev)
            {
                OnceChance cc = new OnceChance();
                cc.SignExpectNo        = ed.Expect;
                cc.ChanceType          = 1;
                cc.ChanceCode          = string.Join("+", strCodes);
                cc.ChipCount           = strCodes.Count;//码数必须是实际码数,使用的金额队列必须是1码的队列
                cc.InputTimes          = RealCnt;
                cc.strInputTimes       = string.Format("{0}", cc.InputTimes);
                cc.AllowMaxHoldTimeCnt = 1;
                cc.InputExpect         = ed;
                cc.NeedConditionEnd    = true;
                cc.StragId             = this.GUID;
                //cc.MinWinRate = this.CommSetting.GetGlobalSetting().DefaultHoldAmtSerials.MaxRates[cc.ChipCount - 1];
                cc.IsTracer    = 0;
                cc.Odds        = this.CommSetting.GetGlobalSetting().Odds;
                CurrChancesCnt = strCodes.Count;
                //cc.UnitCost = this.getChipAmount(0,cc,);
                ret.Add(cc);
                //获得所有机会后,统一为本次机会分配资金
                return(ret);
            }
            else
            {
                for (int i = 0; i < strCodes.Count; i++)
                {
                    NolimitTraceChance cc = new NolimitTraceChance();
                    cc.SignExpectNo        = ed.Expect;
                    cc.ChanceType          = 1;
                    cc.ChanceCode          = ChanceClass.getRevChance(strCodes[i]);
                    cc.ChipCount           = 9;//码数必须是实际码数,使用的金额队列必须是1码的队列
                    cc.InputTimes          = RealCnt;
                    cc.strInputTimes       = string.Format("{0}", cc.InputTimes);
                    cc.AllowMaxHoldTimeCnt = 1;
                    cc.InputExpect         = ed;
                    cc.StragId             = this.GUID;
                    //cc.MinWinRate = this.CommSetting.GetGlobalSetting().DefaultHoldAmtSerials.MaxRates[cc.ChipCount - 1];
                    cc.IsTracer    = 1;
                    cc.Odds        = this.CommSetting.GetGlobalSetting().Odds;
                    CurrChancesCnt = strCodes.Count;
                    //cc.UnitCost = this.getChipAmount(0,cc,);
                    ret.Add(cc);
                }
                return(ret);
            }
        }
Example #16
0
        public RoundBackTestReturnClass RunRound(StragClass teststrag, long TestLong, long StepLong)//滚动获取
        {
            long begNo = BegExpect;

            ExpectReader                     er             = new ExpectReader();
            ExpectList                       el             = null;
            long                             cnt            = 0;
            RoundBackTestReturnClass         ret            = new RoundBackTestReturnClass();
            ExpectList                       AllData        = new ExpectList();
            long                             testIndex      = teststrag.ReviewExpectCnt - 1;
            ExpectList                       testData       = null;
            Dictionary <string, ChanceClass> NoCloseChances = new Dictionary <string, ChanceClass>();
            Dictionary <string, ChanceClass> tmpChances     = new Dictionary <string, ChanceClass>();

            long roundId = 0;
            int  currRid = 0;
            List <Dictionary <string, ChanceClass> > roundNoMatchedChances = new List <Dictionary <string, ChanceClass> >();
            List <long> roundBegIds = new List <long>();

            while (el == null || el.Count > 0) //如果取到的数据长度大于0
            {
                el = er.ReadHistory(begNo, LoopCnt);
                if (el == null)
                {
                    ret.LoopCnt = cnt * LoopCnt;
                    ret.succ    = false;
                    ret.Msg     = "读取历史数据错误!";
                    break;
                }
                if (el.Count == 0)
                {
                    ret.LoopCnt = testIndex;
                    ret.succ    = true;
                    ret.Msg     = string.Format("成功遍历{0}条记录!", testIndex);
                    break;
                }
                AllData = ExpectList.Concat(AllData, el);
                begNo   = el.LastData.LExpectNo + 1;

                cnt++;
                //Todo:

                while (testIndex < AllData.Count)
                {
                    if (testData == null)
                    {
                        testData = AllData.getSubArray(0, teststrag.ReviewExpectCnt);
                    }
                    else
                    {
                        if (AllData[(int)testIndex].ExpectIndex != testData.LastData.ExpectIndex + 1)
                        {
                            throw new Exception(string.Format("{1}第{0}期后出现数据遗漏,请补充数据后继续测试!", testData.LastData.Expect, testData.LastData.OpenTime));
                        }
                        testData.RemoveAt(0);
                        testData.Add(AllData[(int)testIndex]);
                    }
                    if (roundBegIds.Count > 0 && testIndex == roundBegIds[currRid] + TestLong)//切换当前滚动id
                    {
                        //取出当前未完成队列,
                        Dictionary <string, ChanceClass> NoMatchDic = roundNoMatchedChances[currRid];
                        BackTestReturnClass brc = ret.RoundData[currRid];
                        foreach (string key in NoMatchDic.Keys)//结束所有未玩成的结果
                        {
                            ChanceClass cc       = NoMatchDic[key];
                            int         matchcnt = 0;
                            if (cc.Matched(testData.LastData, out matchcnt, teststrag.GetRev))
                            {
                                cc.HoldTimeCnt = (int)(testData.LastData.ExpectIndex - cc.InputExpect.ExpectIndex);
                            }
                            else
                            {
                                cc.HoldTimeCnt = 99;//还未开出但是已经结束了的
                            }
                            cc.MatchChips  = matchcnt;
                            cc.Closed      = true;
                            cc.EndExpectNo = testData.LastData.Expect;
                            cc.Closed      = true;
                            cc.EndExpectNo = testData.LastData.Expect;
                            cc.UpdateTime  = testData.LastData.OpenTime;
                            brc.ChanceList.Add(cc);
                            if (brc.HoldCntDic.ContainsKey(cc.HoldTimeCnt))
                            {
                                brc.HoldCntDic[cc.HoldTimeCnt] = brc.HoldCntDic[cc.HoldTimeCnt] + 1;
                            }
                            else
                            {
                                brc.HoldCntDic.Add(cc.HoldTimeCnt, 1);
                            }
                        }
                        currRid++;
                    }
                    if ((testIndex + 1 - teststrag.ReviewExpectCnt) % (StepLong) == 0)     //每到周期整数倍,滚动开始id队列增加当前id
                    {
                        roundBegIds.Add(testIndex);                                        //加入队列
                        roundNoMatchedChances.Add(new Dictionary <string, ChanceClass>()); //加入未完成的机会表到指定队列中
                        BackTestReturnClass brc = new BackTestReturnClass();
                        ret.RoundData.Add(brc);
                        roundId++;
                    }
                    for (int i = currRid; i < roundBegIds.Count; i++)//处理每个滚动周期的
                    {
                        ExchanceClass cc = new ExchanceClass();
                        Dictionary <string, ChanceClass> NoMatchDic = roundNoMatchedChances[i];
                        BackTestReturnClass brc = ret.RoundData[i];
                        cc.Run(testData, teststrag, ref brc.ChanceList, ref NoMatchDic, ref brc.HoldCntDic);
                        roundNoMatchedChances[i] = NoMatchDic;
                        brc.LoopCnt      = testIndex - roundBegIds[i] + 1;
                        ret.RoundData[i] = brc;
                    }
                    testIndex++;
                }
            }

            return(ret);
        }
 public new bool CheckNeedEndTheChance(ChanceClass cc, bool LastExpectMatched)
 {
     return(LastExpectMatched);
 }
 public override long getChipAmount(double RestCash, ChanceClass cc, AmoutSerials amts)
 {
     return(amts.Serials[0][HoldCnt - 1]);
 }
        public override List <ChanceClass> getChances(BaseCollection sc, ExpectData ed)
        {
            InitAllPeaks();//初始化峰值列表
            List <ChanceClass> ret = new List <ChanceClass>();

            if (sc == null || sc.Table == null || sc.Table.Rows.Count < this.ReviewExpectCnt)
            {
                return(ret);
            }
            int AllItemCnt = AllBinomPeaks.Count;
            Dictionary <string, Dictionary <int, int> > AllList = new Dictionary <string, Dictionary <int, int> >();

            for (int i = 0; i < 10; i++)//遍历各车/各名次
            {
                string strCol = string.Format("{0}", (i + 1) % 10);
                //string strVal = ed.ValueList[i];
                Dictionary <int, int> ValCntItems = new Dictionary <int, int>();
                for (int val = 0; val < 10; val++)//对每个数字出现的次数检查
                {
                    ValCntItems.Add(val, 0);
                    string strVal = string.Format("{0}", val);
                    foreach (string key in AllBinomPeaks.Keys)                             //遍历所有峰值清单
                    {
                        int ViewCnt  = int.Parse(key.Split('_')[0]);                       //获得峰值清单对应的实验次数
                        int ExistCnt = sc.FindLastDataExistCount(ViewCnt, strCol, strVal); //获得前N-1次该车次出现的次数
                        if (AllBinomPeaks[key].Contains(ExistCnt + 1))                     //如果该二项分布检查的峰值是7,8,9,值出现的次数是6,7,8,匹配,+1
                        {
                            ValCntItems[val] = ValCntItems[val] + 1;
                        }
                    }
                }
                //满足所有二项分布的才入选
                Dictionary <int, int> ValidItems       = ValCntItems.Where(c => c.Value == AllItemCnt).ToDictionary(a => a.Key, b => b.Value);
                Dictionary <int, int> MatchPoisonItems = new Dictionary <int, int>();
                foreach (int key in ValidItems.Keys)
                {
                    int ViewCnt  = MinFilterCnt - 1;                                           //找出所有值在前100次里出现的次数
                    int ExistCnt = sc.FindLastDataExistCount(ViewCnt, strCol, key.ToString()); //满足最泊松分布最顶峰
                    if (ExistCnt == ViewCnt / 10 - 1)
                    {
                        MatchPoisonItems.Add(key, ValidItems[key]);
                    }
                }
                AllList.Add(strCol, MatchPoisonItems);
            }
            //检查所有满足条件的清单

            Dictionary <string, int> AllCodes = new Dictionary <string, int>();
            List <string>            strCnts  = new List <string>();
            bool RetMutliChances = this.FixChipCnt;

            foreach (string strcol in AllList.Keys)
            {
                if (AllList[strcol].Count == 0)
                {
                    continue;
                }
                int MaxCnt = AllList[strcol].Values.Max();//选最优
                //Dictionary<int,int> strCodeList = AllList[strcol].Where(a => a.Value == MaxCnt).ToDictionary(a => a.Key, b => b.Value);
                Dictionary <int, int> strCodeList = AllList[strcol];
                string StrCode = "";
                string StrVal  = string.Join("", strCodeList.Keys.ToArray());
                string strCnt  = string.Join("_", strCodeList.Values.ToArray());
                strCnts.Add(strCnt);
                if (BySer)
                {
                    StrCode = string.Format("{0}/{1}", strcol, StrVal);
                }
                else
                {
                    StrCode = string.Format("{0}/{1}", StrVal, strcol);
                }
                AllCodes.Add(StrCode, strCodeList.Count);
            }
            Log("所有选出来的记录", string.Join("+", AllCodes.Keys.ToArray()));
            if (AllCodes.Count == 0)
            {
                return(ret);
            }
            if (RetMutliChances)
            {
                foreach (string key in AllCodes.Keys)
                {
                    int Chips = AllCodes[key];
                    if (Chips == 1)
                    {
                        continue;
                    }
                    if (Chips < this.ChipCount)
                    {
                        continue;
                    }
                    ChanceClass cc = new ChanceClass();
                    cc.ChanceCode    = key;
                    cc.SignExpectNo  = ed.Expect;
                    cc.ChanceType    = 2;
                    cc.ChipCount     = AllCodes[key];
                    cc.InputTimes    = 1;
                    cc.strInputTimes = "";// string.Join("_", strCnts.ToArray());
                    //cc.AllowMaxHoldTimeCnt = this.AllowMaxHoldTimeCnt;
                    cc.InputExpect = ed;
                    cc.StragId     = this.GUID;
                    //cc.MinWinRate = this.CommSetting.GetGlobalSetting().DefaultHoldAmtSerials.MaxRates[cc.ChipCount - 1];
                    cc.IsTracer            = 0;
                    cc.HoldTimeCnt         = 1;
                    cc.Odds                = this.CommSetting.GetGlobalSetting().Odds;
                    cc.ExpectCode          = ed.Expect;
                    cc.CreateTime          = DateTime.Now;
                    cc.UpdateTime          = DateTime.Now;
                    cc.AllowMaxHoldTimeCnt = 1;
                    cc.Closed              = false;
                    ret.Add(cc);
                }
                return(ret);
            }
            ////if (AllCodes.Count == 1 && AllCodes.First().Value == 1)//独此一份
            ////    return ret;
            string strAllCode = string.Join("+", AllCodes.Keys.ToArray());

            if (ChanceClass.getChipsByCode(strAllCode) < this.ChipCount)
            {
                return(ret);
            }
            if (!RetMutliChances)
            {
                ChanceClass cc = new ChanceClass();
                cc.SignExpectNo  = ed.Expect;
                cc.ChanceType    = 2;
                cc.ChipCount     = AllCodes.Sum(p => p.Value);
                cc.InputTimes    = 1;
                cc.strInputTimes = string.Join("_", strCnts.ToArray());
                //cc.AllowMaxHoldTimeCnt = this.AllowMaxHoldTimeCnt;
                cc.InputExpect = ed;
                cc.StragId     = this.GUID;
                //cc.MinWinRate = this.CommSetting.GetGlobalSetting().DefaultHoldAmtSerials.MaxRates[cc.ChipCount - 1];
                cc.IsTracer            = 0;
                cc.HoldTimeCnt         = 1;
                cc.Odds                = this.CommSetting.GetGlobalSetting().Odds;
                cc.ExpectCode          = ed.Expect;
                cc.ChanceCode          = string.Join("+", AllCodes.Keys.ToArray());
                cc.CreateTime          = DateTime.Now;
                cc.UpdateTime          = DateTime.Now;
                cc.AllowMaxHoldTimeCnt = 1;
                cc.Closed              = false;
                ret.Add(cc);
            }

            return(ret);
        }
Example #20
0
 public abstract bool CheckNeedEndTheChance(ChanceClass cc, bool LastExpectMatched);