From 9d314135791157834194631fa30005d4f67625e0 Mon Sep 17 00:00:00 2001 From: kyh <1329522@naver.com> Date: Fri, 31 Jan 2025 12:05:21 +0900 Subject: [PATCH] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IndicatorProcess.cs | 244 +++++++++--------- 1 file changed, 122 insertions(+), 122 deletions(-) diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 93a3eb8..c2c735e 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -76,7 +76,7 @@ namespace BitgetAPI.IndicatorConditionSetup // 스레드 시작/종료 플래그 public bool Is_th_SignalInfo; public Dictionary> 전저고점 = new Dictionary>(); - + public List checkedMarkets; public List intervalList; @@ -127,7 +127,7 @@ namespace BitgetAPI.IndicatorConditionSetup public Dictionary BuyShortStep = new Dictionary(); public Dictionary BuyLongStep = new Dictionary(); - + public int 전가Flag = 1; @@ -158,7 +158,7 @@ namespace BitgetAPI.IndicatorConditionSetup //var sellData = FutureOrder("XRPUSDT", FutureMarginMode.isolated, 10, 0, FutureSide.SellShort, OrderType.market, 10, orderDic["orderId"]); - var firstFlag = true; + // 추후 공통화 및 소스정리 필요 while (true) { @@ -272,25 +272,28 @@ namespace BitgetAPI.IndicatorConditionSetup candleDatas_Temp_List.Add(candleData_Main); ichimokuConditionSetup.calIchimokuData(candleDatas_Temp_List, candleData_Main); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_Temp_List, candleData_Main); - if(i > 210) + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_Temp_List, candleData_Main); + if (i > 210) { var 현재봉3_Temp = candleDatas_Temp_List[i].movingAverageDataList[3].Value; - var 전봉3_Temp = candleDatas_Temp_List[i-1].movingAverageDataList[3].Value; - var 전전봉3_Temp = candleDatas_Temp_List[i-2].movingAverageDataList[3].Value; - var 전전전봉3_Temp = candleDatas_Temp_List[i-3].movingAverageDataList[3].Value; + var 전봉3_Temp = candleDatas_Temp_List[i - 1].movingAverageDataList[3].Value; + var 전전봉3_Temp = candleDatas_Temp_List[i - 2].movingAverageDataList[3].Value; + var 전전전봉3_Temp = candleDatas_Temp_List[i - 3].movingAverageDataList[3].Value; var returnVal = Calculate전고점(market, strInterval, interval, 전봉3_Temp, 전전봉3_Temp, 전전전봉3_Temp, candleDatas_Temp_List[candleDatas_Temp_List.Count - 1]); } - } + } } - if (!BuyShortStep.ContainsKey(market + strInterval)) { + if (!BuyShortStep.ContainsKey(market + strInterval)) + { BuyShortStep[market + strInterval] = false; BuyLongStep[market + strInterval] = false; } - - #region Main 처리 + if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m"))) + continue; + + #region 1분봉 처리 // 시간별로 정렬하기 (임시 리스트) var candleDatas = findedMarket.candleDataList[MCandleTimeType.M1]; var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); @@ -509,7 +512,6 @@ namespace BitgetAPI.IndicatorConditionSetup var 전전봉80 = candleData_전전봉.movingAverageDataList[80].Value; //var 전전봉480 = candleData_전전봉.movingAverageDataList[480].Value; - var 전봉3 = candleData_전봉.movingAverageDataList[3].Value; var 전봉4 = candleData_전봉.movingAverageDataList[4].Value; var 전봉8 = candleData_전봉.movingAverageDataList[8].Value; @@ -579,13 +581,12 @@ namespace BitgetAPI.IndicatorConditionSetup var 전전봉3_5 = candleData_5_전전봉.movingAverageDataList[3].Value; var 전전전봉3_5 = candleData_5_전전전봉.movingAverageDataList[3].Value; - var 현재봉3_30 = candleData_5.movingAverageDataList[3].Value; + var 현재봉3_30 = candleData_30.movingAverageDataList[3].Value; var 전봉3_30 = candleData_30_전봉.movingAverageDataList[3].Value; var 전전봉3_30 = candleData_30_전전봉.movingAverageDataList[3].Value; var 전전전봉3_30 = candleData_30_전전전봉.movingAverageDataList[3].Value; - if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m"))) - continue; + var 저고점_1 = 전저고점[market + "1m"]; var 저고점_5 = 전저고점[market + "5m"]; @@ -609,28 +610,29 @@ namespace BitgetAPI.IndicatorConditionSetup var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); //전 저점 계산 - + try - { + { //사는 시점 - if (!UpBuyList.ContainsKey(market + interval)) + if (!UpBuyList.ContainsKey(market)) { - if ((int)interval != 1) - { - continue; - } + var buyFlag = false; // 30분봉 - var flag_30 = (저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] < 저고점_30["전저가"] && 현재봉3_30 > 저고점_30["전저가"]) - || (저고점_30["전전저가"] > 저고점_30["전저가"] && candleData_30.High > 저고점_30["전고가"]); + var flag_30 = (저고점_30["전전전저가"] > 저고점_30["전전저가"] + && (저고점_30["전전저가"] < 전봉3 && 저고점_30["전전저가"] < 전전봉3 && 저고점_30["전전저가"] < 현재봉3 && 전전봉3 > 전봉3 && 전봉3 < 현재봉3) + && 현재봉3_30 > 저고점_30["전고가"]) + || (저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] < 저고점_30["전저가"] && 현재봉3_30 > 저고점_30["전고가"]) + || (저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] > 저고점_30["전저가"] && 현재봉3_30 > 저고점_30["전고가"]); - var flag_5 = (저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] < 저고점_5["전저가"] && candleData_5.High > 저고점_5["전고가"]) - || (저고점_5["전전저가"] > 저고점_5["전저가"] && candleData_5.High > 저고점_5["전고가"]); + var flag_5 = (저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] < 저고점_5["전저가"] && 현재봉3_5 > 저고점_5["전고가"]) + || (저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] > 저고점_5["전저가"] && 현재봉3_5 > 저고점_5["전고가"]); var flag_1 = 현재봉3 > 현재봉24 && 현재봉3 > 현재봉48 && 현재봉3 > 현재봉72 && 현재봉3 > 현재봉120; - if (flag_30 && flag_5 && flag_1) { + if (flag_30 && flag_5 && flag_1) + { buyFlag = true; } @@ -657,13 +659,13 @@ namespace BitgetAPI.IndicatorConditionSetup { { "MarketName", market }, { "BuyDate", nowTime }, - { "Price", price }, + { "Price", price }, { "MCandleTimeType", (int)interval }, - { "CandleTime", candleData.Argument }, + { "CandleTime", candleData.Argument }, { "Candle", candleData } }; - UpBuyList.Add(market + interval, buyDic); + UpBuyList.Add(market, buyDic); var dic = new Dictionary { @@ -673,7 +675,7 @@ namespace BitgetAPI.IndicatorConditionSetup [4] = false, [5] = false }; - SellLongStep.Add(market + interval, dic); + SellLongStep.Add(market, dic); if (LongCount < 5) { double size = YHKIM_OrderAmount / price * YHKIM_Leverage; @@ -698,16 +700,13 @@ namespace BitgetAPI.IndicatorConditionSetup } } } + //파는 시점 else { - if ((int)interval != 30) - { - continue; - } - var buyItem = UpBuyList[market + interval]; - var flag = (bool)buyItem["Flag"]; + var buyItem = UpBuyList[market]; + if (interval < MCandleTimeType.H1) { var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); @@ -723,7 +722,7 @@ namespace BitgetAPI.IndicatorConditionSetup } var sellFlag = false; - if (저고점_30["전저가"] > 현재봉3) + if (저고점_30["전저가"] > 전봉3 || 저고점_30["전고가"] < 저고점_30["전전고가"]) sellFlag = true; @@ -731,7 +730,7 @@ namespace BitgetAPI.IndicatorConditionSetup { double.TryParse(buyItem["Price"].ToString(), out var buyPrice); var resultRate = ((price - buyPrice) / buyPrice) * 100; - BuyLongStep[market + interval] = false; + BuyLongStep[market] = false; var result = new Dictionary() { { "MarketName", market }, @@ -747,8 +746,8 @@ namespace BitgetAPI.IndicatorConditionSetup }; UpResultList.Add(result); - UpBuyList.Remove(market + interval); - SellLongStep.Remove(market + interval); + UpBuyList.Remove(market); + SellLongStep.Remove(market); var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market); @@ -792,6 +791,7 @@ namespace BitgetAPI.IndicatorConditionSetup } } + } } @@ -813,75 +813,77 @@ namespace BitgetAPI.IndicatorConditionSetup try { //사는 시점 - if (!DownBuyList.ContainsKey(market + interval)) + if (!DownBuyList.ContainsKey(market)) { - if ((int)interval != 1) - { - continue; - } + + var buyFlag = false; - var buyFlag = false; + //var flag_30 = (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전저가"]) + // || (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전저가"]); - var flag_30 = (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전고가"]) - || (저고점_30["전전고가"] < 저고점_30["전고가"] && candleData_30.Low < 저고점_30["전저가"]); + var flag_30 = (저고점_30["전전전고가"] < 저고점_30["전전고가"] + && (저고점_30["전전고가"] > 전봉3 && 저고점_30["전전고가"] > 전전봉3 && 저고점_30["전전고가"] > 현재봉3 && 전전봉3 < 전봉3 && 전봉3 > 현재봉3) + && 현재봉3_30 < 저고점_30["전저가"]) + || (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전저가"]) + || (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전저가"]); - var flag_5 = (저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] > 저고점_5["전고가"] && candleData_5.Low < 저고점_5["전저가"]) - || (저고점_5["전전고가"] < 저고점_5["전고가"] && candleData_5.Low < 저고점_5["전저가"]); + var flag_5 = (저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] > 저고점_5["전고가"] && 현재봉3_5 < 저고점_5["전저가"]) + || (저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] < 저고점_5["전고가"] && 현재봉3_5 < 저고점_5["전저가"]); - var flag_1 = 현재봉3 < 현재봉24 && 현재봉3 < 현재봉48 && 현재봉3 < 현재봉72 && 현재봉3 < 현재봉120; + var flag_1 = 현재봉3 < 현재봉24 && 현재봉3 < 현재봉48 && 현재봉3 < 현재봉72 && 현재봉3 < 현재봉120; - if (flag_30 && flag_5 && flag_1) - { - buyFlag = true; - } - - if (buyFlag) - { - // 없으면 생성 - if (signalData == null) + if (flag_30 && flag_5 && flag_1) { - 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); + buyFlag = true; } - var buyDic = new Dictionary + + if (buyFlag) + { + // 없으면 생성 + 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); + } + var buyDic = new Dictionary { { "MarketName", market }, { "BuyDate", nowTime }, { "Price", price }, - { "MCandleTimeType", (int)interval }, - { "CandleTime", candleData.Argument }, + { "MCandleTimeType", (int)interval }, + { "CandleTime", candleData.Argument }, { "Candle", candleData } }; - DownBuyList.Add(market + interval, buyDic); - var dic = new Dictionary - { - [1] = true, - [2] = false, - [3] = false, - [4] = false, - [5] = false - }; - SellShortStep.Add(market + interval, dic); - - if (ShortCount < 5) - { - double size = YHKIM_OrderAmount / price * YHKIM_Leverage; - var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage); - if (orderData != null) + DownBuyList.Add(market, buyDic); + var dic = new Dictionary { - var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); + [1] = true, + [2] = false, + [3] = false, + [4] = false, + [5] = false + }; + SellShortStep.Add(market, dic); - var orderDataDic = new Dictionary + if (ShortCount < 5) + { + double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage); + if (orderData != null) + { + var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); + + var orderDataDic = new Dictionary { { "MarketName", market }, { "BuyDate", nowTime }, @@ -891,24 +893,19 @@ namespace BitgetAPI.IndicatorConditionSetup { "Size", size }, { "orderId", orderDic["orderId"] } }; - BuyShortList.Add(orderDataDic); - ShortCount++; + BuyShortList.Add(orderDataDic); + ShortCount++; + } } } + } - } + //파는 시점 else - { - if ((int)interval != 30) - { - continue; - } - - var sellFlag = false; - var buyItem = DownBuyList[market + interval]; - var flag = (bool)buyItem["Flag"]; - + { + var buyItem = DownBuyList[market]; + if (interval < MCandleTimeType.H1) { var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); @@ -922,13 +919,15 @@ namespace BitgetAPI.IndicatorConditionSetup if (nowTime < buyTime) continue; } + var sellFlag = false; - if (저고점_30["전고가"] < 현재봉3) + if (저고점_30["전고가"] < 전봉3 || 저고점_30["전저가"] > 저고점_30["전전저가"]) sellFlag = true; + if (sellFlag) { - BuyShortStep[market + interval] = false; + BuyShortStep[market] = false; double.TryParse(buyItem["Price"].ToString(), out var buyPrice); var resultRate = ((price - buyPrice) / buyPrice) * 100; @@ -947,8 +946,8 @@ namespace BitgetAPI.IndicatorConditionSetup }; DownResultList.Add(result); - DownBuyList.Remove(market + interval); - SellShortStep.Remove(market + interval); + DownBuyList.Remove(market); + SellShortStep.Remove(market); var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market); if (orderDic != null) @@ -993,6 +992,7 @@ namespace BitgetAPI.IndicatorConditionSetup } } } + } catch (Exception e) { @@ -1017,11 +1017,11 @@ namespace BitgetAPI.IndicatorConditionSetup //전저가 if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 && - 저고점["tempLowVal"] != candleData.Argument.Hour * 60 + candleData.Argument.Minute && - (candleData.Argument.Hour * 60 + candleData.Argument.Minute) - 저고점["tempHighVal"] > 2 * (int)type) + 저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && + ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] >= 120 * (int)type) { 저고점["tempLow2Val"] = 저고점["tempLowVal"]; - 저고점["tempLowVal"] = candleData.Argument.Hour * 60 + candleData.Argument.Minute; + 저고점["tempLowVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds(); 저고점["switchLowVal"] = 저고점["전전전전저가"]; 저고점["전전전전저가"] = 저고점["전전저가"]; 저고점["전전전저가"] = 저고점["전전저가"]; @@ -1030,8 +1030,8 @@ namespace BitgetAPI.IndicatorConditionSetup } else if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 && - 저고점["tempLowVal"] != candleData.Argument.Hour * 60 + candleData.Argument.Minute && - (candleData.Argument.Hour * 60 + candleData.Argument.Minute) - 저고점["tempHighVal"] <= 2 * (int)type) + 저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && + ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] < 120 * (int)type) { //이전으로 초기화 작업(High) 저고점["전고가"] = 저고점["전전고가"]; @@ -1046,11 +1046,11 @@ namespace BitgetAPI.IndicatorConditionSetup //전고가 if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 && - 저고점["tempHighVal"] != candleData.Argument.Hour * 60 + candleData.Argument.Minute && - (candleData.Argument.Hour * 60 + candleData.Argument.Minute) - 저고점["tempLowVal"] > 2 * (int)type) + 저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && + ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] >= 120 * (int)type) { 저고점["tempHigh2Val"] = 저고점["tempHighVal"]; - 저고점["tempHighVal"] = candleData.Argument.Hour * 60 + candleData.Argument.Minute; + 저고점["tempHighVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds(); 저고점["switchHighVal"] = 저고점["전전전전고가"]; 저고점["전전전전고가"] = 저고점["전전전고가"]; 저고점["전전전고가"] = 저고점["전전고가"]; @@ -1058,8 +1058,8 @@ namespace BitgetAPI.IndicatorConditionSetup 저고점["전고가"] = 전전봉3; } else if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 && - 저고점["tempHighVal"] != candleData.Argument.Hour * 60 + candleData.Argument.Minute && - (candleData.Argument.Hour * 60 + candleData.Argument.Minute) - 저고점["tempLowVal"] < 2 * (int)type) + 저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && + ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] < 120 * (int)type) { //이전으로 초기화 작업(Low) 저고점["전저가"] = 저고점["전전저가"]; @@ -1070,7 +1070,7 @@ namespace BitgetAPI.IndicatorConditionSetup if (저고점["전고가"] < 전전봉3) 저고점["전고가"] = 전전봉3; - } + } if (저고점["전전전저가"] == 0 || 저고점["전전전고가"] == 0) return false;