From f9fa2cf77416d4761af5a3594559e5781cb2a6e7 Mon Sep 17 00:00:00 2001 From: kyh <1329522@naver.com> Date: Wed, 10 Jul 2024 10:15:32 +0900 Subject: [PATCH] =?UTF-8?q?=EC=99=9C=EC=95=88=EB=90=98=EC=A7=80=3F=20?= =?UTF-8?q?=EC=99=9C=20=EA=B0=92=20=EC=B2=98=EB=A6=AC=EA=B0=80=20=EB=8B=A4?= =?UTF-8?q?=EB=A5=B4=EC=A7=80=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IndicatorProcess.cs | 589 ++++++++++-------- 1 file changed, 346 insertions(+), 243 deletions(-) diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index a7ed31a..17cfea5 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -1,6 +1,7 @@ using BitgetApi.Data; using BitgetAPI.IndicatorConditionSetup; using DevExpress.Utils.IoC; +using DevExpress.XtraPrinting.Native; using System; using System.Collections.Generic; using System.ComponentModel; @@ -44,8 +45,8 @@ namespace BitgetAPI.IndicatorConditionSetup public Dictionary> BuyList = new Dictionary>(); //결과 리스트 public List> ResultList = new List>(); - - + public Dictionary 판매조건Flag = new Dictionary(); + public Dictionary 최초조건Flag = new Dictionary(); // 전봉이 구름떼 돌파후 시가가 구름떼 위에서 시작하는 것 // 전봉이 구름떼 하락후 시가가 구름떼 밑에서 시작하는 것 @@ -62,51 +63,29 @@ namespace BitgetAPI.IndicatorConditionSetup // 추후 공통화 및 소스정리 필요 while (true) { - if (!Is_th_SignalInfo) break; - //Thread.Sleep(200); - var nowTime = DateTime.Now; - - // 특정 시간 이후 삭제 - foreach (var item in signals_LU.ToList()) + try { - // 시간 지나면 삭제 - if (item.SignalStart + sesstionTime < nowTime) + if (!Is_th_SignalInfo) break; + //Thread.Sleep(200); + var nowTime = DateTime.Now; + + // 특정 시간 이후 삭제 + foreach (var item in signals_LU.ToList()) { - signals_LU.Remove(item); - continue; - - } - - var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == item.MarketName); - var lastCandleData = findedMarket.candleDataList[item.MCandleTimeType].OrderBy(i => i.Argument).ToList().Last(); - - if (lastCandleData.IchimokData != null) - { - if (checked구름떼상향돌파 || 영호조건식_상향돌파) + // 시간 지나면 삭제 + if (item.SignalStart + sesstionTime < nowTime) { - item.Price = lastCandleData.Close; - item.Rate = (lastCandleData.Close / lastCandleData.Open) * 100 - 100; - item.IndicatorRate = (lastCandleData.Close / item.IndicatorPrice) * 100 - 100; + signals_LU.Remove(item); + continue; + } - } - } - foreach (var item in signals_SD.ToList()) - { - // 시간 지나면 삭제 - if (item.SignalStart + sesstionTime < nowTime) - { - signals_SD.Remove(item); - continue; - } + var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == item.MarketName); + var lastCandleData = findedMarket.candleDataList[item.MCandleTimeType].OrderBy(i => i.Argument).ToList().Last(); - var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == item.MarketName); - var candleDataList = findedMarket.candleDataList[item.MCandleTimeType].OrderBy(i => i.Argument).ToList(); - if(candleDataList != null && candleDataList.Count > 0) { - var lastCandleData = candleDataList.Last(); if (lastCandleData.IchimokData != null) { - if (checked구름떼하향돌파 || 영호조건식_하향돌파) + if (checked구름떼상향돌파 || 영호조건식_상향돌파) { item.Price = lastCandleData.Close; item.Rate = (lastCandleData.Close / lastCandleData.Open) * 100 - 100; @@ -114,181 +93,78 @@ namespace BitgetAPI.IndicatorConditionSetup } } } - } - foreach (var item in signals_LD.ToList()) - if (item.SignalStart + sesstionTime < nowTime) signals_SU.Remove(item); - foreach (var item in signals_SU.ToList()) - if (item.SignalStart + sesstionTime < nowTime) signals_SD.Remove(item); - - // 체크된 마켓 정보 - foreach (string market in checkedMarkets) - { - var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == market); - - foreach (CommonProperty.MCandleTimeType interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType))) + foreach (var item in signals_SD.ToList()) { - // Description - var strInterval = Utils.Convertor.GetEnumDescription((Enum)interval); - if (!intervalList.Contains(strInterval)) continue; - - // 시간별로 정렬하기 (임시 리스트) - var candleDatas = findedMarket.candleDataList[interval]; - var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); - - var candleData = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); - - if (candleData == null) continue; - - ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData); - - candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); - var candleData_전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); - - ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전봉); - - - if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선 - && candleData.Close > candleData.IchimokData.상한선) + // 시간 지나면 삭제 + if (item.SignalStart + sesstionTime < nowTime) { - - 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} 구름떼 상승", 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); - } + signals_SD.Remove(item); + continue; } - else if (checked구름떼상향돌파 && candleData_전봉.Open > candleData_전봉.IchimokData.하한선 && candleData.Open < candleData.IchimokData.하한선 && candleData.High < candleData.IchimokData.하한선 - && candleData.Close < candleData.IchimokData.하한선) + + var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == item.MarketName); + var candleDataList = findedMarket.candleDataList[item.MCandleTimeType].OrderBy(i => i.Argument).ToList(); + if (candleDataList != null && candleDataList.Count > 0) { - 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} 구름떼 하락", strInterval); - var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); - - // 없으면 생성 - if (signalData == null) + var lastCandleData = candleDataList.Last(); + if (lastCandleData.IchimokData != 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); + if (checked구름떼하향돌파 || 영호조건식_하향돌파) + { + item.Price = lastCandleData.Close; + item.Rate = (lastCandleData.Close / lastCandleData.Open) * 100 - 100; + item.IndicatorRate = (lastCandleData.Close / item.IndicatorPrice) * 100 - 100; + } } } + } + foreach (var item in signals_LD.ToList()) + if (item.SignalStart + sesstionTime < nowTime) signals_SU.Remove(item); + foreach (var item in signals_SU.ToList()) + if (item.SignalStart + sesstionTime < nowTime) signals_SD.Remove(item); - if (영호조건식_상향돌파 || 영호조건식_하향돌파) + // 체크된 마켓 정보 + foreach (string market in checkedMarkets) + { + var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == market); + var enumList = Enum.GetValues(typeof(CommonProperty.MCandleTimeType)); + Array.Reverse(enumList); + + foreach (CommonProperty.MCandleTimeType interval in enumList) { + // Description + var strInterval = Utils.Convertor.GetEnumDescription((Enum)interval); + if (!intervalList.Contains(strInterval)) continue; + + // 시간별로 정렬하기 (임시 리스트) + var candleDatas = findedMarket.candleDataList[interval]; + var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); + + var candleData = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); + + if (candleData == null) continue; + + ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData); + candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); - var candleData_전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); + var candleData_전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전봉); - - // 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); - - // 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); - - // 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); - var 전봉4 = candleData_전봉.movingAverageDataList[4].Value; - var 전봉24 = candleData_전봉.movingAverageDataList[24].Value; - var 전봉72 = candleData_전봉.movingAverageDataList[72].Value; - var 현재봉4 = candleData.movingAverageDataList[4].Value; - var 현재봉24 = candleData.movingAverageDataList[24].Value; - var 현재봉72 = candleData.movingAverageDataList[72].Value; - - var 전봉Bol4 = candleData_전봉.movingAverageDataList[4].BolangerValue; - var 전봉Bol12 = candleData_전봉.movingAverageDataList[12].BolangerValue; - var 전봉Bol24 = candleData_전봉.movingAverageDataList[24].BolangerValue; - - var 전전봉Bol4 = candleData_전전봉.movingAverageDataList[4].BolangerValue; - var 전전봉Bol12 = candleData_전전봉.movingAverageDataList[12].BolangerValue; - var 전전봉Bol24 = candleData_전전봉.movingAverageDataList[24].BolangerValue; - var Bol12 = candleData.movingAverageDataList[12].BolangerValue; - var Bol24 = candleData.movingAverageDataList[24].BolangerValue; - - ////볼랜저 12 24중 12가 크고 전전봉 전봉 12 차이보다 전전봉 전봉 24가 작아야함(하향) - //var data12 = 전봉Bol12 - 전전봉Bol12 > 0 - // ? 전봉Bol12 - 전전봉Bol12 : - // (전봉Bol12 - 전전봉Bol12) * -1; + ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전봉); - //var data24 = 전봉Bol24 - 전전봉Bol24 > 0 - // ? 전봉Bol24 - 전전봉Bol24 : - // (전봉Bol24 - 전전봉Bol24) * -1; - - //var buyFlag = 전봉Bol12 - 전봉Bol24 > Bol12 - Bol24 && 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24; - - - //var sellFlag = 전봉Bol12 - 전봉Bol24 < Bol12 - Bol24 || 현재봉4 > 낮은값_74_24; - - var buyFlag = 전전봉Bol4 > 전봉Bol4 && - 전봉Bol4 > 전봉Bol12 && - 전봉Bol12 > 전봉Bol24 && - 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24; - - //파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜 - var sellFlag = 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24 || 전봉4 > 낮은값_74_24_전봉; - - //파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜 - //var buyFlag = candleData_전봉.movingAverageDataList[12].BolangerValue > candleData_전봉.movingAverageDataList[24].BolangerValue && 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24; - - ////파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜 - //var sellFlag = 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24 || 현재봉4 > 낮은값_74_24; - - - 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 (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선 + && candleData.Close > candleData.IchimokData.상한선) { + 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 description = string.Format("{0} 구름떼 상승", strInterval); var signalData = signals_LU.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); // 없으면 생성 @@ -306,15 +182,17 @@ namespace BitgetAPI.IndicatorConditionSetup signals_LU.Add(signalInfoData); } + } - else if (영호조건식_하향돌파) + else if (checked구름떼상향돌파 && candleData_전봉.Open > candleData_전봉.IchimokData.하한선 && candleData.Open < candleData.IchimokData.하한선 && candleData.High < candleData.IchimokData.하한선 + && candleData.Close < candleData.IchimokData.하한선) { 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 description = string.Format("{0} 구름떼 하락", strInterval); var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); // 없으면 생성 @@ -332,57 +210,278 @@ namespace BitgetAPI.IndicatorConditionSetup signals_SD.Add(signalInfoData); } - try - { - //사는 시점 - if (!BuyList.ContainsKey(market + interval)) - { - if ((candleData_전전봉.movingAverageDataList[4].Value > 낮은값_74_24_전전봉 - && candleData_전전봉.movingAverageDataList[4].Value < 높은값_74_24_전전봉) && - // 현재의 4가 74,21 보다 작고나서 - (candleData_전봉.movingAverageDataList[4].Value < 낮은값_74_24_전봉 && - 낮은값_74_24_전봉 < candleData.IchimokData.하한선) && - //볼랜저 12 24중 12가 크고 전전봉 전봉 12 차이보다 전전봉 전봉 24가 작아야함(하향) - buyFlag) - { - var buyDic = new Dictionary - { - { "MarketName", market }, - { "BuyDate", nowTime }, - { "Price", price }, - { "MCandleTimeType", (int)interval }, - { "Candle", candleData } - }; + } - BuyList.Add(market + interval, buyDic); - } - } - //파는 시점 - else + 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_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); + + // 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); + + // 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); + + var 전전봉4 = candleData_전전봉.movingAverageDataList[4].Value; + var 전전봉24 = candleData_전전봉.movingAverageDataList[24].Value; + var 전전봉72 = candleData_전전봉.movingAverageDataList[72].Value; + var 전봉4 = candleData_전봉.movingAverageDataList[4].Value; + var 전봉24 = candleData_전봉.movingAverageDataList[24].Value; + var 전봉72 = candleData_전봉.movingAverageDataList[72].Value; + var 현재봉4 = candleData.movingAverageDataList[4].Value; + var 현재봉12 = candleData.movingAverageDataList[12].Value; + var 현재봉24 = candleData.movingAverageDataList[24].Value; + var 현재봉72 = candleData.movingAverageDataList[72].Value; + + var 전봉Bol4 = candleData_전봉.movingAverageDataList[4].BolangerValue; + var 전봉Bol12 = candleData_전봉.movingAverageDataList[12].BolangerValue; + var 전봉Bol24 = candleData_전봉.movingAverageDataList[24].BolangerValue; + + var 전전봉Bol4 = candleData_전전봉.movingAverageDataList[4].BolangerValue; + var 전전봉Bol12 = candleData_전전봉.movingAverageDataList[12].BolangerValue; + var 전전봉Bol24 = candleData_전전봉.movingAverageDataList[24].BolangerValue; + var Bol4 = candleData.movingAverageDataList[4].BolangerValue; + var Bol12 = candleData.movingAverageDataList[12].BolangerValue; + var Bol24 = candleData.movingAverageDataList[24].BolangerValue; + + ////볼랜저 12 24중 12가 크고 전전봉 전봉 12 차이보다 전전봉 전봉 24가 작아야함(하향) + //var data12 = 전봉Bol12 - 전전봉Bol12 > 0 + // ? 전봉Bol12 - 전전봉Bol12 : + // (전봉Bol12 - 전전봉Bol12) * -1; + + + //var data24 = 전봉Bol24 - 전전봉Bol24 > 0 + // ? 전봉Bol24 - 전전봉Bol24 : + // (전봉Bol24 - 전전봉Bol24) * -1; + + //var buyFlag = 전봉Bol12 - 전봉Bol24 > Bol12 - Bol24 && 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24; + + + //var sellFlag = 전봉Bol12 - 전봉Bol24 < Bol12 - Bol24 || 현재봉4 > 낮은값_74_24; + + + var buyFlag = 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4 && 현재봉12 > 낮은값_74_24; + + //파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜 + //var sellFlag = 전봉Bol12 - 전봉Bol24 < Bol12 - Bol24 || 현재봉4 > 낮은값_74_24; + //var sellFlag = 현재봉4 > 낮은값_74_24 || 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24; + var sellFlag = 현재봉4 > 낮은값_74_24 || 현재봉12 < 현재봉4; ; + //파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜 + //var buyFlag = candleData_전봉.movingAverageDataList[12].BolangerValue > candleData_전봉.movingAverageDataList[24].BolangerValue && 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24; + + ////파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜 + //var sellFlag = 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24 || 현재봉4 > 낮은값_74_24; + + + 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_LU.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); + + // 없으면 생성 + if (signalData == null) { - var buyItem = BuyList[market + interval]; - if (interval < MCandleTimeType.H1) + 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 (영호조건식_하향돌파) + { + 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); + } + try + { + if ((int)interval != 3) { - if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval)) + continue; + } + //30분봉 관련 처리 + var candleDatas30 = findedMarket.candleDataList[MCandleTimeType.M30]; + var candleDatas30_정렬 = candleDatas30.OrderBy(i => i.Argument).ToList(); + + var candleData30 = candleDatas30.Find(i => i.Argument == candleDatas30_정렬.Last().Argument); + if (candleData30 == null) continue; + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas30_정렬, candleData30); + ichimokuConditionSetup.calIchimokuData(candleDatas30_정렬, candleData30); + + + candleDatas30_정렬.RemoveAt(candleDatas30_정렬.Count - 1); + var candleData30_전봉 = candleDatas30.Find(i => i.Argument == candleDatas30_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas30_정렬, candleData30_전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas30_정렬, candleData30_전봉); + + candleDatas30_정렬.RemoveAt(candleDatas30_정렬.Count - 1); + var candleData30_전전봉 = candleDatas30.Find(i => i.Argument == candleDatas30_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas30_정렬, candleData30_전전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas30_정렬, candleData30_전전봉); + + + var 낮은값30_74_24 = Math.Min(candleData30.movingAverageDataList[72].Value, candleData30.movingAverageDataList[24].Value); + var 높은값30_74_24 = Math.Max(candleData30.movingAverageDataList[72].Value, candleData30.movingAverageDataList[24].Value); + + var 전봉낮은값30_74_24 = Math.Min(candleData30_전봉.movingAverageDataList[72].Value, candleData30_전봉.movingAverageDataList[24].Value); + var 전봉높은값30_74_24 = Math.Max(candleData30_전봉.movingAverageDataList[72].Value, candleData30_전봉.movingAverageDataList[24].Value); + var 전전봉낮은값30_74_24 = Math.Min(candleData30_전전봉.movingAverageDataList[72].Value, candleData30_전전봉.movingAverageDataList[24].Value); + var 전전봉높은값30_74_24 = Math.Max(candleData30_전전봉.movingAverageDataList[72].Value, candleData30_전전봉.movingAverageDataList[24].Value); + + var 현재봉30_12 = candleData30.movingAverageDataList[12].Value; + var 전봉30_12 = candleData30_전봉.movingAverageDataList[12].Value; + var 전전봉30_12 = candleData30_전전봉.movingAverageDataList[12].Value; + + var 현재봉30_4 = candleData30.movingAverageDataList[4].Value; + var 전봉30_4 = candleData30_전봉.movingAverageDataList[4].Value; + var 전전봉30_4 = candleData30_전전봉.movingAverageDataList[4].Value; + + var 전봉30Bol4 = candleData30_전봉.movingAverageDataList[4].BolangerValue; + var 전봉30Bol12 = candleData30_전봉.movingAverageDataList[12].BolangerValue; + var 전봉30Bol24 = candleData30_전봉.movingAverageDataList[24].BolangerValue; + + var 전전봉30Bol4 = candleData30_전전봉.movingAverageDataList[4].BolangerValue; + var 전전봉30Bol12 = candleData30_전전봉.movingAverageDataList[12].BolangerValue; + var 전전봉30Bol24 = candleData30_전전봉.movingAverageDataList[24].BolangerValue; + var 현재봉30Bol4 = candleData30.movingAverageDataList[4].BolangerValue; + var 현재봉30Bol12 = candleData30.movingAverageDataList[12].BolangerValue; + var 현재봉30Bol24 = candleData30.movingAverageDataList[24].BolangerValue; + + var candle30Flag = 현재봉30_4 < 낮은값30_74_24 && 현재봉30_4 < 현재봉30_12 && + candleData30.IchimokData.상한선 > 낮은값30_74_24 && + //candleData30.Close < candleData30.IchimokData.하한선 && + 전전봉30Bol4 > 전봉30Bol4 && 전봉30_12 < 전전봉30_12; + //전전봉30Bol12 - 전전봉30Bol24 > 전봉30Bol12 - 전봉30Bol24; + //(전봉30_4 > 전봉낮은값30_74_24 || 전전봉30_4 > 전전봉낮은값30_74_24); + + //사는 시점 + if (!BuyList.ContainsKey(market + interval)) + { + if ((전봉4 > 낮은값_74_24_전봉 + && 전봉4 < 높은값_74_24_전봉) && + // 현재의 4가 74,21 보다 작고나서 + (현재봉4 < 낮은값_74_24 && + candleData.Close < candleData.IchimokData.상한선 && + 높은값_74_24 < candleData.IchimokData.상한선) && + 최초조건Flag.ContainsKey(market + interval) && 최초조건Flag[market + interval] == true && + //볼랜저 12 24중 12가 크고 전전봉 전봉 12 차이보다 전전봉 전봉 24가 작아야함(하향) + buyFlag && + candle30Flag) { - continue; + + var buyDic = new Dictionary + { + { "MarketName", market }, + { "BuyDate", nowTime }, + { "Price", price }, + { "MCandleTimeType", (int)interval }, + { "Candle", candleData } + }; + + BuyList.Add(market + interval, buyDic); + 최초조건Flag[market + interval] = false; + if (현재봉4 > 현재봉12) + { + 판매조건Flag[market + interval] = false; + } + else + { + 판매조건Flag[market + interval] = true; + } + + } + else + { + if(현재봉30_12 > 전봉30_12) + 최초조건Flag[market + interval] = true; } } - //임시로 처리 + //파는 시점 else { - if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours((int)interval)) + var buyItem = BuyList[market + interval]; + if (interval < MCandleTimeType.H1) { - continue; + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval)) + { + continue; + } + } + //임시로 처리 + else + { + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours((int)interval)) + { + continue; + } + } + if(현재봉4 < 현재봉12 && !판매조건Flag[market + interval]) + { + 판매조건Flag[market + interval] = true; } - } - if (sellFlag) - { - double.TryParse(buyItem["Price"].ToString(), out var buyPrice); - var resultRate = ((price - buyPrice) / buyPrice) * 100; + if(!판매조건Flag[market + interval]) + { + sellFlag = 현재봉4 > 낮은값_74_24; + } - var result = new Dictionary() + if (sellFlag) + { + + double.TryParse(buyItem["Price"].ToString(), out var buyPrice); + var resultRate = ((price - buyPrice) / buyPrice) * 100; + + var result = new Dictionary() { { "MarketName", market }, { "BuyDate", buyItem["BuyDate"]}, @@ -395,23 +494,28 @@ namespace BitgetAPI.IndicatorConditionSetup { "Rate", resultRate } }; - ResultList.Add(result); - BuyList.Remove(market + interval); + ResultList.Add(result); + BuyList.Remove(market + interval); + } } } - } - catch (Exception e) - { + catch (Exception e) + { + } } } } } } - + catch (Exception e) + { + + } } } + public void calIchimokuProcess_Add() { @@ -423,5 +527,4 @@ namespace BitgetAPI.IndicatorConditionSetup } } -} - +} \ No newline at end of file