From 5052acd4640ad35fc78987fe7b6becb4fecb87f3 Mon Sep 17 00:00:00 2001 From: kyh <1329522@naver.com> Date: Fri, 21 Mar 2025 12:42:48 +0900 Subject: [PATCH] =?UTF-8?q?1.=20Long=EC=9D=80=202=EA=B0=9C=20=EC=A0=80?= =?UTF-8?q?=EC=A0=90=20=EA=B3=A0=EC=A0=90=20=EB=AA=A8=EC=96=91=20+=20?= =?UTF-8?q?=EC=9D=B4=EC=A0=84=EC=97=90=20=EC=B0=8D=ED=9E=8C=20=EC=A0=90?= =?UTF-8?q?=EC=9D=B4=20=EC=A0=80=EC=A0=90=202.=20Short=EC=9D=80=202?= =?UTF-8?q?=EA=B0=9C=20=EC=A0=80=EC=A0=90=20=EA=B3=A0=EC=A0=90=20=EB=AA=A8?= =?UTF-8?q?=EC=96=91=20+=20=EC=9D=B4=EC=A0=84=EC=97=90=20=EC=B0=8D?= =?UTF-8?q?=ED=9E=8C=20=EC=A0=90=EC=9D=B4=20=EA=B3=A0=EC=A0=90=20+=202?= =?UTF-8?q?=EA=B0=9C=20=EC=A0=80=EC=A0=90=201=EA=B0=9C=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=90=20=EC=9D=B4=EC=A0=84=EB=B4=89=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=ED=8C=A8=ED=84=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 | 1305 ++++++++--------- 1 file changed, 643 insertions(+), 662 deletions(-) diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 3db78bc..561cb62 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -126,7 +126,7 @@ namespace BitgetAPI.IndicatorConditionSetup public Dictionary BuyShortStep = new Dictionary(); public Dictionary BuyLongStep = new Dictionary(); - + public int 전가Flag = 1; @@ -278,22 +278,23 @@ namespace BitgetAPI.IndicatorConditionSetup movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_Temp_List, candleData_Main); if (i > 210) { - var 현재봉5_Temp = candleDatas_Temp_List[i].movingAverageDataList[5].Value; - var 전봉5_Temp = candleDatas_Temp_List[i - 1].movingAverageDataList[5].Value; - var 전전봉5_Temp = candleDatas_Temp_List[i - 2].movingAverageDataList[5].Value; - var 전전전봉5_Temp = candleDatas_Temp_List[i - 3].movingAverageDataList[5].Value; - var 전전전전봉5_Temp = candleDatas_Temp_List[i - 4].movingAverageDataList[5].Value; - var returnVal = Calculate전고점(market, strInterval, interval, 전봉5_Temp, 전전봉5_Temp, 전전전봉5_Temp, candleDatas_Temp_List[candleDatas_Temp_List.Count - 1]); + 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 - 4].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)) { - BuyShortStep[market + strInterval] = false; - BuyLongStep[market + strInterval] = false; + BuyShortStep[market] = false; + BuyLongStep[market] = false; } - if (!전저고점.ContainsKey(market + "30m")) continue; + if (!(전저고점.ContainsKey(market + "30m") && 전저고점.ContainsKey(market + "4H"))) continue; //if (!(전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "15m") && 전저고점.ContainsKey(market + "1H"))) // continue; @@ -340,92 +341,92 @@ namespace BitgetAPI.IndicatorConditionSetup movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전전전봉); #endregion - #region 15분봉 처리 + #region 1분봉 처리 /* // 시간별로 정렬하기 (임시 리스트) - var candleDatas_15 = findedMarket.candleDataList[MCandleTimeType.M15]; - var candleDatas_15_정렬 = candleDatas_15.OrderBy(i => i.Argument).ToList(); + var candleDatas_1 = findedMarket.candleDataList[MCandleTimeType.M1]; + var candleDatas_1_정렬 = candleDatas_1.OrderBy(i => i.Argument).ToList(); - var candleData_15 = candleDatas_15.Find(i => i.Argument == candleDatas_15_정렬.Last().Argument); + var candleData_1 = candleDatas_1.Find(i => i.Argument == candleDatas_1_정렬.Last().Argument); - if (candleData_15 == null) continue; + if (candleData_1 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_15_정렬, candleData_15); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_15_정렬, candleData_15); + ichimokuConditionSetup.calIchimokuData(candleDatas_1_정렬, candleData_1); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_1_정렬, candleData_1); - candleDatas_15_정렬.RemoveAt(candleDatas_15_정렬.Count - 1); - var candleData_15_전봉 = candleDatas_15.Find(i => i.Argument == candleDatas_15_정렬.Last().Argument); + candleDatas_1_정렬.RemoveAt(candleDatas_1_정렬.Count - 1); + var candleData_1_전봉 = candleDatas_1.Find(i => i.Argument == candleDatas_1_정렬.Last().Argument); - if (candleData_15_전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_15_정렬, candleData_15_전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_15_정렬, candleData_15_전봉); + if (candleData_1_전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_1_정렬, candleData_1_전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_1_정렬, candleData_1_전봉); - candleDatas_15_정렬.RemoveAt(candleDatas_15_정렬.Count - 1); - var candleData_15_전전봉 = candleDatas_15.Find(i => i.Argument == candleDatas_15_정렬.Last().Argument); + candleDatas_1_정렬.RemoveAt(candleDatas_1_정렬.Count - 1); + var candleData_1_전전봉 = candleDatas_1.Find(i => i.Argument == candleDatas_1_정렬.Last().Argument); - if (candleData_15_전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_15_정렬, candleData_15_전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_15_정렬, candleData_15_전전봉); + if (candleData_1_전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_1_정렬, candleData_1_전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_1_정렬, candleData_1_전전봉); - candleDatas_15_정렬.RemoveAt(candleDatas_15_정렬.Count - 1); - var candleData_15_전전전봉 = candleDatas_15.Find(i => i.Argument == candleDatas_15_정렬.Last().Argument); + candleDatas_1_정렬.RemoveAt(candleDatas_1_정렬.Count - 1); + var candleData_1_전전전봉 = candleDatas_1.Find(i => i.Argument == candleDatas_1_정렬.Last().Argument); - if (candleData_15_전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_15_정렬, candleData_15_전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_15_정렬, candleData_15_전전전봉); + if (candleData_1_전전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_1_정렬, candleData_1_전전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_1_정렬, candleData_1_전전전봉); - candleDatas_15_정렬.RemoveAt(candleDatas_15_정렬.Count - 1); - var candleData_15_전전전전봉 = candleDatas_15.Find(i => i.Argument == candleDatas_15_정렬.Last().Argument); + candleDatas_1_정렬.RemoveAt(candleDatas_1_정렬.Count - 1); + var candleData_1_전전전전봉 = candleDatas_1.Find(i => i.Argument == candleDatas_1_정렬.Last().Argument); - if (candleData_15_전전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_15_정렬, candleData_15_전전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_15_정렬, candleData_15_전전전전봉); + if (candleData_1_전전전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_1_정렬, candleData_1_전전전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_1_정렬, candleData_1_전전전전봉); */ #endregion #region 60분봉 처리 // 시간별로 정렬하기 (임시 리스트) - /* - var candleDatas_60 = findedMarket.candleDataList[MCandleTimeType.H1]; - var candleDatas_60_정렬 = candleDatas_60.OrderBy(i => i.Argument).ToList(); + + var candleDatas_240 = findedMarket.candleDataList[MCandleTimeType.H4]; + var candleDatas_240_정렬 = candleDatas_240.OrderBy(i => i.Argument).ToList(); - var candleData_60 = candleDatas_60.Find(i => i.Argument == candleDatas_60_정렬.Last().Argument); + var candleData_240 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); - if (candleData_60 == null) continue; + if (candleData_240 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_60_정렬, candleData_60); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_60_정렬, candleData_60); + ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240); - candleDatas_60_정렬.RemoveAt(candleDatas_60_정렬.Count - 1); - var candleData_60_전봉 = candleDatas_60.Find(i => i.Argument == candleDatas_60_정렬.Last().Argument); + candleDatas_240_정렬.RemoveAt(candleDatas_240_정렬.Count - 1); + var candleData_240_전봉 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); - if (candleData_60_전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_60_정렬, candleData_60_전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_60_정렬, candleData_60_전봉); + if (candleData_240_전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240_전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240_전봉); - candleDatas_60_정렬.RemoveAt(candleDatas_60_정렬.Count - 1); - var candleData_60_전전봉 = candleDatas_60.Find(i => i.Argument == candleDatas_60_정렬.Last().Argument); + candleDatas_240_정렬.RemoveAt(candleDatas_240_정렬.Count - 1); + var candleData_240_전전봉 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); - if (candleData_60_전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_60_정렬, candleData_60_전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_60_정렬, candleData_60_전전봉); + if (candleData_240_전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240_전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240_전전봉); - candleDatas_60_정렬.RemoveAt(candleDatas_60_정렬.Count - 1); - var candleData_60_전전전봉 = candleDatas_60.Find(i => i.Argument == candleDatas_60_정렬.Last().Argument); + candleDatas_240_정렬.RemoveAt(candleDatas_240_정렬.Count - 1); + var candleData_240_전전전봉 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); - if (candleData_60_전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_60_정렬, candleData_60_전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_60_정렬, candleData_60_전전전봉); + if (candleData_240_전전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240_전전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240_전전전봉); - candleDatas_60_정렬.RemoveAt(candleDatas_60_정렬.Count - 1); - var candleData_60_전전전전봉 = candleDatas_60.Find(i => i.Argument == candleDatas_60_정렬.Last().Argument); + candleDatas_240_정렬.RemoveAt(candleDatas_240_정렬.Count - 1); + var candleData_240_전전전전봉 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); - if (candleData_60_전전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_60_정렬, candleData_60_전전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_60_정렬, candleData_60_전전전전봉); - */ + if (candleData_240_전전전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240_전전전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240_전전전전봉); + #endregion if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선 @@ -590,51 +591,53 @@ namespace BitgetAPI.IndicatorConditionSetup var Bol72_Up = candleData.movingAverageDataList[72].BolangerValue_Up; #endregion /* - var 현재봉2_15 = candleData_15.movingAverageDataList[2].Value; - var 전봉2_15 = candleData_15_전봉.movingAverageDataList[2].Value; - var 전전봉2_15 = candleData_15_전전봉.movingAverageDataList[2].Value; - var 전전전봉2_15 = candleData_15_전전전봉.movingAverageDataList[2].Value; - var 전전전전봉2_15 = candleData_15_전전전전봉.movingAverageDataList[2].Value; + var 현재봉2_1 = candleData_1.movingAverageDataList[2].Value; + var 전봉2_1 = candleData_1_전봉.movingAverageDataList[2].Value; + var 전전봉2_1 = candleData_1_전전봉.movingAverageDataList[2].Value; + var 전전전봉2_1 = candleData_1_전전전봉.movingAverageDataList[2].Value; + var 전전전전봉2_1 = candleData_1_전전전전봉.movingAverageDataList[2].Value; - var 현재봉3_15 = candleData_15.movingAverageDataList[3].Value; - var 전봉3_15 = candleData_15_전봉.movingAverageDataList[3].Value; - var 전전봉3_15 = candleData_15_전전봉.movingAverageDataList[3].Value; - var 전전전봉3_15 = candleData_15_전전전봉.movingAverageDataList[3].Value; - var 전전전전봉3_15 = candleData_15_전전전전봉.movingAverageDataList[3].Value; + var 현재봉3_1 = candleData_1.movingAverageDataList[3].Value; + var 전봉3_1 = candleData_1_전봉.movingAverageDataList[3].Value; + var 전전봉3_1 = candleData_1_전전봉.movingAverageDataList[3].Value; + var 전전전봉3_1 = candleData_1_전전전봉.movingAverageDataList[3].Value; + var 전전전전봉3_1 = candleData_1_전전전전봉.movingAverageDataList[3].Value; - var 현재봉4_15 = candleData_15.movingAverageDataList[4].Value; - var 전봉4_15 = candleData_15_전봉.movingAverageDataList[4].Value; - var 전전봉4_15 = candleData_15_전전봉.movingAverageDataList[4].Value; - var 전전전봉4_15 = candleData_15_전전전봉.movingAverageDataList[4].Value; + var 현재봉4_1 = candleData_1.movingAverageDataList[4].Value; + var 전봉4_1 = candleData_1_전봉.movingAverageDataList[4].Value; + var 전전봉4_1 = candleData_1_전전봉.movingAverageDataList[4].Value; + var 전전전봉4_1 = candleData_1_전전전봉.movingAverageDataList[4].Value; - var 현재봉5_15 = candleData_15.movingAverageDataList[5].Value; - var 전봉5_15 = candleData_15_전봉.movingAverageDataList[5].Value; - var 전전봉5_15 = candleData_15_전전봉.movingAverageDataList[5].Value; - var 전전전봉5_15 = candleData_15_전전전봉.movingAverageDataList[5].Value; - - - var 현재봉2_60 = candleData_60.movingAverageDataList[2].Value; - var 전봉2_60 = candleData_60_전봉.movingAverageDataList[2].Value; - var 전전봉2_60 = candleData_60_전전봉.movingAverageDataList[2].Value; - var 전전전봉2_60 = candleData_60_전전전봉.movingAverageDataList[2].Value; - var 전전전전봉2_60 = candleData_60_전전전전봉.movingAverageDataList[2].Value; - - var 현재봉3_60 = candleData_60.movingAverageDataList[3].Value; - var 전봉3_60 = candleData_60_전봉.movingAverageDataList[3].Value; - var 전전봉3_60 = candleData_60_전전봉.movingAverageDataList[3].Value; - var 전전전봉3_60 = candleData_60_전전전봉.movingAverageDataList[3].Value; - var 전전전전봉3_60 = candleData_60_전전전전봉.movingAverageDataList[3].Value; - - var 현재봉4_60 = candleData_60.movingAverageDataList[4].Value; - var 전봉4_60 = candleData_60_전봉.movingAverageDataList[4].Value; - var 전전봉4_60 = candleData_60_전전봉.movingAverageDataList[4].Value; - var 전전전봉4_60 = candleData_60_전전전봉.movingAverageDataList[4].Value; - - var 현재봉5_60 = candleData_60.movingAverageDataList[5].Value; - var 전봉5_60 = candleData_60_전봉.movingAverageDataList[5].Value; - var 전전봉5_60 = candleData_60_전전봉.movingAverageDataList[5].Value; - var 전전전봉5_60 = candleData_60_전전전봉.movingAverageDataList[5].Value; + var 현재봉5_1 = candleData_1.movingAverageDataList[5].Value; + var 전봉5_1 = candleData_1_전봉.movingAverageDataList[5].Value; + var 전전봉5_1 = candleData_1_전전봉.movingAverageDataList[5].Value; + var 전전전봉5_1 = candleData_1_전전전봉.movingAverageDataList[5].Value; */ + + var 현재봉2_240 = candleData_240.movingAverageDataList[2].Value; + var 전봉2_240 = candleData_240_전봉.movingAverageDataList[2].Value; + var 전전봉2_240 = candleData_240_전전봉.movingAverageDataList[2].Value; + var 전전전봉2_240 = candleData_240_전전전봉.movingAverageDataList[2].Value; + var 전전전전봉2_240 = candleData_240_전전전전봉.movingAverageDataList[2].Value; + + var 현재봉3_240 = candleData_240.movingAverageDataList[3].Value; + var 전봉3_240 = candleData_240_전봉.movingAverageDataList[3].Value; + var 전전봉3_240 = candleData_240_전전봉.movingAverageDataList[3].Value; + var 전전전봉3_240 = candleData_240_전전전봉.movingAverageDataList[3].Value; + var 전전전전봉3_240 = candleData_240_전전전전봉.movingAverageDataList[3].Value; + + var 현재봉4_240 = candleData_240.movingAverageDataList[4].Value; + var 전봉4_240 = candleData_240_전봉.movingAverageDataList[4].Value; + var 전전봉4_240 = candleData_240_전전봉.movingAverageDataList[4].Value; + var 전전전봉4_240 = candleData_240_전전전봉.movingAverageDataList[4].Value; + + var 현재봉5_240 = candleData_240.movingAverageDataList[5].Value; + var 전봉5_240 = candleData_240_전봉.movingAverageDataList[5].Value; + var 전전봉5_240 = candleData_240_전전봉.movingAverageDataList[5].Value; + var 전전전봉5_240 = candleData_240_전전전봉.movingAverageDataList[5].Value; + + var 현재봉24_240 = candleData_240.movingAverageDataList[24].Value; + var 전봉24_240 = candleData_240_전봉.movingAverageDataList[24].Value; var oneList = new List() { 현재봉24, @@ -650,366 +653,364 @@ namespace BitgetAPI.IndicatorConditionSetup }; - //var 저고점_5 = 전저고점[market + "5m"]; + //var 저고점_1 = 전저고점[market + "1m"]; var 저고점_30 = 전저고점[market + "30m"]; - //var 저고점_60 = 전저고점[market + "1H"]; + //var 저고점_240 = 전저고점[market + "1H"]; //var returnVal = Calculate전고점(market, "5m", MCandleTimeType.M5, 전봉5, 전전봉5, 전전전봉5, candleData); //if (!returnVal) continue; - var returnVal = Calculate전고점(market, "30m", MCandleTimeType.M30, 전봉5, 전전봉5, 전전전봉5, candleData); + var returnVal = Calculate전고점(market, "30m", MCandleTimeType.M30, 전봉3, 전전봉3, 전전전봉3, candleData); if (!returnVal) continue; - //returnVal = Calculate전고점(market, "1H", MCandleTimeType.H1, 전봉5_60, 전전봉5_60, 전전전봉5_60, candleData_60); - //if (!returnVal) continue; - var tempFlag = (저고점_30["Type"] == 0 - && 저고점_30["전저가"] > 저고점_30["전전저가"] - && 저고점_30["전전전저가"] > 저고점_30["전전저가"] - && 저고점_30["전전전고가"] > 저고점_30["전전고가"] - && 저고점_30["tempHighVal"] > 저고점_30["tempLow2Val"] - && 저고점_30["tempLowVal"] > 저고점_30["tempHighVal"] - && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh2Val"] - && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow3Val"]) - || - (저고점_30["Type"] == 1 - && 저고점_30["전고가"] < 저고점_30["전전고가"] - && 저고점_30["전전전고가"] < 저고점_30["전전고가"] - && 저고점_30["전전전저가"] < 저고점_30["전전저가"] - && 저고점_30["tempLowVal"] > 저고점_30["tempHigh2Val"] - && 저고점_30["tempLowVal"] < 저고점_30["tempHighVal"] - && 저고점_30["tempLow2Val"] < 저고점_30["tempHigh2Val"] - && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh3Val"]); + var tempFlag1Short = (저고점_30["Type"] == 1 + && ((저고점_30["전저가"] > 저고점_30["전전저가"] + && 저고점_30["전전고가"] < 저고점_30["전고가"]) + || (저고점_30["전저가"] < 저고점_30["전전저가"] + && 저고점_30["전고가"] < 저고점_30["전전고가"]) + || (저고점_30["전저가"] < 저고점_30["전전저가"] + && 저고점_30["전고가"] > 저고점_30["전전고가"])) + && 저고점_30["tempHighVal"] > 저고점_30["tempLowVal"] + && 저고점_30["tempLowVal"] > 저고점_30["tempHigh2Val"] + && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow2Val"] + && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh3Val"]) + && candleData.IchimokData.상한선 > candleData.Close + //&& candleData_240.Close < 현재봉24_240 + //&& 현재봉24_240 < 전봉24_240 + && 현재봉24 > 현재봉72; - var tempFlag2 = (저고점_30["Type"] == 0 - && 저고점_30["전저가"] < 저고점_30["전전저가"] - && 저고점_30["전전고가"] > 저고점_30["전고가"] - && 저고점_30["tempHighVal"] > 저고점_30["tempLow2Val"] - && 저고점_30["tempLowVal"] > 저고점_30["tempHighVal"] - && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh2Val"] - && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow3Val"]) - || - (저고점_30["Type"] == 1 - && 저고점_30["전고가"] > 저고점_30["전전고가"] - && 저고점_30["전전저가"] < 저고점_30["전저가"] - && 저고점_30["tempLowVal"] > 저고점_30["tempHigh2Val"] - && 저고점_30["tempLowVal"] < 저고점_30["tempHighVal"] - && 저고점_30["tempLow2Val"] < 저고점_30["tempHigh2Val"] - && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh3Val"]); + var tempFlag2Short = (저고점_30["Type"] == 0 + && ((저고점_30["전저가"] > 저고점_30["전전저가"] + && 저고점_30["전고가"] < 전봉3) + || (저고점_30["전저가"] < 저고점_30["전전저가"] + && 전봉3 < 저고점_30["전고가"]) + || (저고점_30["전저가"] < 저고점_30["전전저가"] + && 전봉3 > 저고점_30["전고가"])) + && 전전봉3 < 전봉3 && 전봉3 > 현재봉3 + && 저고점_30["tempHighVal"] < 저고점_30["tempLowVal"] + && 저고점_30["tempLowVal"] < 저고점_30["tempHigh2Val"] + && 저고점_30["tempHigh2Val"] < 저고점_30["tempLow2Val"] + && 저고점_30["tempLow2Val"] < 저고점_30["tempHigh3Val"]) + && candleData.IchimokData.상한선 > candleData.Close + //&& candleData_240.Close < 현재봉24_240 + //&& 현재봉24_240 < 전봉24_240 + && 현재봉24 > 현재봉72; + + + var tempFlag2Long = (저고점_30["Type"] == 0 + && ((저고점_30["전저가"] > 저고점_30["전전저가"] + && 저고점_30["전전고가"] < 저고점_30["전고가"]) + || (저고점_30["전저가"] > 저고점_30["전전저가"] + && 저고점_30["전고가"] < 저고점_30["전전고가"]) + || (저고점_30["전저가"] < 저고점_30["전전저가"] + && 저고점_30["전고가"] > 저고점_30["전전고가"])) + && 저고점_30["tempLowVal"] > 저고점_30["tempHighVal"] + && 저고점_30["tempHighVal"] > 저고점_30["tempLow2Val"] + && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh2Val"] + && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow3Val"]) + //&& candleData.IchimokData.상한선 > candleData.Close + && candleData_240.Close > 현재봉24_240 + && 현재봉24_240 > 전봉24_240; + //&& 현재봉24 < 현재봉72; + + //var tempFlagShort = (저고점_30["Type"] == 1 + // && 저고점_30["전고가"] < 저고점_30["전전고가"] + // && 저고점_30["전전고가"] > 저고점_30["전전전고가"] + // && 저고점_30["전저가"] < 저고점_30["전고가"] + // && 저고점_30["전전저가"] < 저고점_30["전전전고가"] + // && 저고점_30["tempHighVal"] > 저고점_30["tempLowVal"] + // && 저고점_30["tempLowVal"] > 저고점_30["tempHigh2Val"] + // && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow2Val"] + // && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh3Val"]) + // && candleData.IchimokData.하한선 < candleData.Close + // && 현재봉24 > 현재봉72; + + //var tempFlagLong = (저고점_30["Type"] == 0 + // && 저고점_30["전저가"] > 저고점_30["전전저가"] + // && 저고점_30["전전저가"] < 저고점_30["전전전저가"] + // && 저고점_30["전저가"] < 저고점_30["전고가"] + // && 저고점_30["전전전저가"] < 저고점_30["전전고가"] + // && 저고점_30["tempLowVal"] > 저고점_30["tempHighVal"] + // && 저고점_30["tempHighVal"] > 저고점_30["tempLow2Val"] + // && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh2Val"] + // && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow3Val"]) + // && candleData.IchimokData.상한선 > candleData.Close + // && 현재봉24 < 현재봉72; if (영호조건식_상향돌파) { - if(!tempFlag && !tempFlag2 && !BuyLongStep[market + strInterval]) + if (!tempFlag2Long && !BuyLongStep[market]) { - BuyLongStep[market + strInterval] = true; + BuyLongStep[market] = true; } - if (!BuyLongStep[market + strInterval]) continue; - - 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)); - - try + if (BuyLongStep[market]) { - //사는 시점 - if (!UpBuyList.ContainsKey(market)) + + 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)); + + try { - - var buyFlag = false; - - // 60분봉 - - //var flag_60 = 현재봉3_60 > 전봉3_60 && candleData_60.Open < candleData_60.Close; - ////저고점_60["Type"] == 1 && 저고점_60["전고가"] > 현재봉3_60 && 현재봉3_60 > 전봉3_60 && 전봉3_60 < 전전봉3_60 && candleData_60.Open < candleData_60.Close; - - //var flag_15 = 저고점_30["Type"] == 0 - // && 저고점_30["전고가"] > 현재봉3_15 - // && 저고점_30["전고가"] < 현재봉3_15 - // && 저고점_30["전고가"] > 전봉3_15 - // && 저고점_30["전저가"] > 저고점_30["전전저가"] - // && 저고점_30["전저가"] < 저고점_30["전고가"] - // && 저고점_30["전고가"] > 저고점_30["전전저가"] && 저고점_30["전고가"]< 저고점_30["전전고가"]; - - //var max = 저고점_30["전고가"]; - //if (저고점_30["전고가"] < 저고점_30["전전고가"]) - // max = 저고점_30["전전고가"]; - - //역헤드앤 숄더와 헤드앤 숄더는 둘다 공통 - // var flag_15 = 저고점_30["Type"] == 0 - // && 저고점_30["전저가"] > 저고점_30["전전저가"] - // && 저고점_30["전전전저가"] > 저고점_30["전전저가"] - // && 저고점_30["전전전고가"] > 저고점_30["전전고가"] - // && 저고점_30["tempHighVal"] > 저고점_30["tempLow2Val"] - // && 저고점_30["tempLowVal"] > 저고점_30["tempHighVal"] - // && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh2Val"] - // && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow3Val"] - // //&& max > 현재봉5 - // //&& max < candleData.Close - // //&& max < candleData.Open; - // && 저고점_30["전고가"] > 현재봉5 - // && 현재봉5 > 전봉5 - - // && 저고점_30["전고가"] < candleData.Close; - //// && 저고점_30["전고가"] > candleData.Open; - - - var minSec = 0.0; - if (tempFlag2) + //사는 시점 + if (!UpBuyList.ContainsKey(market)) { - if (저고점_30["Type"] == 0) + var buyFlag = false; + if (tempFlag2Long) { - minSec = 저고점_30["tempLow2Val"]; - } - else - { - minSec = 저고점_30["tempHigh2Val"]; - } - } + // 60분봉 - if (tempFlag) - { - if (저고점_30["Type"] == 0) - { - minSec = 저고점_30["tempLow3Val"]; - } - else - { - minSec = 저고점_30["tempHigh3Val"]; - } - } + //var flag_240 = 현재봉3_240 > 전봉3_240 && candleData_240.Open < candleData_240.Close; + ////저고점_240["Type"] == 1 && 저고점_240["전고가"] > 현재봉3_240 && 현재봉3_240 > 전봉3_240 && 전봉3_240 < 전전봉3_240 && candleData_240.Open < candleData_240.Close; - if(minSec > 0) { - var minData = new DateTime(1970, 1, 1, 0, 0, 0); - minData = minData.AddSeconds(minSec); - minData = minData.AddMinutes(-90); - var candleDataList = candleDatas.OrderBy(i => i.Argument).ToList(); + //var flag_15 = 저고점_30["Type"] == 0 + // && 저고점_30["전고가"] > 현재봉3_15 + // && 저고점_30["전고가"] < 현재봉3_15 + // && 저고점_30["전고가"] > 전봉3_15 + // && 저고점_30["전저가"] > 저고점_30["전전저가"] + // && 저고점_30["전저가"] < 저고점_30["전고가"] + // && 저고점_30["전고가"] > 저고점_30["전전저가"] && 저고점_30["전고가"]< 저고점_30["전전고가"]; - var list = candleDataList.Where(t => t.Argument > minData).ToList(); - list.RemoveAt(list.Count - 1); - var maxData =list.Max(t => t.High); + //var max = 저고점_30["전고가"]; + //if (저고점_30["전고가"] < 저고점_30["전전고가"]) + // max = 저고점_30["전전고가"]; - if(candleData.Open < maxData && candleData.Close > maxData && 현재봉5 > 전봉5) - { - buyFlag = true; - } - } + //역헤드앤 숄더와 헤드앤 숄더는 둘다 공통 + // var flag_15 = 저고점_30["Type"] == 0 + // && 저고점_30["전저가"] > 저고점_30["전전저가"] + // && 저고점_30["전전전저가"] > 저고점_30["전전저가"] + // && 저고점_30["전전전고가"] > 저고점_30["전전고가"] + // && 저고점_30["tempHighVal"] > 저고점_30["tempLow2Val"] + // && 저고점_30["tempLowVal"] > 저고점_30["tempHighVal"] + // && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh2Val"] + // && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow3Val"] + // //&& max > 현재봉5 + // //&& max < candleData.Close + // //&& max < candleData.Open; + // && 저고점_30["전고가"] > 현재봉5 + // && 현재봉5 > 전봉5 - 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; + // && 저고점_30["전고가"] < candleData.Close; + //// && 저고점_30["전고가"] > candleData.Open; - signals_SD.Add(signalInfoData); - } + var finalSellPrice = 0.0; + var minSec = 저고점_30["tempHighVal"]; - var buyDic = new Dictionary - { - { "MarketName", market }, - { "BuyDate", nowTime }, - { "Price", price }, - { "Flag", 저고점_30["전고가"] > 저고점_30["전전고가"]}, - { "MCandleTimeType", (int)interval }, - { "CandleTime", candleData.Argument }, - { "Candle", candleData } - }; - - UpBuyList.Add(market, buyDic); - - var dic = new Dictionary - { - [1] = true, - [2] = false, - [3] = false, - [4] = false, - [5] = false - }; - SellLongStep.Add(market, dic); - if (LongCount < 5) - { - double size = YHKIM_OrderAmount / price * YHKIM_Leverage; - var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage); - if (orderData != null) + if (minSec > 0) { - var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); + var minData = new DateTime(1970, 1, 1, 0, 0, 0); + minData = minData.AddSeconds(minSec); + minData = minData.AddMinutes(-3 * (int)interval); + var candleDataList = candleDatas.OrderBy(i => i.Argument).ToList(); - var orderDataDic = new Dictionary + var list = candleDataList.Where(t => t.Argument > minData).ToList(); + list.RemoveAt(list.Count - 1); + finalSellPrice = list.Min(t => t.Close); + var maxData = list.Max(t => t.Close); + + if (candleData.Close > maxData && 현재봉3 > 전봉3) + { + buyFlag = true; + } + } + + 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 }, + { "finalSellPrice", finalSellPrice }, + { "Flag", 저고점_30["전고가"] > 저고점_30["전전고가"]}, { "MCandleTimeType", (int)interval }, - { "Candle", candleData }, - { "Size", size }, - { "orderId", orderDic["orderId"] } + { "CandleTime", candleData.Argument }, + { "Candle", candleData } }; - BuyLongList.Add(orderDataDic); - LongCount++; + + UpBuyList.Add(market, buyDic); + + var dic = new Dictionary + { + [1] = true, + [2] = false, + [3] = false, + [4] = false, + [5] = false + }; + SellLongStep.Add(market, dic); + if (LongCount < 5) + { + double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage); + if (orderData != null) + { + var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); + + var orderDataDic = new Dictionary + { + { "MarketName", market }, + { "BuyDate", nowTime }, + { "Price", price }, + { "MCandleTimeType", (int)interval }, + { "Candle", candleData }, + { "Size", size }, + { "orderId", orderDic["orderId"] } + }; + BuyLongList.Add(orderDataDic); + LongCount++; + } + } } } } - } - //파는 시점 - else - { - - var buyItem = UpBuyList[market]; - var flag = (bool)buyItem["Flag"]; - - if (interval < MCandleTimeType.H1) - { - var buyTime = ((DateTime)buyItem["CandleTime"]).AddMinutes(30); - - if (nowTime < buyTime) - { - continue; - } - } - //임시로 처리 + //파는 시점 else { - var buyTime = ((DateTime)buyItem["CandleTime"]).AddHours((int)interval / 60); - - if (nowTime < buyTime) + + var buyItem = UpBuyList[market]; + var flag = (bool)buyItem["Flag"]; + var finalSellPrice = (double)buyItem["finalSellPrice"]; + if (interval < MCandleTimeType.H1) { - continue; - } - } + var buyTime = ((DateTime)buyItem["CandleTime"]).AddMinutes((int)interval); - var sellFlag = false; - - //예외처리 - //if (저고점_60["전저가"] > 현재봉3_60) - // sellFlag = true; - - //if (저고점_30["전저가"] > 전봉5) - // sellFlag = true; - - //if (저고점_30["전고가"] < 저고점_30["전전고가"]) - // sellFlag = true; - - //if (저고점_30["전전고가"] > 현재봉5) - // sellFlag = true; - - //var 전전Data = 저고점_30["전전고가"] - 저고점_30["전전전고가"]; - - //var 전Data = 저고점_30["전고가"] - 저고점_30["전전고가"]; - - - //if (전전Data > 전Data) sellFlag = true; - - if(현재봉5 < 전봉5) sellFlag = true; - - //if (flag) - //{ - // if (저고점_5["전고가"] < 저고점_5["전전고가"]) - // { - // sellFlag = true; - // } - - // if (저고점_5["전전고가"] > 현재봉3) - // { - // sellFlag = true; - // } - //} - //else - //{ - // if (저고점_5["전저가"] > 현재봉3) - // { - // sellFlag = true; - // } - - // if (저고점_5["전고가"] > 저고점_5["전전고가"]) - // { - // buyItem["Flag"] = true; - // } - //} - - if (sellFlag) - { - double.TryParse(buyItem["Price"].ToString(), out var buyPrice); - var resultRate = ((price - buyPrice) / buyPrice) * 100; - BuyLongStep[market] = false; - var result = new Dictionary() - { - { "MarketName", market }, - { "BuyDate", buyItem["BuyDate"]}, - { "Type", "상향"}, - { "BuyPrice", buyPrice }, - { "MCandleTimeType", (int)interval }, - { "BuyCandle", buyItem["Candle"] }, - { "SellDate", nowTime}, - { "SellPrice", price }, - { "SellCandle", candleData }, - { "Rate", resultRate } - }; - - UpResultList.Add(result); - UpBuyList.Remove(market); - SellLongStep.Remove(market); - - var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market); - - if (orderDic != null) - { - double.TryParse(orderDic["Size"].ToString(), out var size); - var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellLong, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString()); - - if (sellOrder != null) + if (nowTime < buyTime) { - var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"])); + continue; } - else + } + //임시로 처리 + else + { + var buyTime = ((DateTime)buyItem["CandleTime"]).AddHours((int)interval / 60); + + if (nowTime < buyTime) { - Log.Error("Sell 안됨 확인 필요"); + continue; } - double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue); - //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]); - //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"])); + } - //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); + var buyTimeUnix = ((DateTimeOffset)((DateTime)buyItem["CandleTime"])).ToUnixTimeSeconds(); - var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100; + var sellFlag = false; - var orderResult = new Dictionary() + if (finalSellPrice > candleData.Close) + sellFlag = true; + + if (buyTimeUnix < 저고점_30["tempHighVal"]) + { + if (저고점_30["전고가"] < 저고점_30["전전고가"]) + { + sellFlag = true; + } + if (저고점_30["전전고가"] > candleData.Close) + { + sellFlag = true; + } + } + + if (candleData.Close < candleData_전봉.Low || + candleData.Close < candleData_전전봉.Low || + candleData.Close < candleData_전전전봉.Low) + { + sellFlag = true; + } + + if (sellFlag) + { + double.TryParse(buyItem["Price"].ToString(), out var buyPrice); + var resultRate = ((price - buyPrice) / buyPrice) * 100; + BuyLongStep[market] = false; + var result = new Dictionary() { { "MarketName", market }, - { "BuyDate", orderDic["BuyDate"]}, - { "BuyPrice", orderDic["Price"] }, + { "BuyDate", buyItem["BuyDate"]}, { "Type", "상향"}, + { "BuyPrice", buyPrice }, { "MCandleTimeType", (int)interval }, { "BuyCandle", buyItem["Candle"] }, { "SellDate", nowTime}, - { "SellPrice", price}, + { "SellPrice", price }, { "SellCandle", candleData }, - { "Rate", resultRateData } + { "Rate", resultRate } }; - ResultList.Add(orderResult); - BuyLongList.Remove(orderDic); - LongCount--; + + UpResultList.Add(result); + UpBuyList.Remove(market); + SellLongStep.Remove(market); + + var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market); + + if (orderDic != null) + { + double.TryParse(orderDic["Size"].ToString(), out var size); + var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellLong, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString()); + + if (sellOrder != null) + { + var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"])); + } + else + { + Log.Error("Sell 안됨 확인 필요"); + } + double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue); + //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]); + //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"])); + + //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); + + var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100; + + var orderResult = new Dictionary() + { + { "MarketName", market }, + { "BuyDate", orderDic["BuyDate"]}, + { "BuyPrice", orderDic["Price"] }, + { "Type", "상향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price}, + { "SellCandle", candleData }, + { "Rate", resultRateData } + }; + ResultList.Add(orderResult); + BuyLongList.Remove(orderDic); + LongCount--; + } + } } } + catch (Exception e) + { - } - catch (Exception e) - { - + } } } if (영호조건식_하향돌파) @@ -1022,308 +1023,266 @@ namespace BitgetAPI.IndicatorConditionSetup var description = string.Format("{0} 72,24,4 하락", strInterval); var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); - if (!tempFlag && !tempFlag2 && !BuyShortStep[market + strInterval]) + if (!tempFlag2Short && !BuyShortStep[market]) { - BuyShortStep[market + strInterval] = true; + BuyShortStep[market] = true; } - if (!BuyShortStep[market + strInterval]) continue; - - try + if (BuyShortStep[market]) { - //사는 시점 - if (!DownBuyList.ContainsKey(market)) + try { - - var buyFlag = false; - - //var flag_60 = 현재봉3_60 < 전봉3_60 && candleData_60.Open > candleData_60.Close; - ////저고점_60["Type"] == 0 && 저고점_60["전저가"] < 현재봉3_60 && 현재봉3_60 < 전봉3_60 && 전봉3_60> 전전봉3_60 && candleData_60.Open > candleData_60.Close; - - //var flag_15 = 저고점_30["Type"] == 1 - // && 저고점_30["전저가"] < 현재봉3_15 - // && 저고점_30["전저가"] > 현재봉3_15 - // && 저고점_30["전저가"] < 전봉3_15 - // && 저고점_30["전고가"] < 저고점_30["전전고가"] - // && 저고점_30["전고가"] > 저고점_30["전저가"] - // && 저고점_30["전저가"] < 저고점_30["전전고가"] && 저고점_30["전저가"] > 저고점_30["전전저가"]; - - //var flag_15 = 저고점_30["Type"] == 1 - // && 저고점_30["전고가"] < 저고점_30["전전고가"] - // && 저고점_30["전전전고가"] < 저고점_30["전전고가"] - // && 저고점_30["전전전저가"] < 저고점_30["전전저가"] - // && 저고점_30["tempLowVal"] > 저고점_30["tempHigh2Val"] - // && 저고점_30["tempLowVal"] < 저고점_30["tempHighVal"] - ////&& min < 현재봉5 - ////&& candleData.Close < min - ////&& min < candleData.Open; - //&& 저고점_30["전저가"] < 현재봉5 - //&& 현재봉5 < 전봉5 - //&& 저고점_30["전저가"] < 저고점_30["전전저가"] - //&& candleData.Close < 저고점_30["전저가"]; - // && 저고점_30["전저가"] < candleData.Open; - - //if (flag_15) - //{ - // buyFlag = true; - //} - - var minSec = 0.0; - if (tempFlag2) + //사는 시점 + if (!DownBuyList.ContainsKey(market)) { - if (저고점_30["Type"] == 1) + var buyFlag = false; + if (tempFlag2Short || tempFlag1Short) { - minSec = 저고점_30["tempLow2Val"]; - } - else - { - minSec = 저고점_30["tempHigh2Val"]; - } - } + //var flag_240 = 현재봉3_240 < 전봉3_240 && candleData_240.Open > candleData_240.Close; + ////저고점_240["Type"] == 0 && 저고점_240["전저가"] < 현재봉3_240 && 현재봉3_240 < 전봉3_240 && 전봉3_240> 전전봉3_240 && candleData_240.Open > candleData_240.Close; - if (tempFlag) - { - if (저고점_30["Type"] == 0) - { - minSec = 저고점_30["tempLow3Val"]; - } - else - { - minSec = 저고점_30["tempHigh3Val"]; - } - } + //var flag_15 = 저고점_30["Type"] == 1 + // && 저고점_30["전저가"] < 현재봉3_15 + // && 저고점_30["전저가"] > 현재봉3_15 + // && 저고점_30["전저가"] < 전봉3_15 + // && 저고점_30["전고가"] < 저고점_30["전전고가"] + // && 저고점_30["전고가"] > 저고점_30["전저가"] + // && 저고점_30["전저가"] < 저고점_30["전전고가"] && 저고점_30["전저가"] > 저고점_30["전전저가"]; - if (minSec > 0) - { - var minDate = new DateTime(1970, 1, 1, 0, 0, 0); - minDate = minDate.AddSeconds(minSec); - minDate = minDate.AddMinutes(-90); - var candleDataList = candleDatas.OrderBy(i => i.Argument).ToList(); + //var flag_15 = 저고점_30["Type"] == 1 + // && 저고점_30["전고가"] < 저고점_30["전전고가"] + // && 저고점_30["전전전고가"] < 저고점_30["전전고가"] + // && 저고점_30["전전전저가"] < 저고점_30["전전저가"] + // && 저고점_30["tempLowVal"] > 저고점_30["tempHigh2Val"] + // && 저고점_30["tempLowVal"] < 저고점_30["tempHighVal"] + ////&& min < 현재봉5 + ////&& candleData.Close < min + ////&& min < candleData.Open; + //&& 저고점_30["전저가"] < 현재봉5 + //&& 현재봉5 < 전봉5 + //&& 저고점_30["전저가"] < 저고점_30["전전저가"] + //&& candleData.Close < 저고점_30["전저가"]; + // && 저고점_30["전저가"] < candleData.Open; - var list = candleDataList.Where(t => t.Argument > minDate).ToList(); - list.RemoveAt(list.Count - 1); - var minData = list.Min(t => t.Low); + //if (flag_15) + //{ + // buyFlag = true; + //} + var finalSellPrice = 0.0; + var minSec = 저고점_30["tempLowVal"]; - if (candleData.Open > minData && candleData.Close < minData && 현재봉5 < 전봉5) - { - buyFlag = true; - } - } - - 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 }, - { "Flag", 저고점_30["전저가"] < 저고점_30["전전저가"] }, - { "MCandleTimeType", (int)interval }, - { "CandleTime", candleData.Argument }, - { "Candle", candleData } - }; - - DownBuyList.Add(market, buyDic); - var dic = new Dictionary - { - [1] = true, - [2] = false, - [3] = false, - [4] = false, - [5] = false - }; - SellShortStep.Add(market, 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) + if (minSec > 0) { - var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); + var minDate = new DateTime(1970, 1, 1, 0, 0, 0); + minDate = minDate.AddSeconds(minSec); + minDate = minDate.AddMinutes(-3 * (int)interval); + var candleDataList = candleDatas.OrderBy(i => i.Argument).ToList(); - var orderDataDic = new Dictionary - { + var list = candleDataList.Where(t => t.Argument > minDate).ToList(); + list.RemoveAt(list.Count - 1); + var minData = list.Min(t => t.Close); + finalSellPrice = list.Max(t => t.Close); + if (candleData.Close < minData && 현재봉3 < 전봉3) + { + buyFlag = true; + } + } + + 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 }, + { "finalSellPrice", finalSellPrice }, + { "Flag", 저고점_30["전저가"] < 저고점_30["전전저가"] }, { "MCandleTimeType", (int)interval }, - { "Candle", candleData }, - { "Size", size }, - { "orderId", orderDic["orderId"] } + { "CandleTime", candleData.Argument }, + { "Candle", candleData } }; - BuyShortList.Add(orderDataDic); - ShortCount++; + + DownBuyList.Add(market, buyDic); + var dic = new Dictionary + { + [1] = true, + [2] = false, + [3] = false, + [4] = false, + [5] = false + }; + SellShortStep.Add(market, 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) + { + var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); + + var orderDataDic = new Dictionary + { + { "MarketName", market }, + { "BuyDate", nowTime }, + { "Price", price }, + { "MCandleTimeType", (int)interval }, + { "Candle", candleData }, + { "Size", size }, + { "orderId", orderDic["orderId"] } + }; + BuyShortList.Add(orderDataDic); + ShortCount++; + } + } } } + } - } - - //파는 시점 - else - { - var buyItem = DownBuyList[market]; - var flag = (bool)buyItem["Flag"]; - if (interval < MCandleTimeType.H1) - { - var buyTime = ((DateTime)buyItem["CandleTime"]).AddMinutes(30); - - if (nowTime < buyTime) - { - continue; - } - } - //임시로 처리 + //파는 시점 else { - var buyTime = ((DateTime)buyItem["CandleTime"]).AddHours((int)interval / 60); - - if (nowTime < buyTime) + var buyItem = DownBuyList[market]; + var flag = (bool)buyItem["Flag"]; + var finalSellPrice = (double)buyItem["finalSellPrice"]; + if (interval < MCandleTimeType.H1) { - continue; + var buyTime = ((DateTime)buyItem["CandleTime"]).AddMinutes((int)interval); + + if (nowTime < buyTime) + { + continue; + } } - } - - var sellFlag = false; - - //if (저고점_60["전고가"] < 현재봉3_60) - // sellFlag = true; - - //if (저고점_30["전고가"] < 전봉5) - // sellFlag = true; - - //if (저고점_30["전저가"] > 저고점_30["전전저가"]) - // sellFlag = true; - - //if (저고점_30["전전저가"] < 현재봉5) - // sellFlag = true; - - //var 전전Data = 저고점_30["전전전저가"] - 저고점_30["전전저가"]; - - //var 전Data = 저고점_30["전전저가"] - 저고점_30["전저가"]; - - //if (전전Data > 전Data) sellFlag = true; - - if(현재봉5 > 전봉5) - sellFlag = true; - - - //if (저고점_5["tempLowVal"] > ((DateTimeOffset)buyItem["CandleTime"]).ToUnixTimeSeconds()) - //{ - // if (flag) - // { - // if (저고점_5["전저가"] > 저고점_5["전전저가"]) - // { - // sellFlag = true; - // } - // if (저고점_5["전전저가"] < 현재봉3) - // { - // sellFlag = true; - // } - // } - // else - // { - // if (저고점_5["전고가"] < 현재봉3) - // { - // sellFlag = true; - // } - // if (저고점_5["전저가"] < 저고점_5["전전저가"]) - // { - // buyItem["Flag"] = true; - // } - // } - //} - - if (sellFlag) - { - BuyShortStep[market] = false; - double.TryParse(buyItem["Price"].ToString(), out var buyPrice); - var resultRate = ((price - buyPrice) / buyPrice) * 100; - - var result = new Dictionary() + //임시로 처리 + else { - { "MarketName", market }, - { "BuyDate", buyItem["BuyDate"]}, - { "BuyPrice", buyPrice }, - { "Type", "하향"}, - { "MCandleTimeType", (int)interval }, - { "BuyCandle", buyItem["Candle"] }, - { "SellDate", nowTime}, - { "SellPrice", price }, - { "SellCandle", candleData }, - { "Rate", resultRate } - }; + var buyTime = ((DateTime)buyItem["CandleTime"]).AddHours((int)interval / 60); - DownResultList.Add(result); - DownBuyList.Remove(market); - SellShortStep.Remove(market); - var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market); + if (nowTime < buyTime) + { + continue; + } + } - if (orderDic != null) + + var buyTimeUnix = ((DateTimeOffset)((DateTime)buyItem["CandleTime"])).ToUnixTimeSeconds(); + + var sellFlag = false; + + if (finalSellPrice < candleData.Close) + sellFlag = true; + + if (buyTimeUnix < 저고점_30["tempLowVal"]) { - double.TryParse(orderDic["Size"].ToString(), out var size); - var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellShort, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString()); - - if (sellOrder != null) + if (저고점_30["전저가"] > 저고점_30["전전저가"]) { - var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"])); + sellFlag = true; } - else + if (저고점_30["전전저가"] < candleData.Close) { - Log.Error("Sell 안됨 확인 필요"); + sellFlag = true; } + } + if (candleData.Close > candleData_전봉.High || + candleData.Close > candleData_전전봉.High || + candleData.Close > candleData_전전전봉.High) + { + sellFlag = true; + } - double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue); - //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]); - //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"])); + if (sellFlag) + { + BuyShortStep[market] = false; + double.TryParse(buyItem["Price"].ToString(), out var buyPrice); + var resultRate = ((price - buyPrice) / buyPrice) * 100; - //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); - - var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100; - - var orderResult = new Dictionary() + var result = new Dictionary() { { "MarketName", market }, - { "BuyDate", orderDic["BuyDate"]}, - { "BuyPrice", orderDic["Price"] }, + { "BuyDate", buyItem["BuyDate"]}, + { "BuyPrice", buyPrice }, { "Type", "하향"}, { "MCandleTimeType", (int)interval }, { "BuyCandle", buyItem["Candle"] }, { "SellDate", nowTime}, { "SellPrice", price }, { "SellCandle", candleData }, - { "Rate", resultRateData } + { "Rate", resultRate } }; - ResultList.Add(orderResult); - BuyShortList.Remove(orderDic); - ShortCount--; + + DownResultList.Add(result); + DownBuyList.Remove(market); + SellShortStep.Remove(market); + var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market); + + if (orderDic != null) + { + double.TryParse(orderDic["Size"].ToString(), out var size); + var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellShort, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString()); + + if (sellOrder != null) + { + var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"])); + } + else + { + Log.Error("Sell 안됨 확인 필요"); + } + + + double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue); + //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]); + //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"])); + + //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); + + var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100; + + var orderResult = new Dictionary() + { + { "MarketName", market }, + { "BuyDate", orderDic["BuyDate"]}, + { "BuyPrice", orderDic["Price"] }, + { "Type", "하향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRateData } + }; + ResultList.Add(orderResult); + BuyShortList.Remove(orderDic); + ShortCount--; + } } } - } - } - catch (Exception e) - { - Console.WriteLine(e.Message); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } } } } @@ -1343,7 +1302,7 @@ namespace BitgetAPI.IndicatorConditionSetup var 저고점 = 전저고점[market + strInterval]; //전저가 - if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 && + if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 && 저고점["tempHighVal"] >= 저고점["tempLowVal"] && 저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] >= 120 * (int)type) { @@ -1359,6 +1318,18 @@ namespace BitgetAPI.IndicatorConditionSetup 저고점["Type"] = 0; } + else if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 && 저고점["tempHighVal"] < 저고점["tempLowVal"] && + 저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && + ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] >= 120 * (int)type) + { + if(저고점["전저가"] > 전전봉3) + { + 저고점["tempLowVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds(); + 저고점["전저가"] = 전전봉3; + } + + 저고점["Type"] = 0; + } else if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 && 저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] < 120 * (int)type) @@ -1378,10 +1349,10 @@ namespace BitgetAPI.IndicatorConditionSetup } //전고가 - if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 && + if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 && 저고점["tempHighVal"] <= 저고점["tempLowVal"] && 저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] >= 120 * (int)type) - { + { 저고점["tempHigh4Val"] = 저고점["tempHigh3Val"]; 저고점["tempHigh3Val"] = 저고점["tempHigh2Val"]; 저고점["tempHigh2Val"] = 저고점["tempHighVal"]; @@ -1393,6 +1364,16 @@ namespace BitgetAPI.IndicatorConditionSetup 저고점["Type"] = 1; 저고점["전고가"] = 전전봉3; } + else if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 && 저고점["tempHighVal"] > 저고점["tempLowVal"] && + 저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && + ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] >= 120 * (int)type) + { + if (저고점["전고가"] < 전전봉3) + { + 저고점["tempHighVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds(); + 저고점["전고가"] = 전전봉3; + } + } else if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 && 저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] < 120 * (int)type)