diff --git a/Million Hunter/MainForm.cs b/Million Hunter/MainForm.cs index c14f13d..6f23e1c 100644 --- a/Million Hunter/MainForm.cs +++ b/Million Hunter/MainForm.cs @@ -283,100 +283,38 @@ namespace Million_Hunter //data setting var distinctIndicator = IndicatorSetupManager.Distinct(totalIndicator); - var dic = new Dictionary>>(); - - foreach (var item in candleTypeList) - { - var candleDataListClass = DbServiceFunctions.GetCandleData(selectTable, - _saveResultData.StartDateTime, _saveResultData.EndDateTime, item); - - var indicatorSetUpList = distinctIndicator.Where(t => t.MCandleTimeType == item).ToList(); - foreach (var setup in indicatorSetUpList) - { - setup.excute(candleDataListClass.CandleDataLists_Im); - } - - dic[item] = ValidationCheckManager.SplitValidationCandleDataList(candleDataListClass.CandleDataLists_Im, item); - } - - var resultCandleDataList = new List(); + // 총 데이터 + var dic = DataManager.GetStandardData(candleTypeList, _saveResultData.StartDateTime, _saveResultData.EndDateTime, selectTable, distinctIndicator, true); // buy, sell 계산 var lossIndicator = new List(); - //var totalCalculateCandleList = new List(); - - foreach (var item in dic[CommonProperty.MCandleTimeType.M1]) - resultCandleDataList.AddRange(item); + // 1분봉 데이터 Setting + var resultCandleDataList = dic[CommonProperty.MCandleTimeType.M1]; resultCandleDataList = resultCandleDataList.Where(t => _saveResultData.StartDateTime <= t.DateTime && t.DateTime < _saveResultData.EndDateTime).ToList(); - // 최초와 cross의 조건먼저 계산이 필요함(선처리) - var parentIndicator = totalIndicator.Where(t => t.SubIndicatorSetupType == CommonProperty.SubIndicatorSetupType.최초돌파 || - t.SubIndicatorSetupType == CommonProperty.SubIndicatorSetupType.크로스).ToList(); - var indiList = new List(); - foreach(var item in parentIndicator) - { - var subRegExpression = item.FirstOverSubRegExpression; - if (item.SubIndicatorSetupType == CommonProperty.SubIndicatorSetupType.크로스) - subRegExpression = item.CrossSubRegExpression; - indiList.AddRange(subRegExpression.Split(',').ToList()); - } - indiList = indiList.Distinct().ToList(); + // Sub Indicator string list 반환 + var subIndStringiList = DataManager.GetSubIndicatorStringList(totalIndicator); - var subIndicator = totalIndicator.Where(t => indiList.Any(u => u == t.IndexString)).ToList(); + // Sub Indicator Class + var subIndicator = totalIndicator.Where(t => subIndStringiList.Any(u => u == t.IndexString)).ToList(); + // 선처리 + CalculateManager.GetCalculateIndicator(totalIndicator, subIndStringiList, lossIndicator, _saveResultData.StartDateTime, + _saveResultData.EndDateTime, resultCandleDataList, subIndicator, dic); - foreach (var item in indiList) - { - var indicator = totalIndicator.FirstOrDefault(t => t.IndexString == item); - if(indicator != null) - { - if (indicator.IndicatorType == CommonProperty.IndicatorType.가격비율) - { - //추후 가격도 처리 해야함 EX: 호가 단위 등등 - var temp = (PriceRateCondtionSetup)indicator; - if(temp.PriceRateSetupConditionType == CommonProperty.PriceRateSetupConditionType.비율) { - lossIndicator.Add(indicator); - continue; - } - } - var list = new List(); + + var totalIndi = totalIndicator.Select(t => t.IndexString).ToList(); - foreach (var parent in dic[indicator.MCandleTimeType]) list.AddRange(parent); - - list = list.Where(t => _saveResultData.StartDateTime <= t.DateTime && t.DateTime < _saveResultData.EndDateTime).ToList(); - - CalculateManager.SwitchFun(indicator, list, resultCandleDataList, subIndicator); - //totalCalculateCandleList.AddRange(CalculateManager.SwitchFun(indicator, list, resultCandleDataList)); - } - } + // 중복계산 방지 + foreach (var item in subIndStringiList) + totalIndi.Remove(item); // 후처리 - foreach (var indicator in totalIndicator) - { - if (indiList.Any(t => t == indicator.IndexString)) continue; - - if (indicator.IndicatorType == CommonProperty.IndicatorType.가격비율) - { - var temp = (PriceRateCondtionSetup)indicator; - - //추후 가격도 처리 해야함 EX: 호가 단위 등등 - if (temp.PriceRateSetupConditionType == CommonProperty.PriceRateSetupConditionType.비율) - { - lossIndicator.Add(indicator); - continue; - } - } - var list = new List(); - foreach (var parent in dic[indicator.MCandleTimeType]) list.AddRange(parent); - list = list.Where(t => _saveResultData.StartDateTime <= t.DateTime && t.DateTime < _saveResultData.EndDateTime).ToList(); - - CalculateManager.SwitchFun(indicator, list, resultCandleDataList, subIndicator); - - } - - + CalculateManager.GetCalculateIndicator(totalIndicator, totalIndi, lossIndicator, _saveResultData.StartDateTime, + _saveResultData.EndDateTime, resultCandleDataList, subIndicator, dic); + // 계산 로직 var resultLsit = ResultLogicManager.GetSearchResultList(resultCandleDataList, lossIndicator, _saveResultData.BuyRegularExpression, _saveResultData.SellRegularExpression, selectTable, totalIndicator); totalResultList.AddRange(resultLsit); diff --git a/Million Prototype/Form1.cs b/Million Prototype/Form1.cs index dd3027b..17812c5 100644 --- a/Million Prototype/Form1.cs +++ b/Million Prototype/Form1.cs @@ -114,15 +114,15 @@ namespace Million_Prototype private void button3_Click(object sender, EventArgs e) { List list = null; - DataSettingManager realTimeMsg = null; + RealtimeDataSettingManager realTimeMsg = null; int firstFlag = 0; for (; ; ) { if (firstFlag == 0) { - realTimeMsg = new DataSettingManager(null, PaymentType.KRW); + realTimeMsg = new RealtimeDataSettingManager(null, PaymentType.KRW); realTimeMsg.StartGetRealTimeTicker(null); - var dsm = new DataSettingManager(null, PaymentType.KRW); + var dsm = new RealtimeDataSettingManager(null, PaymentType.KRW); list = dsm.GetRealTimeCandleData(MCandleTimeType.M1, 200); firstFlag = 1; } diff --git a/Million/Manager/CalculateManager.cs b/Million/Manager/CalculateManager.cs index 2d81efb..0701277 100644 --- a/Million/Manager/CalculateManager.cs +++ b/Million/Manager/CalculateManager.cs @@ -1,4 +1,5 @@ using Million.Data; +using Million.DbManagement; using Million.IndicatorConditionSetup; using System; using System.Collections.Generic; @@ -501,27 +502,32 @@ namespace Million.Manager break; } } + parent.CalculateFlag[setUp.IndexString] = true; + + if (!parent.IndicatorDic.ContainsKey(key)) + { + parent.IndicatorDic[key] = new IndicatorData(); + parent.IndicatorDic[key].overlapValue = overlapVal; + } childs = GetChildrenDatas(parent, setUp.MCandleTimeType, childrenCandleDataList); - - foreach(var item in childs) + + foreach (var item in childs) { if (item.CalculateFlag[setUp.IndexString]) continue; item.CalculateFlag[setUp.IndexString] = true; - parent.CalculateFlag[setUp.IndexString] = true; - + if (!(item.HighValue <= overlapVal && item.LowValue >= overlapVal)) { overlapVal = item.StartValue; - } + } - if (!parent.IndicatorDic.ContainsKey(key)) + if (!item.IndicatorDic.ContainsKey(key)) { - parent.IndicatorDic[key] = new IndicatorData(); - parent.IndicatorDic[key] = parent.IndicatorDic[key]; - parent.IndicatorDic[key].overlapValue = overlapVal; - } + item.IndicatorDic[key] = new IndicatorData(); + item.IndicatorDic[key].overlapValue = overlapVal; + } } // 해당하는 봉만 True @@ -1095,5 +1101,42 @@ namespace Million.Manager if (list.Count == count) return list; return new List(); } + + /// + /// Indicator 계산 로직 + /// + /// + /// + /// + /// + /// + /// + /// + public static void GetCalculateIndicator(List totalIndicator, List indiList, List lossIndicator, + DateTime startDate, DateTime endDate, List resultCandleDataList, List subIndicator, Dictionary> parentList) + { + foreach (var item in indiList) + { + var indicator = totalIndicator.FirstOrDefault(t => t.IndexString == item); + if (indicator != null) + { + if (indicator.IndicatorType == CommonProperty.IndicatorType.가격비율) + { + //추후 가격도 처리 해야함 EX: 호가 단위 등등 + var temp = (PriceRateCondtionSetup)indicator; + if (temp.PriceRateSetupConditionType == CommonProperty.PriceRateSetupConditionType.비율) + { + lossIndicator.Add(indicator); + continue; + } + } + var list = parentList[indicator.MCandleTimeType]; + + list = list.Where(t => startDate <= t.DateTime && t.DateTime < endDate).ToList(); + + SwitchFun(indicator, list, resultCandleDataList, subIndicator); + } + } + } } } diff --git a/Million/Manager/DataManager.cs b/Million/Manager/DataManager.cs new file mode 100644 index 0000000..3884290 --- /dev/null +++ b/Million/Manager/DataManager.cs @@ -0,0 +1,79 @@ +using Million.Data; +using Million.DbManagement; +using Million.IndicatorConditionSetup; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Million.CommonProperty; + +namespace Million.Manager +{ + /// + /// 데이터 구성 Manager Class + /// + public static class DataManager + { + + /// + /// DB에서 데이터 가져오며 Setting 처리 함 + /// + /// + /// + /// + /// + /// + /// + public static Dictionary> GetStandardData(List candleTypeList, DateTime startDate, + DateTime endDate, MarketData market, List distinctIndicator, bool flag = false) + { + var dic = new Dictionary>(); + //계산로직에 필요한 Data setting + foreach (var item in candleTypeList) + { + var candleDataListClass = DbServiceFunctions.GetCandleData(market, + startDate, endDate, item); + + var indicatorSetUpList = distinctIndicator.Where(t => t.MCandleTimeType == item).ToList(); + foreach (var setup in indicatorSetUpList) + { + setup.excute(candleDataListClass.CandleDataLists_Im); + } + var list = new List(); + if (flag) + { + var parentData = ValidationCheckManager.SplitValidationCandleDataList(candleDataListClass.CandleDataLists_Im, item); + foreach (var parent in parentData) list.AddRange(parent); + dic.Add(item, list); + } + else + dic.Add(item, candleDataListClass.CandleDataLists_Im); + } + return dic; + } + + /// + /// Sub Indicator List String 반환 Function + /// + /// + /// + public static List GetSubIndicatorStringList(List totalIndicator) + { + // 최초와 cross의 조건먼저 계산이 필요함(선처리) + var parentIndicator = totalIndicator.Where(t => t.SubIndicatorSetupType == CommonProperty.SubIndicatorSetupType.최초돌파 || + t.SubIndicatorSetupType == CommonProperty.SubIndicatorSetupType.크로스).ToList(); + + var subIndStringiList = new List(); + foreach (var item in parentIndicator) + { + var subRegExpression = item.FirstOverSubRegExpression; + if (item.SubIndicatorSetupType == CommonProperty.SubIndicatorSetupType.크로스) + subRegExpression = item.CrossSubRegExpression; + subIndStringiList.AddRange(subRegExpression.Split(',').ToList()); + } + subIndStringiList = subIndStringiList.Distinct().ToList(); + return subIndStringiList; + } + } +} diff --git a/Million/Manager/DataSettingManager.cs b/Million/Manager/RealtimeDataSettingManager.cs similarity index 98% rename from Million/Manager/DataSettingManager.cs rename to Million/Manager/RealtimeDataSettingManager.cs index d5d9f92..972c476 100644 --- a/Million/Manager/DataSettingManager.cs +++ b/Million/Manager/RealtimeDataSettingManager.cs @@ -15,7 +15,7 @@ namespace Million.Manager /// /// Data Setting하는 Manager Class /// - public class DataSettingManager + public class RealtimeDataSettingManager { /// /// Ticker에 들어갈 데이터 @@ -33,7 +33,7 @@ namespace Million.Manager /// /// 생성자 /// - public DataSettingManager(List codeFullNameList, PaymentType buyType, string tableName = "Upbit") + public RealtimeDataSettingManager(List codeFullNameList, PaymentType buyType, string tableName = "Upbit") { this.buyType = buyType; marketList = DbServiceFunctions.GetMarketDatas(tableName, Enum.GetName(typeof(PaymentType), buyType)); @@ -86,7 +86,7 @@ namespace Million.Manager } return returnData; - } + } public void StartGetRealTimeTicker(object state, int duTime = 0, int period = 50) { diff --git a/Million/Million Core.csproj b/Million/Million Core.csproj index 92bcc98..62035b9 100644 --- a/Million/Million Core.csproj +++ b/Million/Million Core.csproj @@ -190,7 +190,8 @@ - + +