From 2722e15a0b533ecc9bd674dd4b493f435d758769 Mon Sep 17 00:00:00 2001 From: jwlee Date: Fri, 14 Jun 2024 19:18:54 +0900 Subject: [PATCH] =?UTF-8?q?1.=20=EC=98=81=ED=98=B8=20=EC=8B=A0=ED=98=B8?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EC=B6=94=EA=B0=80=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IndicatorProcess.cs | 104 ++++++++++++++---- .../MovingAverageConditionSetup.cs | 15 ++- BitgetApi/MainForm.Designer.cs | 3 - BitgetApi/MainForm.cs | 6 +- 4 files changed, 97 insertions(+), 31 deletions(-) diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 3333211..72466ff 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -47,6 +47,11 @@ namespace BitgetAPI.IndicatorConditionSetup IchimokuConditionSetup ichimokuConditionSetup = new IchimokuConditionSetup(); MovingAverageConditionSetup movingAverageConditionSetup = new MovingAverageConditionSetup(); + signals_LU.Clear(); + signals_SD.Clear(); + signals_LD.Clear(); + signals_SU.Clear(); + // 추후 공통화 및 소스정리 필요 while (true) { @@ -70,7 +75,7 @@ namespace BitgetAPI.IndicatorConditionSetup if (lastCandleData.IchimokData != null) { - if (checked구름떼상향돌파) + if (checked구름떼상향돌파 || 영호조건식_상향돌파) { item.Price = lastCandleData.Close; item.Rate = (lastCandleData.Close / lastCandleData.Open) * 100 - 100; @@ -93,7 +98,7 @@ namespace BitgetAPI.IndicatorConditionSetup if (lastCandleData.IchimokData != null) { - if (checked구름떼하향돌파) + if (checked구름떼하향돌파 || 영호조건식_하향돌파) { item.Price = lastCandleData.Close; item.Rate = (lastCandleData.Close / lastCandleData.Open) * 100 - 100; @@ -114,8 +119,8 @@ namespace BitgetAPI.IndicatorConditionSetup foreach (CommonProperty.MCandleTimeType interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType))) { // Description - var description = Utils.Convertor.GetEnumDescription((Enum)interval); - if (!intervalList.Contains(description)) continue; + var strInterval = Utils.Convertor.GetEnumDescription((Enum)interval); + if (!intervalList.Contains(strInterval)) continue; // 시간별로 정렬하기 (임시 리스트) var candleDatas = findedMarket.candleDataList[interval]; @@ -142,15 +147,16 @@ namespace BitgetAPI.IndicatorConditionSetup var indicatorPrice = candleData.Open; var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; - var signalData = signals_LU.Find(i => i.MarketName.Equals(market)); - + var description = string.Format("{0} 구름떼 상승", strInterval); + var signalData = signals_LU.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); + // 없으면 생성 if (signalData == null) { SignalInfoData signalInfoData = new SignalInfoData(); signalInfoData.SignalStart = nowTime; signalInfoData.MarketName = market; - signalInfoData.Description = string.Format("{0} 구름떼 상승", description); + signalInfoData.Description = description; signalInfoData.Rate = rate; signalInfoData.Price = price; signalInfoData.IndicatorPrice = indicatorPrice; @@ -169,7 +175,8 @@ namespace BitgetAPI.IndicatorConditionSetup var indicatorPrice = candleData.Open; var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; - var signalData = signals_SD.Find(i => i.MarketName.Equals(market)); + var description = string.Format("{0} 구름떼 하락", strInterval); + var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); // 없으면 생성 if (signalData == null) @@ -177,7 +184,7 @@ namespace BitgetAPI.IndicatorConditionSetup SignalInfoData signalInfoData = new SignalInfoData(); signalInfoData.SignalStart = nowTime; signalInfoData.MarketName = market; - signalInfoData.Description = string.Format("{0} 구름떼 하락", description); + signalInfoData.Description = description; signalInfoData.Rate = rate; signalInfoData.Price = price; signalInfoData.IndicatorPrice = indicatorPrice; @@ -190,36 +197,93 @@ namespace BitgetAPI.IndicatorConditionSetup if (영호조건식_상향돌파 || 영호조건식_하향돌파) { - candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); var candleData_전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전봉); // 24,72 높은값 - var 높은값_74_21_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[21].Value); + var 높은값_74_24_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value); // 24,72 낮은값 - var 낮은값_74_21_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[21].Value); + var 낮은값_74_24_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value); // 24,72 높은값 - var 높은값_74_21_전봉 = Math.Max(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[21].Value); + var 높은값_74_24_전봉 = Math.Max(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value); // 24,72 낮은값 - var 낮은값_74_21_전봉 = Math.Min(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[21].Value); + var 낮은값_74_24_전봉 = Math.Min(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value); + + // 24,72 높은값 + var 높은값_74_24 = Math.Max(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_74_24 = Math.Min(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value); if (영호조건식_상향돌파 && - candleData_전봉.movingAverageDataList[72].Value < candleData_전봉.IchimokData.상한선) - { - } - else if (영호조건식_하향돌파) + // 전전봉의 4가 74, 21 보다 높고 + candleData_전전봉.movingAverageDataList[4].Value <= 높은값_74_24_전전봉 && + // 전봉의 4가 74,21 보다 작고나서 + candleData_전봉.movingAverageDataList[4].Value > 높은값_74_24_전봉 && + // 현재 시가도 4가 74,21 보다 작고, 고가도 + candleData.movingAverageDataList[4].Value > 높은값_74_24) { - if (낮은값_74_21_전봉 < candleData_전봉.IchimokData.하한선 && - candleData_전봉.movingAverageDataList[4].Value < 낮은값_74_21_전봉) + var price = candleData.Close; + var rate = (candleData.Close / candleData.Open) * 100 - 100; + var indicatorPrice = candleData.Open; + var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; + + var description = string.Format("{0} 72,24,4 상승", strInterval); ; + var signalData = signals_LU.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); + + // 없으면 생성 + if (signalData == null) { + SignalInfoData signalInfoData = new SignalInfoData(); + signalInfoData.SignalStart = nowTime; + signalInfoData.MarketName = market; + signalInfoData.Description = description; + signalInfoData.Rate = rate; + signalInfoData.Price = price; + signalInfoData.IndicatorPrice = indicatorPrice; + signalInfoData.IndicatorRate = indicatorRate; + signalInfoData.MCandleTimeType = interval; + signals_LU.Add(signalInfoData); } } + else if (영호조건식_하향돌파 && + // 전전봉의 4가 74, 21 보다 높고 + candleData_전전봉.movingAverageDataList[4].Value >= 낮은값_74_24_전전봉 && + // 전봉의 4가 74,21 보다 작고나서 + candleData_전봉.movingAverageDataList[4].Value < 낮은값_74_24_전봉 && + // 현재 시가도 4가 74,21 보다 작고, 고가도 + candleData.movingAverageDataList[4].Value < 낮은값_74_24) + { + var price = candleData.Close; + var rate = (candleData.Close / candleData.Open) * 100 - 100; + var indicatorPrice = candleData.Open; + var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; + + var description = string.Format("{0} 72,24,4 하락", strInterval); + var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); + + // 없으면 생성 + if (signalData == null) + { + SignalInfoData signalInfoData = new SignalInfoData(); + signalInfoData.SignalStart = nowTime; + signalInfoData.MarketName = market; + signalInfoData.Description = description; + signalInfoData.Rate = rate; + signalInfoData.Price = price; + signalInfoData.IndicatorPrice = indicatorPrice; + signalInfoData.IndicatorRate = indicatorRate; + signalInfoData.MCandleTimeType = interval; + + signals_SD.Add(signalInfoData); + } + + } } } } diff --git a/BitgetApi/IndicatorConditionSetup/MovingAverageConditionSetup.cs b/BitgetApi/IndicatorConditionSetup/MovingAverageConditionSetup.cs index fdb62d4..88e7128 100644 --- a/BitgetApi/IndicatorConditionSetup/MovingAverageConditionSetup.cs +++ b/BitgetApi/IndicatorConditionSetup/MovingAverageConditionSetup.cs @@ -33,13 +33,16 @@ namespace BitgetAPI.IndicatorConditionSetup if (candleData == null) return; // Moving 없으면 생성 - if (candleData.movingAverageDataList == null) candleData.movingAverageDataList = new Dictionary(); + if (candleData.movingAverageDataList == null) + { + candleData.movingAverageDataList = new Dictionary(); - candleData.movingAverageDataList.Add(CandleLegnth4, new MovingAverageData()); - candleData.movingAverageDataList.Add(CandleLegnth24, new MovingAverageData()); - candleData.movingAverageDataList.Add(CandleLegnth72, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLegnth4, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLegnth24, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLegnth72, new MovingAverageData()); + } - foreach(var item in candleData.movingAverageDataList) + foreach(var item in candleData.movingAverageDataList.ToList()) { // 전봉까지 만듬 var datas = candleDatas.FindAll(i => @@ -47,7 +50,7 @@ namespace BitgetAPI.IndicatorConditionSetup candleDatas.IndexOf(i) <= endIndex); candleData.movingAverageDataList[item.Key] = new MovingAverageData(); - candleData.movingAverageDataList[item.Key].Value = datas.Sum(i => i.Close); + candleData.movingAverageDataList[item.Key].Value = datas.Sum(i => i.Close) / item.Key; } } diff --git a/BitgetApi/MainForm.Designer.cs b/BitgetApi/MainForm.Designer.cs index 0dab682..e789a34 100644 --- a/BitgetApi/MainForm.Designer.cs +++ b/BitgetApi/MainForm.Designer.cs @@ -711,7 +711,6 @@ // checkEdit_yhk_Short // this.checkEdit_yhk_Short.EditValue = true; - this.checkEdit_yhk_Short.Enabled = false; this.checkEdit_yhk_Short.Location = new System.Drawing.Point(6, 40); this.checkEdit_yhk_Short.Name = "checkEdit_yhk_Short"; this.checkEdit_yhk_Short.Properties.Caption = "Short"; @@ -755,7 +754,6 @@ // checkEdit_ichmoku_Long // this.checkEdit_ichmoku_Long.EditValue = true; - this.checkEdit_ichmoku_Long.Enabled = false; this.checkEdit_ichmoku_Long.Location = new System.Drawing.Point(6, 21); this.checkEdit_ichmoku_Long.Name = "checkEdit_ichmoku_Long"; this.checkEdit_ichmoku_Long.Properties.Caption = "Long"; @@ -765,7 +763,6 @@ // checkEdit_Ichmoku_Short // this.checkEdit_Ichmoku_Short.EditValue = true; - this.checkEdit_Ichmoku_Short.Enabled = false; this.checkEdit_Ichmoku_Short.Location = new System.Drawing.Point(6, 40); this.checkEdit_Ichmoku_Short.Name = "checkEdit_Ichmoku_Short"; this.checkEdit_Ichmoku_Short.Properties.Caption = "Short"; diff --git a/BitgetApi/MainForm.cs b/BitgetApi/MainForm.cs index 7691d32..2a4db9a 100644 --- a/BitgetApi/MainForm.cs +++ b/BitgetApi/MainForm.cs @@ -109,7 +109,7 @@ namespace BitgetAPI while (true) { - Thread.Sleep(500); + Thread.Sleep(300); if (!Is_th_th_MarketInfoList_WebService) break; // 마켓 모든 종목 캔들 정보 Web Service로 가져오기 @@ -135,8 +135,10 @@ namespace BitgetAPI // 지표 생성 및 신호 검색 (2) private void TreeListMarketInfoListUpdate( ) { + Is_th_treeListUpdate = true; + // 마켓 현황판 업데이트 - while(true) + while (true) { if (!Is_th_treeListUpdate) break;