/// <summary> /// 初始化计划,将数据类型和运算类型相同的计划分组 /// </summary> public static Dictionary <string, CalcStragGroupClass <T> > InitCalcStrags <T>(DataTypePoint dpt, ref Dictionary <string, CalcStragGroupClass <T> > AllStatusStrags, Dictionary <string, BaseStragClass <T> > AllStrags, Dictionary <string, StragRunPlanClass <T> > list, Dictionary <string, AssetUnitClass> AssetUnits, bool StartTheAuto, bool IsBackTest) where T : TimeSerialData { if (AllStatusStrags == null) { AllStatusStrags = new Dictionary <string, CalcStragGroupClass <T> >(); } foreach (string key in list.Keys) //按相同类型+视图分类,相同类分在一组 { StragRunPlanClass <T> spc = list[key]; if (AllStatusStrags.SelectMany(t => t.Value.UseSPlans.Select(a => a.GUID)).Contains(key))//支持后续加入计划,只要状态合适都可以加入 { continue; } if (!AllStrags.ContainsKey(spc.PlanStrag.GUID)) { ToLog(string.Format("计划{0}非法", spc.PlanStrag.StragScript), "计划所对应策略已注销"); continue; } BaseStragClass <T> sc = AllStrags[spc.PlanStrag.GUID]; spc.PlanStrag = sc; if (spc.AssetUnitInfo != null)//分配资产单元号 { sc.AssetUnitId = spc.AssetUnitInfo.UnitId; } ///更新为首先按数据源分类,然后按类和视图分类 //string strModel = "Type_{0}_ViewBySerial_{1}";//按类和数据视图分类 //string strKey = string.Format(strModel, sc.GetType().Name, sc.BySer); string strModel = "DS_{2}Type_{0}_ViewBySerial_{1}";//更新为首先按数据源分类,然后按类和视图分类 string strKey = string.Format(strModel, sc.GetType().Name, sc.BySer, spc.UseDataSource); if (!IsBackTest) { if (spc.ExpiredTime < DateTime.Now) { ToLog("计划时间不匹配", "超过计划过期时间"); continue; } if (!JudgeInRunTime(DateTime.Now, spc))//没在指定运行时间内,跳过 { ToLog("计划时间不匹配", "未在指定时间区间内"); continue; } } if (StartTheAuto)//如果第一次运行,将此标志设为真,将自动启动策略 { spc.Running = spc.AutoRunning; } if (!spc.Running && !IsBackTest) { continue; } if (spc.UseDataSource != dpt.DataType && !IsBackTest) { ToLog("计划不属于使用的数据源", strKey); continue; } CalcStragGroupClass <T> csg = null; if (!AllStatusStrags.ContainsKey(strKey) || IsBackTest) { if (GlobalClass.TypeDataPoints.ContainsKey(spc.UseDataSource) || IsBackTest)//如果计划不属于数据源,不加载 { csg = new CalcStragGroupClass <T>(GlobalClass.TypeDataPoints[spc.UseDataSource]); if (!AllStatusStrags.ContainsKey(strKey)) { AllStatusStrags.Add(strKey, csg); } } } if (!AllStatusStrags.ContainsKey(strKey)) { ToLog("计划未登记!", strKey); continue; } csg = AllStatusStrags[strKey]; if (spc.AssetUnitInfo != null)//必须加资产单元信息 { string uid = spc.AssetUnitInfo.UnitId; if (AssetUnits.ContainsKey(uid)) { if (!csg.UseAssetUnits.ContainsKey(uid)) { csg.UseAssetUnits.Add(uid, AssetUnits[uid]); //注意,一定是要用全局设置的单元资产,才有动态的金额等信息 } } else { ToLog("计划资产单元不匹配", "计划所属资产单元不存在"); } } //csg = AllStatusStrags[strKey]; csg.UseSPlans.Add(spc); ToLog("加入计划", spc.StragDescript); csg.UseStrags.Add(sc.GUID, sc); csg.UseSerial = sc.BySer; //ToLog("初始化待计算的计划", string.Format("准备运行的计划数为:{0};", AllStatusStrags.Count)); } return(AllStatusStrags); }
/// <summary> /// 初始化计划,将数据类型和运算类型相同的计划分组 /// </summary> public static Dictionary <string, CalcStragGroupClass> InitCalcStrags(ref Dictionary <string, CalcStragGroupClass> AllStatusStrags, Dictionary <string, StragClass> AllStrags, Dictionary <string, StragRunPlanClass> list, Dictionary <string, AssetUnitClass> AssetUnits, bool StartTheAuto, bool IsBackTest) { if (AllStatusStrags == null) { AllStatusStrags = new Dictionary <string, CalcStragGroupClass>(); } foreach (string key in list.Keys) //按相同类型+视图分类,相同类分在一组 { StragRunPlanClass spc = list[key]; if (AllStatusStrags.SelectMany(t => t.Value.UseSPlans.Select(a => a.GUID)).Contains(key))//支持后续加入计划,只要状态合适都可以加入 { continue; } if (!AllStrags.ContainsKey(spc.PlanStrag.GUID)) { ToLog("计划非法", "计划所对应策略已注销"); continue; } StragClass sc = AllStrags[spc.PlanStrag.GUID]; spc.PlanStrag = sc; if (spc.AssetUnitInfo != null)//分配资产单元号 { sc.AssetUnitId = spc.AssetUnitInfo.UnitId; } string strModel = "Type_{0}_ViewBySerial_{1}";//按类和数据视图分类 string strKey = string.Format(strModel, sc.GetType().Name, sc.BySer); if (!IsBackTest) { if (spc.ExpiredTime < DateTime.Now) { ToLog("计划时间不匹配", "超过计划过期时间"); continue; } if (!JudgeInRunTime(DateTime.Now, spc))//没在指定运行时间内,跳过 { ToLog("计划时间不匹配", "未在指定时间区间内"); continue; } } if (StartTheAuto)//如果第一次运行,将此标志设为真,将自动启动策略 { spc.Running = spc.AutoRunning; } if (!spc.Running) { continue; } CalcStragGroupClass csg = null; if (!AllStatusStrags.ContainsKey(strKey)) { csg = new CalcStragGroupClass(); AllStatusStrags.Add(strKey, csg); } csg = AllStatusStrags[strKey]; if (spc.AssetUnitInfo != null) { string uid = spc.AssetUnitInfo.UnitId; if (AssetUnits.ContainsKey(uid)) { if (!csg.UseAssetUnits.ContainsKey(uid)) { csg.UseAssetUnits.Add(uid, AssetUnits[uid]); //注意,一定是要用全局设置的单元资产,才有动态的金额等信息 } } else { ToLog("计划资产单元不匹配", "计划所属资产单元不存在"); } } //csg = AllStatusStrags[strKey]; csg.UseSPlans.Add(spc); ToLog("加入计划", spc.StragDescript); csg.UseStrags.Add(sc.GUID, sc); csg.UseSerial = sc.BySer; //ToLog("初始化待计算的计划", string.Format("准备运行的计划数为:{0};", AllStatusStrags.Count)); } return(AllStatusStrags); }