From d9ad08d6ada675013333a90095f98013c2befa0f Mon Sep 17 00:00:00 2001 From: kyh <1329522@naver.com> Date: Mon, 11 Aug 2025 09:56:02 +0900 Subject: [PATCH] =?UTF-8?q?high=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IndicatorProcess.cs | 155 +++++++++--------- .../SMABandConditionSetup.cs | 26 ++- 2 files changed, 100 insertions(+), 81 deletions(-) diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 0abdb02..8fe5b05 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -230,88 +230,88 @@ namespace BitgetAPI.IndicatorConditionSetup // Description var strInterval = Utils.Convertor.GetEnumDescription((Enum)interval); if (!intervalList.Contains(strInterval)) continue; - /* - if (nowTime.Minute == 0 && nowTime.Hour == 24 && 전저고점Flag) - { - 전저고점.Clear(); - 전저고점Flag = false; - } + + //if (nowTime.Minute == 0 && nowTime.Hour == 24 && 전저고점Flag) + //{ + // 전저고점.Clear(); + // 전저고점Flag = false; + //} - if (!전저고점.ContainsKey(market + strInterval)) + if (!FirstFlag.ContainsKey(market + strInterval + "Long")) { FirstFlag.Add(market + strInterval + "Long", false); FirstFlag.Add(market + strInterval + "Short", false); - var dic = new Dictionary - { - { "전고가", 0 }, - { "전저가", 0 }, - { "전전고가", 0 }, - { "전전저가", 0 }, - { "전전전저가", 0 }, - { "전전전고가", 0 }, - { "전전전전저가", 0 }, - { "전전전전고가", 0 }, - { "tempHighVal", 0 }, - { "tempLowVal", 0 }, - { "tempHigh2Val", 0 }, - { "tempLow2Val", 0 }, - { "tempHigh3Val", 0 }, - { "tempLow3Val", 0 }, - { "tempHigh4Val", 0 }, - { "tempLow4Val", 0 }, - { "switchLowVal", 0 }, - { "switchHighVal", 0 } - }; + //var dic = new Dictionary + //{ + // { "전고가", 0 }, + // { "전저가", 0 }, + // { "전전고가", 0 }, + // { "전전저가", 0 }, + // { "전전전저가", 0 }, + // { "전전전고가", 0 }, + // { "전전전전저가", 0 }, + // { "전전전전고가", 0 }, + // { "tempHighVal", 0 }, + // { "tempLowVal", 0 }, + // { "tempHigh2Val", 0 }, + // { "tempLow2Val", 0 }, + // { "tempHigh3Val", 0 }, + // { "tempLow3Val", 0 }, + // { "tempHigh4Val", 0 }, + // { "tempLow4Val", 0 }, + // { "switchLowVal", 0 }, + // { "switchHighVal", 0 } + //}; - 전저고점.Add(market + strInterval, dic); + //전저고점.Add(market + strInterval, dic); - var candleDatas_Temp = findedMarket.candleDataList[interval]; - var candleDatas_정렬_Temp = candleDatas_Temp.OrderBy(i => i.Argument).ToList(); - var candleDatas_Temp_List = new List(); + //var candleDatas_Temp = findedMarket.candleDataList[interval]; + //var candleDatas_정렬_Temp = candleDatas_Temp.OrderBy(i => i.Argument).ToList(); + //var candleDatas_Temp_List = new List(); - totalImperseMACDData[market + strInterval] = new Dictionary(); + //totalImperseMACDData[market + strInterval] = new Dictionary(); - for (var i = 0; i < 199; i++) - candleDatas_Temp_List.Add(candleDatas_정렬_Temp[i]); + //for (var i = 0; i < 199; i++) + // candleDatas_Temp_List.Add(candleDatas_정렬_Temp[i]); - for (var i = 199; i < candleDatas_정렬_Temp.Count; i++) - { + //for (var i = 199; i < candleDatas_정렬_Temp.Count; i++) + //{ - var candleData_Main = candleDatas_정렬_Temp[i]; + // var candleData_Main = candleDatas_정렬_Temp[i]; - if (candleData_Main == null) continue; + // if (candleData_Main == null) continue; - candleDatas_Temp_List.Add(candleData_Main); + // candleDatas_Temp_List.Add(candleData_Main); - ichimokuConditionSetup.calIchimokuData(candleDatas_Temp_List, candleData_Main); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_Temp_List, candleData_Main); + // ichimokuConditionSetup.calIchimokuData(candleDatas_Temp_List, candleData_Main); + // movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_Temp_List, candleData_Main); - if (i > 210) - { - var 현재봉4_Temp = candleDatas_Temp_List[i].movingAverageDataList[4].Value; - var 전봉4_Temp = candleDatas_Temp_List[i - 1].movingAverageDataList[4].Value; - var 전전봉4_Temp = candleDatas_Temp_List[i - 2].movingAverageDataList[4].Value; - var 전전전봉4_Temp = candleDatas_Temp_List[i - 3].movingAverageDataList[4].Value; + // if (i > 210) + // { + // var 현재봉4_Temp = candleDatas_Temp_List[i].movingAverageDataList[4].Value; + // var 전봉4_Temp = candleDatas_Temp_List[i - 1].movingAverageDataList[4].Value; + // var 전전봉4_Temp = candleDatas_Temp_List[i - 2].movingAverageDataList[4].Value; + // var 전전전봉4_Temp = candleDatas_Temp_List[i - 3].movingAverageDataList[4].Value; - var returnVal = Calculate전고점(market, strInterval, interval, 전봉4_Temp, 전전봉4_Temp, 전전전봉4_Temp, candleDatas_Temp_List[candleDatas_Temp_List.Count - 1]); - } - } + // var returnVal = Calculate전고점(market, strInterval, interval, 전봉4_Temp, 전전봉4_Temp, 전전전봉4_Temp, candleDatas_Temp_List[candleDatas_Temp_List.Count - 1]); + // } + //} } - else { - if(nowTime.Minute > 0 && nowTime.Hour == 24) - 전저고점Flag = true; - } + //else { + // if(nowTime.Minute > 0 && nowTime.Hour == 24) + // 전저고점Flag = true; + //} + + //if (!BuyShortStep.ContainsKey(market)) + //{ + // BuyShortStep[market] = 0; + // BuyLongStep[market] = 0; + //} + //if (!(전저고점.ContainsKey(market + "30m"))) + // continue; - if (!BuyShortStep.ContainsKey(market)) - { - BuyShortStep[market] = 0; - BuyLongStep[market] = 0; - } - if (!(전저고점.ContainsKey(market + "30m"))) - continue; - */ #region 30분봉 처리 var candleDatas_30 = findedMarket.candleDataList[MCandleTimeType.M30]; @@ -375,16 +375,16 @@ namespace BitgetAPI.IndicatorConditionSetup //사는 시점 if (!UpBuyList.ContainsKey(market)) { - //if(!FirstFlag[market + strInterval + "Long"]) - //{ - // if(sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.LongSell, true)) - // { - // FirstFlag[market + strInterval + "Long"] = true; - // } - //} + if (!FirstFlag[market + strInterval + "Long"]) + { + if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.LongSell, true)) + { + FirstFlag[market + strInterval + "Long"] = true; + } + } if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.LongBuy, true) - //&& FirstFlag[market + strInterval + "Long"] + && FirstFlag[market + strInterval + "Long"] //&& 저고점["전저가"] > 저고점["전전저가"] ) @@ -575,10 +575,19 @@ namespace BitgetAPI.IndicatorConditionSetup { //사는 시점 if (!DownBuyList.ContainsKey(market)) - { + { + if (!FirstFlag[market + strInterval + "Short"]) + { + if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.ShortSell, true)) + { + FirstFlag[market + strInterval + "Short"] = true; + } + } - if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.ShortBuy, true)) + + if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.ShortBuy, true) + && FirstFlag[market + strInterval + "Short"]) { //BuyShortStep[market] = 0; // 없으면 생성 diff --git a/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs b/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs index 3536c87..8a9ecd7 100644 --- a/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs +++ b/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs @@ -89,20 +89,20 @@ namespace BitgetApi.IndicatorConditionSetup // 밴드 계산 double sma4High = Highest(close, i, 12, 4); - double sma4Middle = CalculateSMA(close, i, 12); + double sma4Middle = Middle(close, i, 12, 4); double sma4Low = Lowest(close, i, 12, 4); double prevSma4High = Highest(close, i - 1, 12, 4); - double prevSma4Middle = CalculateSMA(close, i - 1, 12); + double prevSma4Middle = Middle(close, i - 1, 12, 4); double prevSma4Low = Lowest(close, i - 1, 12, 4); double prev2Sma4High = Highest(close, i - 2, 12, 4); double prev2Sma4Low = Lowest(close, i - 2, 12, 4); - double prev2Sma4Middle = CalculateSMA(close, i - 2, 12); + double prev2Sma4Middle = Middle(close, i - 2, 12, 4); double prev3Sma4High = Highest(close, i - 3, 12, 4); double prev3Sma4Low = Lowest(close, i - 3, 12, 4); - double prev3Sma4Middle = CalculateSMA(close, i - 3, 12); + double prev3Sma4Middle = Middle(close, i - 3, 12, 4); var ichmok = GetIchimokuCloud(candles, i - 25); @@ -115,7 +115,7 @@ namespace BitgetApi.IndicatorConditionSetup var cloudBottomAfter = Math.Min(ichmokCurrent.SenkouSpanA, ichmokCurrent.SenkouSpanB); bool isSma4BelowCloud = low[i] < cloudBottomNow; - bool isSma4AboveCloud = high[i] > cloudTopNow; + bool isSma4AboveCloud = high[i] > cloudTopNow; bool greenCandle = open[i] < close[i]; bool redCandle = open[i] > close[i]; @@ -124,16 +124,19 @@ namespace BitgetApi.IndicatorConditionSetup for (var cnt = 0; cnt < 10; cnt++) - { - if (Lowest(close, i - cnt, 12, 4) == CalculateSMA(close, i - cnt, 12) && Lowest(close, i - cnt-1, 12, 4) <= CalculateSMA(close, i - cnt-1, 12)) + { + if (Lowest(close, i - cnt, 12, 4) == CalculateSMA(close, i - cnt, 12) && Lowest(close, i - cnt - 1, 12, 4) <= CalculateSMA(close, i - cnt - 1, 12)) { isLongRecentTouch = false; break; } } + //high 데이터 비교(기본 12개) + var highestTempData = Highest(high, i, 12, 1); + // 진입/청산 조건 - bool rawNewLong = isLongRecentTouch && greenCandle && IsSideways(high, low, i, true, rangeThresholdLongPercent) && prevSma4 <= sma4 && sma4High == sma4 && prevSma4High >= prevSma4 && (prev2Sma4Middle - prevSma4Middle) > (prevSma4Middle - sma4Middle) && sma4Middle > sma72 && sma4 > cloudTopNow; + bool rawNewLong = highestTempData == high[i] && isLongRecentTouch && greenCandle && IsSideways(high, low, i, true, rangeThresholdLongPercent) && prevSma4 <= sma4 && sma4High == sma4 && prevSma4High >= prevSma4 && (prev2Sma4Middle - prevSma4Middle) > (prevSma4Middle - sma4Middle) && sma4Middle > sma72 && sma4 > cloudTopNow; bool rawLongSell = (sma4Middle < sma72 && prevSma4Middle > prevSma72) || (sma4 == sma4Low); bool rawNewShort = (sma72 < cloudTopAfter && sma72 < cloudTopNow) && sma72 > sma4 && sma4High > cloudTopNow && sma4 == sma4Low && IsSideways(high, low, i, true, rangeThresholdShortPercent) && redCandle && sma4 < cloudTopNow; @@ -203,6 +206,13 @@ namespace BitgetApi.IndicatorConditionSetup } + private double Middle(List source, int index, int period, int num) + { + + return GetAvgList(source, index, period, num).Average(); + + } + private double Lowest(List source, int index, int period, int num) { return GetAvgList(source, index, period, num).Min();