From 2df140ccab467662f4d72759b9bf48808f3f5deb Mon Sep 17 00:00:00 2001 From: kyh <1329522@naver.com> Date: Wed, 10 May 2023 15:17:24 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=ED=8F=89=EC=97=90=EC=84=9C=201?= =?UTF-8?q?=EA=B0=9C=EC=9D=BC=20=EA=B2=BD=EC=9A=B0=20=EB=8B=A8=EC=88=9C?= =?UTF-8?q?=EB=A7=8C=20=ED=95=B4=EB=8B=B9=20=EB=B4=89=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MovingAverageConditionSetup.cs | 19 ++- Million/Manager/CalculateManager.cs | 153 +++++++++--------- 2 files changed, 97 insertions(+), 75 deletions(-) diff --git a/Million/IndicatorConditionSetup/MovingAverageConditionSetup.cs b/Million/IndicatorConditionSetup/MovingAverageConditionSetup.cs index b886f31..f287c73 100644 --- a/Million/IndicatorConditionSetup/MovingAverageConditionSetup.cs +++ b/Million/IndicatorConditionSetup/MovingAverageConditionSetup.cs @@ -139,7 +139,7 @@ namespace Million.IndicatorConditionSetup total_average += thisValue;//단순 이평 계산하기위한 값 endValueList.Add(thisValue);//가중 이평 계산하기위한 값 - if (i >= Period - 1) + if (i > Period - 1) { if (MaType == CommonProperty.MAType.단순) { @@ -165,6 +165,23 @@ namespace Million.IndicatorConditionSetup total_average -= GetStockValue(data[i - Period + 1]); endValueList.RemoveAt(0); } + else if (Period - 1 == 0) + { + //1개일 경우 단순만 해당 봉 데이터 처리 + if (MaType == CommonProperty.MAType.단순) + { + var value = 0.0; + if (MACandlePriceType == CommonProperty.CandlePriceType.시가) + value = data[i].StartValue; + else if (MACandlePriceType == CommonProperty.CandlePriceType.고가) + value = data[i].HighValue; + else if (MACandlePriceType == CommonProperty.CandlePriceType.종가) + value = data[i].EndValue; + else if (MACandlePriceType == CommonProperty.CandlePriceType.저가) + value = data[i].LowValue; + mov.value = value; + } + } } } diff --git a/Million/Manager/CalculateManager.cs b/Million/Manager/CalculateManager.cs index 3223b45..abc74d3 100644 --- a/Million/Manager/CalculateManager.cs +++ b/Million/Manager/CalculateManager.cs @@ -321,13 +321,13 @@ namespace Million.Manager { parentCandleDataList = parentCandleDataList.OrderBy(t => t.DateTime).ToList(); childrenCandleDataList = childrenCandleDataList.OrderBy(t => t.DateTime).ToList(); - - foreach (var item in childrenCandleDataList) - item.CalculateFlag[setUp.IndexString] = false; - + + foreach (var item in childrenCandleDataList) + item.CalculateFlag[setUp.IndexString] = false; + //부모 데이터는 indicator foreach 돌면서 처리하므로 밖에서 초기화 해야 함 - foreach (var item in parentCandleDataList) - item.CalculateFlag[setUp.IndexString] = false; + foreach (var item in parentCandleDataList) + item.CalculateFlag[setUp.IndexString] = false; //부모의 Indicator 데이터를 Child에 집어 넣음 @@ -372,7 +372,7 @@ namespace Million.Manager for (var i = 0; i < 3; i++) CrossCondition(setUp, parentCandleDataList, childrenCandleDataList, subIndicator, i); } - + } /// @@ -407,7 +407,7 @@ namespace Million.Manager var compareValueList = new List(); originValueList.Add(parent.IndicatorDic[originKey].value); - compareValueList.Add(parent.IndicatorDic[compareKey].value); + compareValueList.Add(parent.IndicatorDic[compareKey].value); if (originSetup.CandlePriceType == CandlePriceType.종가) { @@ -464,7 +464,7 @@ namespace Million.Manager } } } - } + } } /// @@ -477,7 +477,7 @@ namespace Million.Manager private static void RateValue(IndicatorCoditionSetup setUp, List parentCandleDataList, List childrenCandleDataList, CandleData buyData) { // buy의 경우 하나만 사고 있음(여러개가 다른 가격대 일경우는 제외함 -> 나중에 V2에서 해야할 듯) - if(buyData != null) + if (buyData != null) { var rate = ((PriceRateCondtionSetup)setUp).Rate; var rateVal = buyData.BuyValue + (buyData.BuyValue * rate / 100); @@ -535,19 +535,19 @@ namespace Million.Manager /// /// public static void EndValue(IndicatorCoditionSetup setUp, List parentCandleDataList, List childrenCandleDataList) - { + { var key = GetKeyData(setUp); if (key == null) return; - + foreach (var parent in parentCandleDataList) - { + { var childList = GetChildrenDatas(parent, setUp.MCandleTimeType, childrenCandleDataList); - if(childList.Count > 0) + if (childList.Count > 0) { var child = childList[childList.Count - 1]; child.CalculateFlag[setUp.IndexString] = true; parent.CalculateFlag[setUp.IndexString] = true; - + if (parent.IndicatorDic.ContainsKey(key)) { parent.IndicatorDic[key].overlapValue = parent.EndValue; @@ -559,7 +559,8 @@ namespace Million.Manager parent.IndicatorDic[key].overlapValue = parent.EndValue; } - if (child.IndicatorDic.ContainsKey(key)) { + if (child.IndicatorDic.ContainsKey(key)) + { child.IndicatorDic[key].overlapValue = parent.EndValue; } else @@ -569,7 +570,7 @@ namespace Million.Manager child.IndicatorDic[key].overlapValue = parent.EndValue; } } - } + } } /// @@ -579,11 +580,11 @@ namespace Million.Manager /// /// /// - public static void CrossCondition(IndicatorCoditionSetup setUp, List parentCandleDataList, List childrenCandleDataList, + public static void CrossCondition(IndicatorCoditionSetup setUp, List parentCandleDataList, List childrenCandleDataList, List subIndicatorList, int type = 0) { var key = GetKeyData(setUp); - if (key == null) return ; + if (key == null) return; // 정규 식 없을 경우 모든 조건 false if (string.IsNullOrWhiteSpace(setUp.CrossSubRegExpression)) @@ -605,7 +606,7 @@ namespace Million.Manager if (!parent.IndicatorDic.ContainsKey(subKey)) continue; var subIndiOverlapVal = parent.IndicatorDic[subKey].value; - + var overlapValue = GetValueData(setUp, parent, key); // 고가 @@ -617,10 +618,10 @@ namespace Million.Manager subIndiOverlapVal = parent.IndicatorDic[subKey].highValue; overlapValue = parent.IndicatorDic[key].highValue; } - + } // 저가 - if(type == 2) + if (type == 2) { if (parent.IndicatorDic[subKey].lowValue != 0 && parent.IndicatorDic[key].lowValue != 0) @@ -634,15 +635,15 @@ namespace Million.Manager { first = true; continue; - } + } else if (first && subIndiOverlapVal < overlapValue) { // 기준 Setup var period = setUp.GetPeriod(); if (period > i) continue; List childs = null; - if(setUp.IndicatorType == IndicatorType.이동평균선) - if(((MovingAverageConditionSetup)setUp).MovingAverageType == MovingAverageType.거래량) + if (setUp.IndicatorType == IndicatorType.이동평균선) + if (((MovingAverageConditionSetup)setUp).MovingAverageType == MovingAverageType.거래량) childs = GetChildrenDatas(parent, setUp.MCandleTimeType, childrenCandleDataList); @@ -666,9 +667,9 @@ namespace Million.Manager var subIndiOver = subSetup.GetQuoteValue(subList, childs); double overlapVal = 0; - foreach(var item in indiOver) + foreach (var item in indiOver) { - if(indiOver[item.Key] >= subIndiOver[item.Key]) + if (indiOver[item.Key] >= subIndiOver[item.Key]) { overlapVal = indiOver[item.Key]; break; @@ -687,13 +688,13 @@ namespace Million.Manager } childs = GetChildrenDatas(parent, setUp.MCandleTimeType, childrenCandleDataList); - + foreach (var item in childs) { if (item.CalculateFlag[setUp.IndexString]) continue; item.CalculateFlag[setUp.IndexString] = true; - + if (!(item.HighValue <= overlapVal && item.LowValue >= overlapVal)) { overlapVal = item.StartValue; @@ -705,7 +706,7 @@ namespace Million.Manager item.IndicatorDic[key].overlapValue = overlapVal; } else - { + { item.IndicatorDic[key].overlapValue = overlapVal; } } @@ -716,8 +717,8 @@ namespace Million.Manager //초기화를 해줘야함 first = false; } - } - } + } + } } /// @@ -729,7 +730,7 @@ namespace Million.Manager /// public static void FirstTranspierce(IndicatorCoditionSetup setUp, List parentCandleDataList, List childrenCandleDataList, List totalIndicators, bool recentlyDataFlag, string coinFullName) - { + { // 정규 식 없을 경우 단순 돌파와 같음 if (string.IsNullOrWhiteSpace(setUp.FirstOverSubRegExpression)) Transpierce(setUp, parentCandleDataList, childrenCandleDataList); @@ -742,7 +743,7 @@ namespace Million.Manager var subIndi = totalIndicators.FirstOrDefault(t => t.IndexString == setUp.FirstOverSubRegExpression); if (subIndi == null) return; var subKey = GetKeyData(subIndi); - + /** * 최초 돌파 내용 @@ -753,7 +754,7 @@ namespace Million.Manager * 5. False 되는 지점 이후 True나올때까지 찾기 * 6. 1~5번 반복 */ - + subScript.regularExpressionString = setUp.FirstOverSubRegExpression; var subFlag = false; @@ -761,7 +762,7 @@ namespace Million.Manager // realtime(recentlydata가 true일경우)에만 사용하는 데이터 -> 최초 시점 잡기위함 Dictionary subManagement = null; - if(recentlyDataFlag) + if (recentlyDataFlag) subManagement = CommonProperty.subIndicatorStateManagement[setUp.IndexString]; foreach (var parent in parentCandleDataList) @@ -777,7 +778,7 @@ namespace Million.Manager { subFlag = true; //TODO 조건을 넣어서 처리 할 수 있도록 개선 필요 - if (recentlyDataFlag && CommonProperty.DownBeforeValueFlag) + if (recentlyDataFlag && CommonProperty.DownBeforeValueFlag) { if (subManagement[coinFullName]) { @@ -786,7 +787,7 @@ namespace Million.Manager subManagement[coinFullName] = false; } } - } + } } else { @@ -837,7 +838,11 @@ namespace Million.Manager //TODO Tick 차이 관련 조건 식 추가 예정 //최초로 매수, 매도 진행 시 사전 조건과의 Tick거리를 예외할 수 있어야 함 //OverlapValue는 사야할 데이터, beforeIndiValue는 사전 데이터 - if (!GetTickDifferenceCount(overlapData, subVal, 3, coinFullName)) continue; + if (!GetTickDifferenceCount(overlapData, subVal, 3, coinFullName)) + { + subManagement[coinFullName] = false; + continue; + } //최초 시점이 아닐 경우 if ((subManagement != null && subManagement[coinFullName]) || !firstFlag) @@ -846,7 +851,7 @@ namespace Million.Manager var enumList = setUp.OverStatusEnumList; if (setUp.SubIndicatorSetupType == SubIndicatorSetupType.최초돌파) enumList = setUp.OverStatusEnumListFirstOver; - + if (enumList.Any(t => t == parent.IndicatorDic[key].overStatus)) { GetTranspierceData(parent, childrenCandleDataList, setUp, overlapData, key, true); @@ -869,7 +874,7 @@ namespace Million.Manager /// public static bool GetTickDifferenceCount(double standardValue, double compareValue, int tickCount, string coinFullName) { - var bigData = standardValue> compareValue ? standardValue : compareValue; + var bigData = standardValue > compareValue ? standardValue : compareValue; var smallData = standardValue < compareValue ? standardValue : compareValue; var calBigData = OrderbookManager.GetAskPrice(bigData, false); @@ -884,7 +889,7 @@ namespace Million.Manager calSamllData = OrderbookManager.GetAskPrice(calSamllData); count++; } - var returnData = tickCount <= count; + var returnData = tickCount <= count; return returnData; } @@ -905,7 +910,7 @@ namespace Million.Manager if (parent.CandleTimeType == (int)MCandleTimeType.M1) { var child = childrenCandleDataList.FirstOrDefault(t => t.DateTime == parent.DateTime); - if (child == null) return ; + if (child == null) return; childList.Add(child); } else @@ -946,12 +951,12 @@ namespace Million.Manager else { child.IndicatorDic[key] = new IndicatorData(); - if(parent.IndicatorDic.ContainsKey(key)) + if (parent.IndicatorDic.ContainsKey(key)) child.IndicatorDic[key] = parent.IndicatorDic[key]; child.IndicatorDic[key].overlapValue = overlapData; } - } + } } /// @@ -996,7 +1001,7 @@ namespace Million.Manager { var key = GetKeyData(setUp); - if (key == null) return ; + if (key == null) return; var returnData = new List(); foreach (var item in parentCandleDataList) { @@ -1007,13 +1012,13 @@ namespace Million.Manager var overStatusVal = item.IndicatorDic[key].overStatus; if (item.IndicatorDic[key].GetType() == typeof(IchimokData)) - overStatusVal = ((IchimokData) item.IndicatorDic[key]).GetOverStatus(); + overStatusVal = ((IchimokData)item.IndicatorDic[key]).GetOverStatus(); if (setUp.OverStatusEnumList.Any(t => t == overStatusVal)) { - GetTranspierceData(item, childrenCandleDataList, setUp, overlapData, key); + GetTranspierceData(item, childrenCandleDataList, setUp, overlapData, key); } - } + } } /// @@ -1027,7 +1032,7 @@ namespace Million.Manager //비교할 데이터 Key 설정 var key = GetKeyData(setUp); - if (key == null) return ; + if (key == null) return; var returnData = new List(); foreach (var item in parentCandleDataList) { @@ -1052,13 +1057,13 @@ namespace Million.Manager else { compareFlag = CompareSettingValueOfTranspierce(setUp.IndicatorOver, overlapData, value); - } + } } else { compareFlag = CompareSettingValueOfTranspierce(setUp.IndicatorOver, overlapData, value); } - + if (compareFlag) { item.CalculateFlag[setUp.IndexString] = true; @@ -1119,7 +1124,7 @@ namespace Million.Manager if (!child.IndicatorDic.ContainsKey(key)) { child.IndicatorDic[key] = new IndicatorData(); - child.IndicatorDic[key] = item.IndicatorDic[key]; + child.IndicatorDic[key] = item.IndicatorDic[key]; } if (lowFlag || highFlag) @@ -1159,7 +1164,7 @@ namespace Million.Manager if (flag) { child.CalculateFlag[setUp.IndexString] = true; - + } } } @@ -1193,7 +1198,7 @@ namespace Million.Manager if (trueVal) { child.CalculateFlag[setUp.IndexString] = true; - if(child.IndicatorDic.ContainsKey(key)) + if (child.IndicatorDic.ContainsKey(key)) child.IndicatorDic[key].overlapValue = val; else { @@ -1203,9 +1208,9 @@ namespace Million.Manager } } } - + } - } + } } /// /// 단순비교 조건 시 Data 비교 함수 @@ -1271,7 +1276,7 @@ namespace Million.Manager private static double GetValueData(IndicatorCoditionSetup setUp, CandleData candleData, string key) { if (!candleData.IndicatorDic.ContainsKey(key)) return 0; - var data = candleData.IndicatorDic[key].value; + var data = candleData.IndicatorDic[key].value; #region 비교할 데이터 추출 if (candleData.IndicatorDic[key].GetType() == typeof(IchimokData)) @@ -1326,7 +1331,7 @@ namespace Million.Manager { overlapData = ((IchimokData)candleData.IndicatorDic[key]).GetDownOverValue(); } - } + } #endregion return overlapData; } @@ -1352,7 +1357,7 @@ namespace Million.Manager private static double GetValue(CandleData data, IndicatorCoditionSetup setUp) { double value = 0; - + if (setUp.CandlePriceType == CommonProperty.CandlePriceType.시가) { value = data.StartValue; @@ -1392,14 +1397,14 @@ namespace Million.Manager //} //else - + if (parentCadleType == CommonProperty.MCandleTimeType.M3) { - endDate = endDate.AddMinutes(3); + endDate = endDate.AddMinutes(3); } else if (parentCadleType == CommonProperty.MCandleTimeType.M5) { - endDate = endDate.AddMinutes(5); + endDate = endDate.AddMinutes(5); } else if (parentCadleType == CommonProperty.MCandleTimeType.M10) { @@ -1433,7 +1438,7 @@ namespace Million.Manager { endDate = endDate.AddMonths(1); var childList = childrenCandleDatas.Where(t => t.DateTime >= parentCandleData.DateTime && t.DateTime < endDate).ToList(); - if(childList.Count != 0) + if (childList.Count != 0) { var returnData = ValidationCheckManager.ValidateCandleDataList(childList, "temp", MCandleTimeType.M1); if (returnData.Count == 0) @@ -1452,7 +1457,7 @@ namespace Million.Manager } } return new List(); - + } var list = childrenCandleDatas.Where(t => t.DateTime >= parentCandleData.DateTime && t.DateTime < endDate).ToList(); if (list != null || list.Count > 0) return list; @@ -1470,20 +1475,20 @@ namespace Million.Manager /// /// public static void GetCalculateIndicator(List totalIndicator, List indiList, List lossIndicator, - DateTime startDate, DateTime endDate, List resultCandleDataList, List subIndicator, + DateTime startDate, DateTime endDate, List resultCandleDataList, List subIndicator, Dictionary> parentList, bool recentlyDataFlag = false, string coinFullName = null, CandleData buyData = null) { //최신 Child데이터 계산하기 전에 부모 자식 관계 정리부터 처리 var parentKeys = parentList.Keys; - foreach(var key in parentKeys) + foreach (var key in parentKeys) { var parentItem = parentList[key]; - foreach (var item in parentItem) + foreach (var item in parentItem) { var childList = GetChildrenDatas(item, key, resultCandleDataList); foreach (var child in childList) - { + { child.ParentCandleData[key] = item; } } @@ -1492,7 +1497,7 @@ namespace Million.Manager //최신 child 계산 if (recentlyDataFlag) - { + { resultCandleDataList = resultCandleDataList.Where(t => t.RecentlyDataFlag).ToList(); } @@ -1518,12 +1523,12 @@ namespace Million.Manager // 조건에 따라 부모는 여러개가 될 수 있으므로 따로 뽑음 if (recentlyDataFlag) { - list = list.Where(t => t.RecentlyDataFlag).ToList(); + list = list.Where(t => t.RecentlyDataFlag).ToList(); } - SwitchFun(totalIndicator, indicator, list, resultCandleDataList, subIndicator, recentlyDataFlag, coinFullName, buyData); - } - } + SwitchFun(totalIndicator, indicator, list, resultCandleDataList, subIndicator, recentlyDataFlag, coinFullName, buyData); + } + } } } }