diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 15b6b21..e316ca6 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -40,7 +40,7 @@ namespace BitgetAPI.IndicatorConditionSetup return options.SelectAPI.AccessKey; } } - // = "bg_f93aa560288b6ec9d62095994c51972a"; + // = "bg_f93aa530288b6ec9d62095994c51972a"; private string YHKIM_SecreteKey { get @@ -236,8 +236,9 @@ namespace BitgetAPI.IndicatorConditionSetup var strInterval = Utils.Convertor.GetEnumDescription((Enum)interval); if (!intervalList.Contains(strInterval)) continue; - if (!전저고점.ContainsKey(market + strInterval)) + if (!전저고점.ContainsKey(market + strInterval) || (nowTime.Minute == 0 && nowTime.Hour == 24)) { + 전저고점.Clear(); var dic = new Dictionary(); dic.Add("전고가", 0); dic.Add("전저가", 0); @@ -257,6 +258,7 @@ namespace BitgetAPI.IndicatorConditionSetup dic.Add("tempLow4Val", 0); dic.Add("switchLowVal", 0); dic.Add("switchHighVal", 0); + 전저고점.Add(market + strInterval, dic); var candleDatas_Temp = findedMarket.candleDataList[interval]; @@ -268,6 +270,7 @@ namespace BitgetAPI.IndicatorConditionSetup for (var i = 199; i < candleDatas_정렬_Temp.Count; i++) { + var candleData_Main = candleDatas_정렬_Temp[i]; if (candleData_Main == null) continue; @@ -282,26 +285,23 @@ namespace BitgetAPI.IndicatorConditionSetup 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 전전전전봉4_Temp = candleDatas_Temp_List[i - 4].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]); } } } - if (!BuyShortStep.ContainsKey(market)) + if (!BuyShortStep.ContainsKey(market + strInterval)) { - BuyShortStep[market] = true; - BuyLongStep[market] = true; + BuyShortStep[market + strInterval] = false; + BuyLongStep[market + strInterval] = false; } - if (!(전저고점.ContainsKey(market + "30m"))) continue; + if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m"))) + continue; - //if (!(전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "15m") && 전저고점.ContainsKey(market + "1H"))) - // continue; - - #region 5분봉 처리 -> 임시로 30분봉 처리 + #region 1분봉 처리 // 시간별로 정렬하기 (임시 리스트) - var candleDatas = findedMarket.candleDataList[MCandleTimeType.M30]; + var candleDatas = findedMarket.candleDataList[MCandleTimeType.M1]; var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); var candleData = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); @@ -341,92 +341,88 @@ namespace BitgetAPI.IndicatorConditionSetup movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전전전봉); #endregion - #region 3분봉 처리 - /* + #region 5분봉 처리 // 시간별로 정렬하기 (임시 리스트) - var candleDatas_3 = findedMarket.candleDataList[MCandleTimeType.M3]; - var candleDatas_3_정렬 = candleDatas_3.OrderBy(i => i.Argument).ToList(); + var candleDatas_5 = findedMarket.candleDataList[MCandleTimeType.M5]; + var candleDatas_5_정렬 = candleDatas_5.OrderBy(i => i.Argument).ToList(); - var candleData_3 = candleDatas_3.Find(i => i.Argument == candleDatas_3_정렬.Last().Argument); + var candleData_5 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_3 == null) continue; + if (candleData_5 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_3_정렬, candleData_3); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_3_정렬, candleData_3); + ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5); - candleDatas_3_정렬.RemoveAt(candleDatas_3_정렬.Count - 1); - var candleData_3_전봉 = candleDatas_3.Find(i => i.Argument == candleDatas_3_정렬.Last().Argument); + candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); + var candleData_5_전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_3_전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_3_정렬, candleData_3_전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_3_정렬, candleData_3_전봉); + if (candleData_5_전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전봉); - candleDatas_3_정렬.RemoveAt(candleDatas_3_정렬.Count - 1); - var candleData_3_전전봉 = candleDatas_3.Find(i => i.Argument == candleDatas_3_정렬.Last().Argument); + candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); + var candleData_5_전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_3_전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_3_정렬, candleData_3_전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_3_정렬, candleData_3_전전봉); + if (candleData_5_전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전봉); - candleDatas_3_정렬.RemoveAt(candleDatas_3_정렬.Count - 1); - var candleData_3_전전전봉 = candleDatas_3.Find(i => i.Argument == candleDatas_3_정렬.Last().Argument); + candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); + var candleData_5_전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_3_전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_3_정렬, candleData_3_전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_3_정렬, candleData_3_전전전봉); + if (candleData_5_전전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전봉); - candleDatas_3_정렬.RemoveAt(candleDatas_3_정렬.Count - 1); - var candleData_3_전전전전봉 = candleDatas_3.Find(i => i.Argument == candleDatas_3_정렬.Last().Argument); + candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); + var candleData_5_전전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_3_전전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_3_정렬, candleData_3_전전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_3_정렬, candleData_3_전전전전봉); - */ + if (candleData_5_전전전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전전봉); #endregion - #region 60분봉 처리 + #region 30분봉 처리 // 시간별로 정렬하기 (임시 리스트) - /* - var candleDatas_240 = findedMarket.candleDataList[MCandleTimeType.H4]; - var candleDatas_240_정렬 = candleDatas_240.OrderBy(i => i.Argument).ToList(); + var candleDatas_30 = findedMarket.candleDataList[MCandleTimeType.M30]; + var candleDatas_30_정렬 = candleDatas_30.OrderBy(i => i.Argument).ToList(); - var candleData_240 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); + var candleData_30 = candleDatas_30.Find(i => i.Argument == candleDatas_30_정렬.Last().Argument); - if (candleData_240 == null) continue; + if (candleData_30 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240); + ichimokuConditionSetup.calIchimokuData(candleDatas_30_정렬, candleData_30); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30); - candleDatas_240_정렬.RemoveAt(candleDatas_240_정렬.Count - 1); - var candleData_240_전봉 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); + candleDatas_30_정렬.RemoveAt(candleDatas_30_정렬.Count - 1); + var candleData_30_전봉 = candleDatas_30.Find(i => i.Argument == candleDatas_30_정렬.Last().Argument); - if (candleData_240_전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240_전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240_전봉); + if (candleData_30_전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_30_정렬, candleData_30_전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30_전봉); - candleDatas_240_정렬.RemoveAt(candleDatas_240_정렬.Count - 1); - var candleData_240_전전봉 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); + candleDatas_30_정렬.RemoveAt(candleDatas_30_정렬.Count - 1); + var candleData_30_전전봉 = candleDatas_30.Find(i => i.Argument == candleDatas_30_정렬.Last().Argument); - if (candleData_240_전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240_전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240_전전봉); + if (candleData_30_전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_30_정렬, candleData_30_전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30_전전봉); - candleDatas_240_정렬.RemoveAt(candleDatas_240_정렬.Count - 1); - var candleData_240_전전전봉 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); + candleDatas_30_정렬.RemoveAt(candleDatas_30_정렬.Count - 1); + var candleData_30_전전전봉 = candleDatas_30.Find(i => i.Argument == candleDatas_30_정렬.Last().Argument); - if (candleData_240_전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240_전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240_전전전봉); + if (candleData_30_전전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_30_정렬, candleData_30_전전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30_전전전봉); - candleDatas_240_정렬.RemoveAt(candleDatas_240_정렬.Count - 1); - var candleData_240_전전전전봉 = candleDatas_240.Find(i => i.Argument == candleDatas_240_정렬.Last().Argument); + candleDatas_30_정렬.RemoveAt(candleDatas_30_정렬.Count - 1); + var candleData_30_전전전전봉 = candleDatas_30.Find(i => i.Argument == candleDatas_30_정렬.Last().Argument); - if (candleData_240_전전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240_전전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240_전전전전봉); - */ + if (candleData_30_전전전전봉 == null) continue; + ichimokuConditionSetup.calIchimokuData(candleDatas_30_정렬, candleData_30_전전전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30_전전전전봉); #endregion if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선 @@ -493,22 +489,20 @@ namespace BitgetAPI.IndicatorConditionSetup { #region Main 봉 계산 - var 전전전봉2 = candleData_전전전봉.movingAverageDataList[2].Value; + var 전전전봉3 = candleData_전전전봉.movingAverageDataList[3].Value; var 전전전봉4 = candleData_전전전봉.movingAverageDataList[4].Value; - var 전전전봉5 = candleData_전전전봉.movingAverageDataList[5].Value; var 전전전봉8 = candleData_전전전봉.movingAverageDataList[8].Value; var 전전전봉12 = candleData_전전전봉.movingAverageDataList[12].Value; var 전전전봉24 = candleData_전전전봉.movingAverageDataList[24].Value; var 전전전봉36 = candleData_전전전봉.movingAverageDataList[36].Value; var 전전전봉72 = candleData_전전전봉.movingAverageDataList[72].Value; var 전전전봉40 = candleData_전전전봉.movingAverageDataList[40].Value; - var 전전전전봉2 = candleData_전전전전봉.movingAverageDataList[2].Value; - var 전전전전봉3 = candleData_전전전전봉.movingAverageDataList[3].Value; - var 전전봉2 = candleData_전전봉.movingAverageDataList[2].Value; + + var 전전전전봉4 = candleData_전전전전봉.movingAverageDataList[4].Value; + var 전전봉3 = candleData_전전봉.movingAverageDataList[3].Value; var 전전봉4 = candleData_전전봉.movingAverageDataList[4].Value; - var 전전봉5 = candleData_전전봉.movingAverageDataList[5].Value; var 전전봉8 = candleData_전전봉.movingAverageDataList[8].Value; var 전전봉12 = candleData_전전봉.movingAverageDataList[12].Value; var 전전봉24 = candleData_전전봉.movingAverageDataList[24].Value; @@ -523,10 +517,9 @@ namespace BitgetAPI.IndicatorConditionSetup //var 전전봉240 = candleData_전전봉.movingAverageDataList[240].Value; var 전전봉80 = candleData_전전봉.movingAverageDataList[80].Value; //var 전전봉480 = candleData_전전봉.movingAverageDataList[480].Value; - var 전봉2 = candleData_전봉.movingAverageDataList[2].Value; + var 전봉3 = candleData_전봉.movingAverageDataList[3].Value; var 전봉4 = candleData_전봉.movingAverageDataList[4].Value; - var 전봉5 = candleData_전봉.movingAverageDataList[5].Value; var 전봉8 = candleData_전봉.movingAverageDataList[8].Value; var 전봉12 = candleData_전봉.movingAverageDataList[12].Value; var 전봉24 = candleData_전봉.movingAverageDataList[24].Value; @@ -542,10 +535,9 @@ namespace BitgetAPI.IndicatorConditionSetup var 전봉160 = candleData_전봉.movingAverageDataList[160].Value; //var 전봉240 = candleData_전봉.movingAverageDataList[240].Value; //var 전봉480 = candleData_전봉.movingAverageDataList[480].Value; - var 현재봉2 = candleData.movingAverageDataList[2].Value; + var 현재봉3 = candleData.movingAverageDataList[3].Value; var 현재봉4 = candleData.movingAverageDataList[4].Value; - var 현재봉5 = candleData.movingAverageDataList[5].Value; var 현재봉8 = candleData.movingAverageDataList[8].Value; var 현재봉12 = candleData.movingAverageDataList[12].Value; var 현재봉24 = candleData.movingAverageDataList[24].Value; @@ -590,453 +582,260 @@ namespace BitgetAPI.IndicatorConditionSetup var Bol24_Up = candleData.movingAverageDataList[24].BolangerValue_Up; var Bol72_Up = candleData.movingAverageDataList[72].BolangerValue_Up; #endregion - /* - var 현재봉2_3 = candleData_3.movingAverageDataList[2].Value; - var 전봉2_3 = candleData_3_전봉.movingAverageDataList[2].Value; - var 전전봉2_3 = candleData_3_전전봉.movingAverageDataList[2].Value; - var 전전전봉2_3 = candleData_3_전전전봉.movingAverageDataList[2].Value; - var 전전전전봉2_3 = candleData_3_전전전전봉.movingAverageDataList[2].Value; - var 현재봉3_3 = candleData_3.movingAverageDataList[3].Value; - var 전봉3_3 = candleData_3_전봉.movingAverageDataList[3].Value; - var 전전봉3_3 = candleData_3_전전봉.movingAverageDataList[3].Value; - var 전전전봉3_3 = candleData_3_전전전봉.movingAverageDataList[3].Value; - var 전전전전봉3_3 = candleData_3_전전전전봉.movingAverageDataList[3].Value; + var 현재봉3_5 = candleData_5.movingAverageDataList[3].Value; + var 전봉3_5 = candleData_5_전봉.movingAverageDataList[3].Value; + var 전전봉3_5 = candleData_5_전전봉.movingAverageDataList[3].Value; + var 전전전봉3_5 = candleData_5_전전전봉.movingAverageDataList[3].Value; - var 현재봉4_3 = candleData_3.movingAverageDataList[4].Value; - var 전봉4_3 = candleData_3_전봉.movingAverageDataList[4].Value; - var 전전봉4_3 = candleData_3_전전봉.movingAverageDataList[4].Value; - var 전전전봉4_3 = candleData_3_전전전봉.movingAverageDataList[4].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; - var 현재봉5_3 = candleData_3.movingAverageDataList[5].Value; - var 전봉5_3 = candleData_3_전봉.movingAverageDataList[5].Value; - var 전전봉5_3 = candleData_3_전전봉.movingAverageDataList[5].Value; - var 전전전봉5_3 = candleData_3_전전전봉.movingAverageDataList[5].Value; - var 현재봉72_3 = candleData_3.movingAverageDataList[72].Value; - */ + var 현재봉4_5 = candleData_5.movingAverageDataList[4].Value; + var 전봉4_5 = candleData_5_전봉.movingAverageDataList[4].Value; + var 전전봉4_5 = candleData_5_전전봉.movingAverageDataList[4].Value; + var 전전전봉4_5 = candleData_5_전전전봉.movingAverageDataList[4].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 현재봉4_30 = candleData_30.movingAverageDataList[4].Value; + var 전봉4_30 = candleData_30_전봉.movingAverageDataList[4].Value; + var 전전봉4_30 = candleData_30_전전봉.movingAverageDataList[4].Value; + var 전전전봉4_30 = candleData_30_전전전봉.movingAverageDataList[4].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, - 현재봉48, - 현재봉72, - 현재봉120 - }; - var beforeOneList = new List() { - 전봉24, - 전봉48, - 전봉72, - 전봉120 - }; - - - //var 저고점_1 = 전저고점[market + "1m"]; + var 저고점_1 = 전저고점[market + "1m"]; + var 저고점_5 = 전저고점[market + "5m"]; var 저고점_30 = 전저고점[market + "30m"]; - //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, 전봉4, 전전봉4, 전전전봉4, candleData); + var returnVal = Calculate전고점(market, "1m", MCandleTimeType.M1, 전봉4, 전전봉4, 전전전봉4, candleData); + if (!returnVal) continue; + returnVal = Calculate전고점(market, "5m", MCandleTimeType.M5, 전봉4_5, 전전봉4_5, 전전전봉4_5, candleData_5); + if (!returnVal) continue; + returnVal = Calculate전고점(market, "30m", MCandleTimeType.M30, 전봉4_30, 전전봉4_30, 전전전봉4_30, candleData_30); if (!returnVal) continue; - //var tempFlag1Short = 저고점_30["Type"] == 1 - // && ((저고점_30["전저가"] > 저고점_30["전전저가"] - // && 저고점_30["전전고가"] < 저고점_30["전고가"]) - // || (저고점_30["전저가"] < 저고점_30["전전저가"] - // && 저고점_30["전고가"] < 저고점_30["전전고가"]) - // || (저고점_30["전저가"] < 저고점_30["전전저가"] - // && 저고점_30["전고가"] > 저고점_30["전전고가"])); - //&& 현재봉3 < 현재봉72; - //&& candleData.IchimokData.상한선 > candleData.Close; - //&& candleData_240.Close < 현재봉24_240 - //&& 현재봉24_240 < 전봉24_240 - //&& 현재봉24 > 현재봉72; - - var tempFlag2Short = 저고점_30["Type"] == 0 - && ( - //(저고점_30["전저가"] > 저고점_30["전전저가"] - //&& 저고점_30["전고가"] < 전봉4) || - (저고점_30["전저가"] < 저고점_30["전전저가"] - && 전봉4 > 저고점_30["전고가"]) || - (저고점_30["전저가"] > 저고점_30["전전저가"] - && 전봉4 > 저고점_30["전고가"]) - ) && 전전봉4 < 전봉4 && 전봉4 > 현재봉4 && candleData.Open > candleData.Close; - - - //&& 현재봉4 < 현재봉72; - //&& candleData.IchimokData.상한선 > candleData.Close; - //&& candleData_240.Close < 현재봉24_240 - //&& 현재봉24_240 < 전봉24_240 - //&& 현재봉24 > 현재봉72; - - //var tempFlag1Long = 저고점_30["Type"] == 0 - // && ((저고점_30["전저가"] > 저고점_30["전전저가"] - // && 저고점_30["전전고가"] < 저고점_30["전고가"]) - // || (저고점_30["전저가"] > 저고점_30["전전저가"] - // && 저고점_30["전고가"] < 저고점_30["전전고가"]) - // || (저고점_30["전저가"] > 저고점_30["전전저가"] - // && 저고점_30["전고가"] < 저고점_30["전전고가"])); - //&& 현재봉3 > 현재봉72; - //&& candleData.IchimokData.하한선 < candleData.Close; - //&& candleData_240.Close > 현재봉24_240 - //&& 현재봉24_240 > 전봉24_240; - //&& 현재봉24 < 현재봉72; - - var tempFlag2Long = 저고점_30["Type"] == 1 - && ( - (전봉4 > 저고점_30["전저가"] - && 저고점_30["전전고가"] < 저고점_30["전고가"]) || - (전봉4 > 저고점_30["전저가"] - && 저고점_30["전고가"] < 저고점_30["전전고가"]) || - (전봉4 > 저고점_30["전저가"])) - && 전전봉4 > 전봉4 && 전봉4 < 현재봉4 && candleData.Open < candleData.Close; - - - - //&& 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 (!tempFlag2Long && 현재봉4 < 현재봉72 && !BuyLongStep[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 { - BuyLongStep[market] = true; - } - - if (BuyLongStep[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 + //사는 시점 + if (!UpBuyList.ContainsKey(market)) { - //사는 시점 - if (!UpBuyList.ContainsKey(market)) + + var buyFlag = false; + + // 30분봉 + var flag_30 = (저고점_30["Type"] == 0 && + 저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] < 저고점_30["전저가"] && candleData_30.Close > 저고점_30["전고가"]) + && 전봉4_30 < 현재봉4_30 && candleData_30.Open < candleData_30.Close; + //|| (저고점_30["Type"] == 1 && + //저고점_30["전저가"] > 저고점_30["전전저가"] && 저고점_30["전저가"] < 전봉4_30 && candleData_30.Close > 저고점_30["전고가"] && 전봉4_30 < 현재봉4_30 && 전봉4_30 < 전전봉4_30) + //|| (저고점_30["Type"] == 0 && + //저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] > 저고점_30["전저가"] && candleData_30.Close > 저고점_30["전고가"]); + + var flag_5 = (저고점_5["Type"] == 0 && + 저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] < 저고점_5["전저가"] && candleData_5.Close > 저고점_5["전고가"]) + || (저고점_5["Type"] == 1 && + 저고점_5["전저가"] > 저고점_5["전전저가"] && 저고점_5["전저가"] < 전봉4_5 && candleData_5.Close > 저고점_5["전고가"] && 전봉4_5 < 현재봉4_5 && 전봉4_5 < 전전봉4_5) + || (저고점_5["Type"] == 0 && + 저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] > 저고점_5["전저가"] && candleData_5.Close > 저고점_5["전고가"]) && 전봉4_5 < 현재봉4_5; + + var flag_1 = 현재봉4 > 현재봉72 && 전봉4 > 전봉72; + + if (flag_30 && flag_5 && flag_1) { - var buyFlag = false; - if (tempFlag2Long) + buyFlag = true; + } + + if (buyFlag) + { + // 없으면 생성 + if (signalData == null) { - buyFlag = true; - - // 60분봉 + 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; - //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; + signals_SD.Add(signalInfoData); + } - //var flag_15 = 저고점_30["Type"] == 0 - // && 저고점_30["전고가"] > 현재봉3_15 - // && 저고점_30["전고가"] < 현재봉3_15 - // && 저고점_30["전고가"] > 전봉3_15 - // && 저고점_30["전저가"] > 저고점_30["전전저가"] - // && 저고점_30["전저가"] < 저고점_30["전고가"] - // && 저고점_30["전고가"] > 저고점_30["전전저가"] && 저고점_30["전고가"]< 저고점_30["전전고가"]; + var buyDic = new Dictionary + { + { "MarketName", market }, + { "BuyDate", nowTime }, + { "Price", price }, + { "Flag", 저고점_5["전고가"] > 저고점_5["전전고가"]}, + { "MCandleTimeType", (int)interval }, + { "CandleTime", candleData.Argument }, + { "Candle", candleData } + }; - //var max = 저고점_30["전고가"]; - //if (저고점_30["전고가"] < 저고점_30["전전고가"]) - // max = 저고점_30["전전고가"]; + UpBuyList.Add(market, buyDic); - //역헤드앤 숄더와 헤드앤 숄더는 둘다 공통 - // 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 = 저고점_30["tempHighVal"]; - - //if (minSec > 0) - //{ - // var minDate = new DateTime(1970, 1, 1, 0, 0, 0); - // minDate = minDate.AddSeconds(minSec); - // minDate = minDate.AddHours(8); - // minDate = minDate.AddMinutes(-3 * (int)interval); - // var candleDataList = candleDatas.OrderBy(i => i.Argument).ToList(); - - // var list = candleDataList.Where(t => t.Argument > minDate).ToList(); - - // var closeDataList = new List(); - - // if (list.Count > 3) - // { - // closeDataList.Add(list[0].Close); - // closeDataList.Add(list[1].Close); - // closeDataList.Add(list[2].Close); - // } - // else - // { - // closeDataList = list.Select(t => t.Close).ToList(); - // } - - // var maxData = closeDataList.Max(); - - // if (candleData.Close > maxData && 현재봉3 > 전봉3) - // { - // buyFlag = true; - // } - //} - - if (buyFlag) + 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 (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; + var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); - signals_SD.Add(signalInfoData); - } - - var min = candleData.Open - (저고점_30["전고가"] - 저고점_30["전저가"]); - - var buyDic = new Dictionary + var orderDataDic = new Dictionary { { "MarketName", market }, { "BuyDate", nowTime }, { "Price", price }, - { "Flag", 저고점_30["전고가"] > 저고점_30["전전고가"]}, - { "MaxValue", candleData.Open + (저고점_30["전고가"] - 저고점_30["전저가"]) * 1.5}, - { "MinValue", min}, { "MCandleTimeType", (int)interval }, - { "CandleTime", candleData.Argument }, - { "Candle", candleData } + { "Candle", candleData }, + { "Size", size }, + { "orderId", orderDic["orderId"] } }; - - 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, 0, 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++; - } - } + BuyLongList.Add(orderDataDic); + LongCount++; } } } + } - //파는 시점 + //파는 시점 + else + { + + var buyItem = UpBuyList[market]; + var flag = (bool)buyItem["Flag"]; + if (interval < MCandleTimeType.H1) + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes(5); + if (nowTime < buyTime) + continue; + } + //임시로 처리 else { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60); + if (nowTime < buyTime) + continue; + } - var buyItem = UpBuyList[market]; - var flag = (bool)buyItem["Flag"]; - var MaxValue = (double)buyItem["MaxValue"]; - var MinValue = (double)buyItem["MinValue"]; + var sellFlag = false; + if (저고점_30["전저가"] > 전봉4_30) + sellFlag = true; - if (interval < MCandleTimeType.H1) + if (flag) + { + if (저고점_5["전고가"] < 저고점_5["전전고가"]) { - var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); - - if (candleData.Argument < buyTime) - { - continue; - } + sellFlag = true; } - //임시로 처리 - else + } + else + { + if (저고점_5["전고가"] > 저고점_5["전전고가"]) { - var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60); + buyItem["Flag"] = true; + } + } - if (candleData.Argument < buyTime) + 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) { - continue; + 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"])); - var buyTimeUnix = ((DateTimeOffset)((DateTime)buyItem["CandleTime"])).ToUnixTimeSeconds(); + //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); - var sellFlag = false; + var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100; - if (candleData.Close < candleData_전봉.Low && - candleData.Close < candleData_전전봉.Low && - candleData.Close < candleData_전전전봉.Low) - { - sellFlag = true; - } - - if(Bol24_Up < candleData.Close) sellFlag = true; - - //if (candleData.Close <= MinValue || candleData.Close >= MaxValue) - // sellFlag = true; - if (전봉4 < 전전봉4) - sellFlag = true; - - if (sellFlag) - { - double.TryParse(buyItem["Price"].ToString(), out var buyPrice); - var resultRate = ((price - buyPrice) / buyPrice) * 100; - - if(buyPrice > price) - BuyLongStep[market] = false; - var result = new Dictionary() + var orderResult = new Dictionary() { { "MarketName", market }, - { "BuyDate", buyItem["BuyDate"]}, + { "BuyDate", orderDic["BuyDate"]}, + { "BuyPrice", orderDic["Price"] }, { "Type", "상향"}, - { "BuyPrice", buyPrice }, { "MCandleTimeType", (int)interval }, { "BuyCandle", buyItem["Candle"] }, { "SellDate", nowTime}, - { "SellPrice", price }, + { "SellPrice", price}, { "SellCandle", candleData }, - { "Rate", resultRate } + { "Rate", resultRateData } }; - - 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--; - } - + ResultList.Add(orderResult); + BuyLongList.Remove(orderDic); + LongCount--; } } } - catch (Exception e) - { - } + } + catch (Exception e) + { + } } if (영호조건식_하향돌파) @@ -1049,283 +848,213 @@ 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 (!tempFlag2Short && 현재봉4 > 현재봉72 && !BuyShortStep[market]) + try { - BuyShortStep[market] = true; - } - - if (BuyShortStep[market]) - { - try + //사는 시점 + if (!DownBuyList.ContainsKey(market)) { - //사는 시점 - if (!DownBuyList.ContainsKey(market)) + + var buyFlag = false; + + var flag_30 = (저고점_30["Type"] == 1 && + 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && candleData_30.Close < 저고점_30["전저가"]) + && 전봉4_30 > 현재봉4_30 && candleData_30.Open > candleData_30.Close; + //|| (저고점_30["Type"] == 0 && + //저고점_30["전고가"] < 저고점_30["전전고가"] && 저고점_30["전고가"] > 전봉4_30 && candleData_30.Close < 저고점_30["전저가"] && 전봉4_30 > 현재봉4_30 && 전봉4_30 > 전전봉4_30) + //|| (저고점_30["Type"] == 1 && + //저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && candleData_30.Close < 저고점_30["전저가"]); + + var flag_5 = (저고점_5["Type"] == 1 && + 저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] > 저고점_5["전고가"] && candleData_5.Close < 저고점_5["전저가"]) + || (저고점_5["Type"] == 0 && + 저고점_5["전고가"] < 저고점_5["전전고가"] && 저고점_5["전고가"] > 전봉4_5 && candleData_5.Close < 저고점_5["전저가"] && 전봉4_5 > 현재봉4_5 && 전봉4_5 > 전전봉4_5) + || (저고점_5["Type"] == 1 && + 저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] < 저고점_5["전고가"] && candleData_5.Close < 저고점_5["전저가"]) + && 전봉4_5 > 현재봉4_5; + + + var flag_1 = 현재봉4 < 현재봉72 && 전봉4 < 전봉72; + + if (flag_30 && flag_5 && flag_1) { - var buyFlag = false; - - if (tempFlag2Short) - { - //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; - - //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 = 저고점_30["tempLowVal"]; - - //if (minSec > 0) - //{ - // var minDate = new DateTime(1970, 1, 1, 0, 0, 0); - // minDate = minDate.AddSeconds(minSec); - // minDate = minDate.AddHours(8); - // minDate = minDate.AddMinutes(-3 * (int)interval); - // var candleDataList = candleDatas.OrderBy(i => i.Argument).ToList(); - - // var list = candleDataList.Where(t => t.Argument > minDate).ToList(); - // var closeDataList = new List(); - - // if (list.Count > 3) - // { - // closeDataList.Add(list[0].Close); - // closeDataList.Add(list[1].Close); - // closeDataList.Add(list[2].Close); - // } - // else - // { - // closeDataList = list.Select(t => t.Close).ToList(); - // } - - // var minData = closeDataList.Min(); - - // if (candleData.Close < minData && 현재봉3 < 전봉3) - // { - // buyFlag = true; - // } - //} - - //if (candleData.Close > 저고점_30["전저가"]) - //{ - // buyFlag = true; - //} - //else - //{ - // BuyShortStep[market] = false; - //} - 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 min = candleData.Open + (저고점_30["전고가"] - 저고점_30["전저가"]); - - var buyDic = new Dictionary - { - { "MarketName", market }, - { "BuyDate", nowTime }, - { "Price", price }, - { "MaxValue", candleData.Open - (저고점_30["전고가"] - 저고점_30["전저가"]) * 1.5}, - { "MinValue", min}, - { "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, 0, 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++; - } - } - } - } - + 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", 저고점_5["전저가"] < 저고점_5["전전저가"]}, + { "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) + { + 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["BuyDate"]).AddMinutes(5); + if (nowTime < buyTime) + continue; + } + //임시로 처리 else { - var buyItem = DownBuyList[market]; - var flag = (bool)buyItem["Flag"]; - var MinValue = (double)buyItem["MinValue"]; - var MaxValue = (double)buyItem["MaxValue"]; - var sellFlag = false; + var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60); + if (nowTime < buyTime) + continue; + } + var sellFlag = false; - if (interval < MCandleTimeType.H1) - { - var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); + if (저고점_30["전고가"] < 전봉4_30) + sellFlag = true; - if (candleData.Argument < buyTime) - { - continue; - } - } - //임시로 처리 - else - { - var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60); - - if (candleData.Argument < buyTime) - { - continue; - } - } - - if (candleData.Close > candleData_전봉.High && - candleData.Close > candleData_전전봉.High && - candleData.Close > candleData_전전전봉.High) + if (flag) + { + if (저고점_5["전저가"] > 저고점_5["전전저가"]) { sellFlag = true; } + } + else + { + 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() + { + { "MarketName", market }, + { "BuyDate", buyItem["BuyDate"]}, + { "BuyPrice", buyPrice }, + { "Type", "하향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + 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 안됨 확인 필요"); + } - var buyTimeUnix = ((DateTimeOffset)((DateTime)buyItem["CandleTime"])).ToUnixTimeSeconds(); + double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue); + //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]); + //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"])); - if (Bol24_Down > candleData.Close) sellFlag = true; + //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); - if (전봉4 > 전전봉4) - sellFlag = true; + var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100; - if (sellFlag) - { - double.TryParse(buyItem["Price"].ToString(), out var buyPrice); - if (buyPrice < price) - BuyShortStep[market] = false; - var resultRate = ((price - buyPrice) / buyPrice) * 100; - - var result = new Dictionary() + var orderResult = new Dictionary() { { "MarketName", market }, - { "BuyDate", buyItem["BuyDate"]}, - { "BuyPrice", buyPrice }, + { "BuyDate", orderDic["BuyDate"]}, + { "BuyPrice", orderDic["Price"] }, { "Type", "하향"}, { "MCandleTimeType", (int)interval }, { "BuyCandle", buyItem["Candle"] }, { "SellDate", nowTime}, { "SellPrice", price }, { "SellCandle", candleData }, - { "Rate", resultRate } + { "Rate", resultRateData } }; - - 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--; - } + ResultList.Add(orderResult); + BuyShortList.Remove(orderDic); + ShortCount--; } } + } - } - catch (Exception e) - { - Console.WriteLine(e.Message); - } + } + catch (Exception e) + { + Console.WriteLine(e.Message); } } } @@ -1339,41 +1068,41 @@ namespace BitgetAPI.IndicatorConditionSetup } } - public bool Calculate전고점(string market, string strInterval, MCandleTimeType type, double 전봉3, double 전전봉3, double 전전전봉3, CandleData candleData) + public bool Calculate전고점(string market, string strInterval, MCandleTimeType type, double 전봉, double 전전봉, double 전전전봉, CandleData candleData) { var 저고점 = 전저고점[market + strInterval]; //전저가 - if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 && 저고점["tempHighVal"] >= 저고점["tempLowVal"] && + if (전봉 > 전전봉 && 전전봉 < 전전전봉 && 저고점["tempHighVal"] >= 저고점["tempLowVal"] && 저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] >= 120 * (int)type) { - 저고점["tempLow4Val"] = 저고점["tempLow3Val"]; - 저고점["tempLow3Val"] = 저고점["tempLow2Val"]; + 저고점["tempLow4Val"] = 저고점["tempLowVal"]; + 저고점["tempLowVal"] = 저고점["tempLow2Val"]; 저고점["tempLow2Val"] = 저고점["tempLowVal"]; 저고점["tempLowVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds(); 저고점["switchLowVal"] = 저고점["전전전전저가"]; 저고점["전전전전저가"] = 저고점["전전저가"]; 저고점["전전전저가"] = 저고점["전전저가"]; 저고점["전전저가"] = 저고점["전저가"]; - 저고점["전저가"] = 전전봉3; + 저고점["전저가"] = 전전봉; 저고점["Type"] = 0; } - else if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 && 저고점["tempHighVal"] < 저고점["tempLowVal"] && + else if (전봉 > 전전봉 && 전전봉 < 전전전봉 && 저고점["tempHighVal"] < 저고점["tempLowVal"] && 저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] >= 120 * (int)type) { - if (저고점["전저가"] > 전전봉3) + if (저고점["전저가"] > 전전봉) { 저고점["tempLowVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds(); - 저고점["전저가"] = 전전봉3; + 저고점["전저가"] = 전전봉; } 저고점["Type"] = 0; } - else if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 && + else if (전봉 > 전전봉 && 전전봉 < 전전전봉 && 저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] < 120 * (int)type) { @@ -1384,20 +1113,20 @@ namespace BitgetAPI.IndicatorConditionSetup 저고점["Type"] = 0; 저고점["전전전전고가"] = 저고점["switchLowVal"]; 저고점["tempHighVal"] = 저고점["tempHigh2Val"]; - 저고점["tempHigh2Val"] = 저고점["tempHigh3Val"]; - 저고점["tempHigh3Val"] = 저고점["tempHigh4Val"]; + 저고점["tempHigh2Val"] = 저고점["tempHighVal"]; + 저고점["tempHighVal"] = 저고점["tempHigh4Val"]; - if (저고점["전저가"] > 전전봉3) - 저고점["전저가"] = 전전봉3; + if (저고점["전저가"] > 전전봉) + 저고점["전저가"] = 전전봉; } //전고가 - if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 && 저고점["tempHighVal"] <= 저고점["tempLowVal"] && + if (전전봉 > 전봉 && 전전봉 > 전전전봉 && 저고점["tempHighVal"] <= 저고점["tempLowVal"] && 저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] >= 120 * (int)type) { - 저고점["tempHigh4Val"] = 저고점["tempHigh3Val"]; - 저고점["tempHigh3Val"] = 저고점["tempHigh2Val"]; + 저고점["tempHigh4Val"] = 저고점["tempHighVal"]; + 저고점["tempHighVal"] = 저고점["tempHigh2Val"]; 저고점["tempHigh2Val"] = 저고점["tempHighVal"]; 저고점["tempHighVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds(); 저고점["switchHighVal"] = 저고점["전전전전고가"]; @@ -1405,19 +1134,19 @@ namespace BitgetAPI.IndicatorConditionSetup 저고점["전전전고가"] = 저고점["전전고가"]; 저고점["전전고가"] = 저고점["전고가"]; 저고점["Type"] = 1; - 저고점["전고가"] = 전전봉3; + 저고점["전고가"] = 전전봉; } - else if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 && 저고점["tempHighVal"] > 저고점["tempLowVal"] && + else if (전전봉 > 전봉 && 전전봉 > 전전전봉 && 저고점["tempHighVal"] > 저고점["tempLowVal"] && 저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] >= 120 * (int)type) { - if (저고점["전고가"] < 전전봉3) + if (저고점["전고가"] < 전전봉) { 저고점["tempHighVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds(); - 저고점["전고가"] = 전전봉3; + 저고점["전고가"] = 전전봉; } } - else if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 && + else if (전전봉 > 전봉 && 전전봉 > 전전전봉 && 저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() && ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] < 120 * (int)type) { @@ -1428,11 +1157,11 @@ namespace BitgetAPI.IndicatorConditionSetup 저고점["전전전전저가"] = 저고점["switchHighVal"]; 저고점["Type"] = 1; 저고점["tempLowVal"] = 저고점["tempLow2Val"]; - 저고점["tempLow2Val"] = 저고점["tempLow3Val"]; - 저고점["tempLow3Val"] = 저고점["tempLow4Val"]; + 저고점["tempLow2Val"] = 저고점["tempLowVal"]; + 저고점["tempLowVal"] = 저고점["tempLow4Val"]; - if (저고점["전고가"] < 전전봉3) - 저고점["전고가"] = 전전봉3; + if (저고점["전고가"] < 전전봉) + 저고점["전고가"] = 전전봉; } if (저고점["전전전저가"] == 0 || 저고점["전전전고가"] == 0) @@ -1441,6 +1170,7 @@ namespace BitgetAPI.IndicatorConditionSetup return true; } + public Dictionary GetPendingOrders() { var timestamp = GetTimeStamp().ToString(); @@ -1660,4 +1390,2862 @@ namespace BitgetAPI.IndicatorConditionSetup } } -} \ No newline at end of file +} + +/* +if (영호조건식_상향돌파 || 영호조건식_하향돌파) + { + var 전봉4 = candleData_전봉.movingAverageDataList[4].Value; + var 전봉8 = candleData_전봉.movingAverageDataList[8].Value; + var 전봉24 = candleData_전봉.movingAverageDataList[24].Value; + var 전봉48 = candleData_전봉.movingAverageDataList[48].Value; + var 전봉72 = candleData_전봉.movingAverageDataList[72].Value; + + var 전전봉4 = candleData_전전봉.movingAverageDataList[4].Value; + var 전전봉8 = candleData_전전봉.movingAverageDataList[8].Value; + var 전전봉24 = candleData_전전봉.movingAverageDataList[24].Value; + var 전전봉48 = candleData_전전봉.movingAverageDataList[48].Value; + var 전전봉72 = candleData_전전봉.movingAverageDataList[72].Value; + + var 현재봉4 = candleData.movingAverageDataList[4].Value; + var 현재봉8 = candleData.movingAverageDataList[8].Value; + var 현재봉12 = candleData.movingAverageDataList[12].Value; + var 현재봉24 = candleData.movingAverageDataList[24].Value; + var 현재봉48 = candleData.movingAverageDataList[48].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; + + if ((int)interval != 1) + { + continue; + } + + #region 5분봉 처리 + //15분봉이지만 60분봉으로 변경 + //var candleDatas5 = findedMarket.candleDataList[MCandleTimeType.M5].ToList(); + //var candleDatas5_정렬 = candleDatas5.OrderBy(i => i.Argument).ToList(); + + //var candleData5 = candleDatas5.FirstOrDefault(i => i.Argument == candleDatas5_정렬.Last().Argument); + //if (candleData5 == null) continue; + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas5_정렬, candleData5); + //ichimokuConditionSetup.calIchimokuData(candleDatas5_정렬, candleData5); + + + //candleDatas5_정렬.RemoveAt(candleDatas5_정렬.Count - 1); + //var candleData5_전봉 = candleDatas5.FirstOrDefault(i => i.Argument == candleDatas5_정렬.Last().Argument); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas5_정렬, candleData5_전봉); + //ichimokuConditionSetup.calIchimokuData(candleDatas5_정렬, candleData5_전봉); + + //var 현재봉5_4 = candleData5.movingAverageDataList[4].Value; + //var 전봉5_4 = candleData5_전봉.movingAverageDataList[4].Value; + + #endregion + + 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)); + + try + { + if (!UpBuyList.ContainsKey(market + interval)) + { + if ( + candleData.IchimokData.하한선 > 현재봉4 && + candleData_전봉.IchimokData.하한선 > candleData_전봉.Close && + candleData_전봉.Open < candleData_전봉.Close && + 전봉4 > 전봉8 && 전전봉4 < 전전봉8 && + 전봉8 < 전봉24 && 전봉24 < 전봉48 && 전봉48 < 전봉72 && + 전전봉8 < 전전봉24 && 전전봉24 < 전전봉48 && 전전봉48 < 전전봉72 && + 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4 + ) { + + // 없으면 생성 + 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 }, + { "Candle", candleData } + }; + + UpBuyList.Add(market + interval, buyDic); + SellLongStep.Add(market + interval, 8); + + if (LongCount < 2) + { + double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage); + + if (orderData == null) + { + Log.Error("Buy 안됨 확인 필요"); + continue; + } + + 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 + interval]; + if (interval < MCandleTimeType.H1) + { + if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < ((DateTime)buyItem["BuyDate"]).Minute + (int)interval) + { + continue; + } + } + //임시로 처리 + else + { + if ((nowTime.Hour == 0 ? 24 : nowTime.Hour) < ((DateTime)buyItem["BuyDate"]).Hour + ((int)interval / 60)) + { + continue; + } + } + + var key = SellLongStep[market + interval]; + var sellFlag = false; + switch (SellLongStep[market + interval]) + { + case 8: + if (전봉8 > 전봉24) + { + SellLongStep[market + interval] = 24; + key = 24; + } + else + { + if (전봉4 < 전전봉4) + { + sellFlag = true; + } + + else if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < ((DateTime)buyItem["BuyDate"]).Minute + (int)interval * 2) + { + if (전봉4 > candleData_전봉.Close && 전봉4 < 전봉24) + { + sellFlag = true; + } + } + + if (현재봉4 < 현재봉8 && candleData.Close < candleData.movingAverageDataList[key].Value) sellFlag = true; + } + break; + case 24: + if (전봉8 > 전봉48) + { + SellLongStep[market + interval] = 48; + key = 48; + } + break; + case 48: + key = 8; + break; + } + + + if (candleData.movingAverageDataList[key].Value > 현재봉4 || sellFlag) + { + + double.TryParse(buyItem["Price"].ToString(), out var buyPrice); + var resultRate = ((price - buyPrice) / buyPrice) * 100; + + 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 + interval); + SellLongStep.Remove(market + interval); + + 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) + { + + } + } + 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)); + + try + { + //사는 시점 + if (!DownBuyList.ContainsKey(market + interval)) + { + if ( + candleData.IchimokData.상한선 < 현재봉4 && + candleData_전봉.IchimokData.상한선 < candleData_전봉.Close && + candleData_전봉.Open > candleData_전봉.Close && + 전봉4 < 전봉8 && 전전봉4 > 전전봉8 && + 전봉8 > 전봉24 && 전봉24 > 전봉48 && 전봉48 > 전봉72 && + 전전봉8 > 전전봉24 && 전전봉24 > 전전봉48 && 전전봉48 > 전전봉72 && + 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4 + ) + { + + // 없으면 생성 + 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 }, + { "Candle", candleData } + }; + + DownBuyList.Add(market + interval, buyDic); + + + if(ShortCount < 2) + { + double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage); + + if (orderData == null) { + Log.Error("Buy 안됨 확인 필요"); + continue; + } + + 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++; + SellShortStep.Add(market + interval, 8); + } + } + } + //파는 시점 + else + { + var buyItem = DownBuyList[market + interval]; + if (interval < MCandleTimeType.H1) + { + if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < ((DateTime)buyItem["BuyDate"]).Minute + (int)interval) + { + continue; + } + } + //임시로 처리 + else + { + if ((nowTime.Hour == 0 ? 24 : nowTime.Hour) < ((DateTime)buyItem["BuyDate"]).Hour + ((int)interval / 60)) + { + continue; + } + } + + var key = SellShortStep[market + interval]; + var sellFlag = false; + switch (SellShortStep[market + interval]) + { + case 8: + if (전봉8 < 전봉24) + { + SellShortStep[market + interval] = 24; + key = 24; + } + else + { + if (전봉4 > 전전봉4) + { + sellFlag = true; + } + else if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < ((DateTime)buyItem["BuyDate"]).Minute + (int)interval * 2) + { + if (전봉4 < candleData_전봉.Close && 전봉4 > 전봉24) + { + sellFlag = true; + } + } + + if (현재봉4 > 현재봉8 && candleData.Close > candleData.movingAverageDataList[key].Value) sellFlag = true; + } + + break; + case 24: + if (전봉8 < 전봉48) + { + SellShortStep[market + interval] = 48; + key = 48; + } + break; + case 48: + key = 8; + break; + + } + + if (candleData.movingAverageDataList[key].Value < 현재봉4 || sellFlag) + { + double.TryParse(buyItem["Price"].ToString(), out var buyPrice); + var resultRate = ((price - buyPrice) / buyPrice) * 100; + + var result = new Dictionary() + { + { "MarketName", market }, + { "BuyDate", buyItem["BuyDate"]}, + { "BuyPrice", buyPrice }, + { "Type", "하향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + DownResultList.Add(result); + DownBuyList.Remove(market + interval); + SellShortStep.Remove(market + interval); + 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); + } + } + } + + */ +/* + 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 높은값_48_24_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_48_24_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value); + // 24,72 높은값 + var 높은값_48_24_전봉 = Math.Max(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_48_24_전봉 = Math.Min(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value); + + // 24,72 높은값 + var 높은값_48_24 = Math.Max(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_48_24 = Math.Min(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value); + + var 높은값_12_낮은값72_24 = Math.Max(candleData.movingAverageDataList[12].Value, 낮은값_48_24); + var 낮은값_12_높은값72_24 = Math.Min(candleData.movingAverageDataList[12].Value, 높은값_48_24); + + 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 전봉4 = candleData_전봉.movingAverageDataList[4].Value; + var 전봉12 = candleData_전봉.movingAverageDataList[12].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; + + //5분봉이 default이지만 15분봉으로 변경 + if ((int)interval != 5) + { + continue; + } + + #region 15분봉 처리 + //15분봉이지만 60분봉으로 변경 + var candleDatas15 = findedMarket.candleDataList[MCandleTimeType.M15]; + var candleDatas15_정렬 = candleDatas15.ToList().OrderBy(i => i.Argument).ToList(); + + var candleData15 = candleDatas15.Find(i => i.Argument == candleDatas15_정렬.Last().Argument); + if (candleData15 == null) continue; + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas15_정렬, candleData15); + ichimokuConditionSetup.calIchimokuData(candleDatas15_정렬, candleData15); + + + candleDatas15_정렬.RemoveAt(candleDatas15_정렬.Count - 1); + var candleData15_전봉 = candleDatas15.Find(i => i.Argument == candleDatas15_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas15_정렬, candleData15_전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas15_정렬, candleData15_전봉); + + candleDatas15_정렬.RemoveAt(candleDatas15_정렬.Count - 1); + var candleData15_전전봉 = candleDatas15.Find(i => i.Argument == candleDatas15_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas15_정렬, candleData15_전전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas15_정렬, candleData15_전전봉); + + candleDatas15_정렬.RemoveAt(candleDatas15_정렬.Count - 1); + var candleData15_전전전봉 = candleDatas15.Find(i => i.Argument == candleDatas15_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas15_정렬, candleData15_전전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas15_정렬, candleData15_전전봉); + + + var 낮은값15_72_24 = Math.Min(candleData15.movingAverageDataList[72].Value, candleData15.movingAverageDataList[24].Value); + var 높은값15_72_24 = Math.Max(candleData15.movingAverageDataList[72].Value, candleData15.movingAverageDataList[24].Value); + + var 전봉낮은값15_72_24 = Math.Min(candleData15_전봉.movingAverageDataList[72].Value, candleData15_전봉.movingAverageDataList[24].Value); + var 전봉높은값15_72_24 = Math.Max(candleData15_전봉.movingAverageDataList[72].Value, candleData15_전봉.movingAverageDataList[24].Value); + var 전전봉낮은값15_72_24 = Math.Min(candleData15_전봉.movingAverageDataList[72].Value, candleData15_전봉.movingAverageDataList[24].Value); + var 전전봉높은값15_72_24 = Math.Max(candleData15_전봉.movingAverageDataList[72].Value, candleData15_전봉.movingAverageDataList[24].Value); + + var 현재봉15_12 = candleData15.movingAverageDataList[12].Value; + var 전봉15_12 = candleData15_전봉.movingAverageDataList[12].Value; + var 전전봉15_12 = candleData15_전전봉.movingAverageDataList[12].Value; + + var 현재봉15_4 = candleData15.movingAverageDataList[4].Value; + var 전봉15_4 = candleData15_전봉.movingAverageDataList[4].Value; + var 전전봉15_4 = candleData15_전전봉.movingAverageDataList[4].Value; + + var 전봉15Bol4 = candleData15_전봉.movingAverageDataList[4].BolangerValue; + var 전봉15Bol12 = candleData15_전봉.movingAverageDataList[12].BolangerValue; + var 전봉15Bol24 = candleData15_전봉.movingAverageDataList[24].BolangerValue; + + var 전전봉15Bol4 = candleData15_전전봉.movingAverageDataList[4].BolangerValue; + var 전전봉15Bol12 = candleData15_전전봉.movingAverageDataList[12].BolangerValue; + var 전전봉15Bol24 = candleData15_전전봉.movingAverageDataList[24].BolangerValue; + var 현재봉15Bol4 = candleData15.movingAverageDataList[4].BolangerValue; + var 현재봉15Bol12 = candleData15.movingAverageDataList[12].BolangerValue; + var 현재봉15Bol24 = candleData15.movingAverageDataList[24].BolangerValue; + #endregion + + #region 1분봉 처리 + //1분봉이지만 3분봉으로 변경 + var candleDatas1 = findedMarket.candleDataList[MCandleTimeType.M1]; + var candleDatas1_정렬 = candleDatas1.ToList().OrderBy(i => i.Argument).ToList(); + + var candleData1 = candleDatas1.Find(i => i.Argument == candleDatas1_정렬.Last().Argument); + if (candleData1 == null) continue; + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas1_정렬, candleData1); + ichimokuConditionSetup.calIchimokuData(candleDatas1_정렬, candleData1); + + candleDatas1_정렬.RemoveAt(candleDatas1_정렬.Count - 1); + var candleData1_전봉 = candleDatas1.Find(i => i.Argument == candleDatas1_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas1_정렬, candleData1_전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas1_정렬, candleData1_전봉); + + candleDatas1_정렬.RemoveAt(candleDatas1_정렬.Count - 1); + var candleData1_전전봉 = candleDatas1.Find(i => i.Argument == candleDatas1_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas1_정렬, candleData1_전전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas1_정렬, candleData1_전전봉); + + + var 높은값1_72_24 = Math.Max(candleData1.movingAverageDataList[72].Value, candleData1.movingAverageDataList[24].Value); + var 낮은값1_72_24 = Math.Min(candleData1.movingAverageDataList[72].Value, candleData1.movingAverageDataList[24].Value); + + var 전봉낮은값1_72_24 = Math.Min(candleData1_전봉.movingAverageDataList[72].Value, candleData1_전봉.movingAverageDataList[24].Value); + var 전봉높은값1_72_24 = Math.Max(candleData1_전봉.movingAverageDataList[72].Value, candleData1_전봉.movingAverageDataList[24].Value); + var 전전봉낮은값1_72_24 = Math.Min(candleData1_전전봉.movingAverageDataList[72].Value, candleData1_전전봉.movingAverageDataList[24].Value); + var 전전봉높은값1_72_24 = Math.Max(candleData1_전전봉.movingAverageDataList[72].Value, candleData1_전전봉.movingAverageDataList[24].Value); + + var 현재봉1_12 = candleData1.movingAverageDataList[12].Value; + var 전봉1_12 = candleData1_전봉.movingAverageDataList[12].Value; + var 전전봉1_12 = candleData1_전전봉.movingAverageDataList[12].Value; + + var 현재봉1_4 = candleData1.movingAverageDataList[4].Value; + var 전봉1_4 = candleData1_전봉.movingAverageDataList[4].Value; + var 전전봉1_4 = candleData1_전전봉.movingAverageDataList[4].Value; + + var 전봉1Bol4 = candleData1_전봉.movingAverageDataList[4].BolangerValue; + var 전봉1Bol12 = candleData1_전봉.movingAverageDataList[12].BolangerValue; + var 전봉1Bol24 = candleData1_전봉.movingAverageDataList[24].BolangerValue; + + var 전전봉1Bol4 = candleData1_전전봉.movingAverageDataList[4].BolangerValue; + var 전전봉1Bol12 = candleData1_전전봉.movingAverageDataList[12].BolangerValue; + var 전전봉1Bol24 = candleData1_전전봉.movingAverageDataList[24].BolangerValue; + var 현재봉1Bol4 = candleData1.movingAverageDataList[4].BolangerValue; + var 현재봉1Bol12 = candleData1.movingAverageDataList[12].BolangerValue; + var 현재봉1Bol24 = candleData1.movingAverageDataList[24].BolangerValue; + #endregion + + #region 60분봉 처리 + //60분봉이지만 180분 처리 + var candleDatas60 = findedMarket.candleDataList[MCandleTimeType.H1]; + var candleDatas60_정렬 = candleDatas60.ToList().OrderBy(i => i.Argument).ToList(); + + var candleData60 = candleDatas60.Find(i => i.Argument == candleDatas60_정렬.Last().Argument); + if (candleData60 == null) continue; + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas60_정렬, candleData60); + ichimokuConditionSetup.calIchimokuData(candleDatas60_정렬, candleData60); + + + candleDatas60_정렬.RemoveAt(candleDatas60_정렬.Count - 1); + var candleData60_전봉 = candleDatas60.Find(i => i.Argument == candleDatas60_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas60_정렬, candleData60_전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas60_정렬, candleData60_전봉); + + candleDatas60_정렬.RemoveAt(candleDatas60_정렬.Count - 1); + var candleData60_전전봉 = candleDatas60.Find(i => i.Argument == candleDatas60_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas60_정렬, candleData60_전전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas60_정렬, candleData60_전전봉); + + candleDatas60_정렬.RemoveAt(candleDatas60_정렬.Count - 1); + var candleData60_전전전봉 = candleDatas60.Find(i => i.Argument == candleDatas60_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas60_정렬, candleData60_전전전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas60_정렬, candleData60_전전전봉); + + + var 낮은값60_72_24 = Math.Min(candleData60.movingAverageDataList[72].Value, candleData60.movingAverageDataList[24].Value); + var 높은값60_72_24 = Math.Max(candleData60.movingAverageDataList[72].Value, candleData60.movingAverageDataList[24].Value); + + var 전봉낮은값60_72_24 = Math.Min(candleData60_전봉.movingAverageDataList[72].Value, candleData60_전봉.movingAverageDataList[24].Value); + var 전봉높은값60_72_24 = Math.Max(candleData60_전봉.movingAverageDataList[72].Value, candleData60_전봉.movingAverageDataList[24].Value); + var 전전봉낮은값60_72_24 = Math.Min(candleData60_전봉.movingAverageDataList[72].Value, candleData60_전봉.movingAverageDataList[24].Value); + var 전전봉높은값60_72_24 = Math.Max(candleData60_전봉.movingAverageDataList[72].Value, candleData60_전봉.movingAverageDataList[24].Value); + + var 현재봉60_12 = candleData60.movingAverageDataList[12].Value; + var 전봉60_12 = candleData60_전봉.movingAverageDataList[12].Value; + var 전전봉60_12 = candleData60_전전봉.movingAverageDataList[12].Value; + + var 현재봉60_4 = candleData60.movingAverageDataList[4].Value; + var 전봉60_4 = candleData60_전봉.movingAverageDataList[4].Value; + var 전전봉60_4 = candleData60_전전봉.movingAverageDataList[4].Value; + + var 전봉60Bol4 = candleData60_전봉.movingAverageDataList[4].BolangerValue; + var 전봉60Bol12 = candleData60_전봉.movingAverageDataList[12].BolangerValue; + var 전봉60Bol24 = candleData60_전봉.movingAverageDataList[24].BolangerValue; + + var 전전봉60Bol4 = candleData60_전전봉.movingAverageDataList[4].BolangerValue; + var 전전봉60Bol12 = candleData60_전전봉.movingAverageDataList[12].BolangerValue; + var 전전봉60Bol24 = candleData60_전전봉.movingAverageDataList[24].BolangerValue; + var 현재봉60Bol4 = candleData60.movingAverageDataList[4].BolangerValue; + var 현재봉60Bol12 = candleData60.movingAverageDataList[12].BolangerValue; + var 현재봉60Bol24 = candleData60.movingAverageDataList[24].BolangerValue; + #endregion + + 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)); + + try + { + var candle15Flag = 현재봉15_4 > 현재봉15_12 + && candleData15.Open < candleData15.Close + && 현재봉15_4 > 전봉15_4 + && 전봉15_4 > 전전봉15_4 + && 현재봉15_12 > 전봉15_12 + && 전봉15_12 > 전전봉15_12 + && 전봉15Bol12 - 전봉15Bol24 > 현재봉15Bol12 - 현재봉15Bol24; + + var candle60Flag = 현재봉60_4 > 현재봉60_12 + // && candleData60.Open < candleData60.Close + && 현재봉60_4 > 전봉60_4 + //&& 전봉60_4 > 전전봉60_4 + && 현재봉60_12 > 전봉60_12 + // && 전봉60_12 > 전전봉60_12 + && 전봉60Bol12 - 전봉60Bol24 > 현재봉60Bol12 - 현재봉60Bol24; + + + var buyFlag = 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4; + var sellFlag = 현재봉1_4 < 높은값1_72_24; + + var 전고점Data = 전고점[market + strInterval]; + double.TryParse(전고점Data["val"].ToString(), out var val); + bool.TryParse(전고점Data["flag"].ToString(), out var flag); + bool.TryParse(전고점Data["firstFlag"].ToString(), out var firstFlag); + bool.TryParse(전고점Data["clearFlag"].ToString(), out var clearFlag); + bool.TryParse(전고점Data["breakFlag"].ToString(), out var breakFlag); + bool.TryParse(전고점Data["tempBuyFlag"].ToString(), out var tempBuyFlag); + + if (현재봉4 < 낮은값_48_24 && candleData.IchimokData.하한선 > candleData.Close) + { + if (firstFlag) + 전고점Data["firstFlag"] = false; + + 전고점Data["flag"] = true; + 전고점Data["clearFlag"] = true; + 전고점Data["val"] = 0; + 전고점Data["breakFlag"] = false; + 전고점Data["tempBuyFlag"] = true; + } + + if (!flag || !breakFlag) + { + if (val == 0) + { + 전고점Data["val"] = 전봉4; + val = 전봉4; + } + + if (전봉4 < 전전봉4 && clearFlag) + { + 전고점Data["clearFlag"] = false; + if (전전봉4 < val) + { + 전고점Data["flag"] = false; + 전고점Data["breakFlag"] = true; + } + else + { + 전고점Data["flag"] = true; + } + } + + else if (전봉4 > 전전봉4) + { + 전고점Data["clearFlag"] = true; + if (val < 전봉4) + { + 전고점Data["val"] = 전봉4; + } + } + } + if (전전봉4 > 낮은값_48_24_전전봉 + && 전전봉4 < 높은값_48_24_전전봉 + && 전봉4 < 낮은값_48_24_전봉 + && 전봉12 > 낮은값_48_24_전봉) + { + if (UpList.ContainsKey(market + strInterval)) + { + if (UpList[market + strInterval]) + UpList[market + strInterval] = false; + } + else + { + UpList.Add(market + strInterval, false); + } + } + + if (( + 전전봉4 > 낮은값_48_24_전전봉 + && 전전봉4 < 높은값_48_24_전전봉 + && 전봉4 < 낮은값_48_24_전봉 + && 전봉12 > 낮은값_48_24_전봉 + && 전봉24 < 전전봉24 + && 전봉12 < 전전봉12 + && 전봉4 < 전전봉4 + && (!UpBuyValue.ContainsKey(market + strInterval) || (UpBuyValue.ContainsKey(market + strInterval) && UpBuyValue[market + strInterval] == 0)) + //&& 낮은값_48_24_전봉 < candleData_전봉.IchimokData.상한선 + //&& candleData_전봉.Close < candleData_전봉.IchimokData.상한선 + //&& candleData_전봉.Open > candleData_전봉.Close + )) + { + if (UpBuyValue.ContainsKey(market + strInterval) && UpBuyValue[market + strInterval] == 0) + { + UpBuyValue[market + strInterval] = candleData.Open; + } + else + { + UpBuyValue.Add(market + strInterval, candleData.Open); + } + } + else if (UpBuyValue.ContainsKey(market + strInterval) && UpBuyValue[market + strInterval] != 0 && 현재봉1_4 > 높은값1_72_24 && UpList.ContainsKey(market + strInterval) && !UpList[market + strInterval]) + { + if (UpBuyValue[market + strInterval] < candleData.Close) + { + if (UpList.ContainsKey(market + strInterval)) + { + UpList[market + strInterval] = true; + } + else + { + UpList.Add(market + strInterval, true); + } + + } + + UpBuyValue[market + strInterval] = 0; + } + + //사는 시점 + if (!UpBuyList.ContainsKey(market + interval)) + { + if ( + ( + 전전봉4 < 높은값_48_24_전전봉 + && 전전봉4 > 낮은값_48_24_전전봉 + && 전봉4 > 높은값_48_24_전봉 + && 전봉12 < 높은값_48_24_전봉 + && 전봉24 > 전전봉24 + && 전봉12 > 전전봉12 + && 전봉4 > 전전봉4 + && 높은값_48_24_전봉 > candleData_전봉.IchimokData.하한선 + && candleData_전봉.Close > candleData_전봉.IchimokData.하한선 + && candleData_전봉.Open < candleData_전봉.Close + ) + && flag && !firstFlag && buyFlag && tempBuyFlag + && UpList.ContainsKey(market + strInterval) && UpList[market + strInterval] + + //4 < 높은값_72_24_전전봉 && + //전봉4 > 높은값_72_24_전봉 && + //전봉12 > 전전봉12 && + //((전봉4 < candleData_전봉.IchimokData.하한선 && 높은값_72_24_전봉 < candleData_전봉.IchimokData.하한선) + //|| (전봉4 > candleData_전봉.IchimokData.하한선 && 높은값_72_24_전봉 > candleData_전봉.IchimokData.하한선)) && + //전봉4 - 전전봉4 > 전봉12 - 전전봉12 && + //전봉12 - 전전봉12 > 전봉24 - 전전봉24 + //) + //&& flag && !firstFlag && buyFlag && candle15Flag + + ) + { + 전고점Data["tempBuyFlag"] = false; + + if (!(candle15Flag && candle60Flag)) + continue; + + // 없으면 생성 + 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 }, + { "Candle", candleData } + }; + + UpBuyList.Add(market + interval, buyDic); + + if (val == 0) + 전고점Data["val"] = 전봉4; + + 전고점Data["flag"] = false; + 전고점Data["clearFlag"] = false; + + + if (LongCount < 3) + { + double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage); + 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 + interval]; + if (interval < MCandleTimeType.H1) + { + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval)) + { + continue; + } + } + //임시로 처리 + else + { + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours(((int)interval) / 60)) + { + continue; + } + } + + 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"]}, + { "Type", "상향"}, + { "BuyPrice", buyPrice }, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + UpResultList.Add(result); + UpBuyList.Remove(market + interval); + + 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) + { + + } + } + 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)); + + try + { + var candle15Flag = 현재봉15_4 < 현재봉15_12 + && candleData15.Open > candleData15.Close + && 현재봉15_4 < 전봉15_4 + && 전봉15_4 < 전전봉15_4 + && 현재봉15_12 < 전봉15_12 + && 전봉15_12 < 전전봉15_12 + && 전봉15Bol12 - 전봉15Bol24 > 현재봉15Bol12 - 현재봉15Bol24; + + + var candle60Flag = 현재봉60_4 < 현재봉12 + // && candleData60.Open > candleData60.Close + && 현재봉60_4 < 전봉60_4 + // && 전봉60_4 < 전전봉60_4 + && 현재봉60_12 < 전봉60_12 + //&& 전봉60_12 < 전전봉60_12 + && 전봉60Bol12 - 전봉60Bol24 > 현재봉60Bol12 - 현재봉60Bol24; + + var buyFlag = 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4; + + var sellFlag = 현재봉1_4 > 높은값1_72_24; + + var 전저점Data = 전저점[market + strInterval]; + double.TryParse(전저점Data["val"].ToString(), out var val); + bool.TryParse(전저점Data["flag"].ToString(), out var flag); + bool.TryParse(전저점Data["firstFlag"].ToString(), out var firstFlag); + bool.TryParse(전저점Data["clearFlag"].ToString(), out var clearFlag); + bool.TryParse(전저점Data["breakFlag"].ToString(), out var breakFlag); + bool.TryParse(전저점Data["tempBuyFlag"].ToString(), out var tempBuyFlag); + + if (현재봉4 > 높은값_48_24 && candleData.IchimokData.상한선 < candleData.Close) + { + if (firstFlag) + 전저점Data["firstFlag"] = false; + + 전저점Data["flag"] = true; + 전저점Data["clearFlag"] = true; + 전저점Data["val"] = 0; + 전저점Data["breakFlag"] = false; + 전저점Data["tempBuyFlag"] = true; + } + + if (!flag || !breakFlag) + { + if (val == 0) + { + 전저점Data["val"] = 전봉4; + val = 전봉4; + } + + if (전봉4 > 전전봉4 && clearFlag) + { + 전저점Data["clearFlag"] = false; + if (전전봉4 > val) + { + 전저점Data["flag"] = false; + 전저점Data["breakFlag"] = true; + } + else + { + 전저점Data["flag"] = true; + } + } + + else if (전봉4 < 전전봉4) + { + 전저점Data["clearFlag"] = true; + if (val > 전봉4) + { + 전저점Data["val"] = 전봉4; + } + } + } + if (전전봉4 < 높은값_48_24_전전봉 + && 전전봉4 > 낮은값_48_24_전전봉 + && 전봉4 > 높은값_48_24_전봉 + && 전봉12 < 높은값_48_24_전봉) + { + + if (DownList.ContainsKey(market + strInterval)) + { + if (DownList[market + strInterval]) + DownList[market + strInterval] = false; + } + else + { + DownList.Add(market + strInterval, false); + } + } + + if (( + 전전봉4 < 높은값_48_24_전전봉 + && 전전봉4 > 낮은값_48_24_전전봉 + && 전봉4 > 높은값_48_24_전봉 + && 전봉12 < 높은값_48_24_전봉 + && 전봉24 > 전전봉24 && 전봉12 > 전전봉12 + && 전봉4 > 전전봉4 + && (!DownBuyValue.ContainsKey(market + strInterval) || (DownBuyValue.ContainsKey(market + strInterval) && DownBuyValue[market + strInterval] == 0)) + //&& 높은값_48_24_전봉 > candleData_전봉.IchimokData.하한선 + //&& candleData_전봉.Close > candleData_전봉.IchimokData.하한선 + //&& candleData_전봉.Open < candleData_전봉.Close + )) + { + if (DownBuyValue.ContainsKey(market + strInterval) && DownBuyValue[market + strInterval] == 0) + { + DownBuyValue[market + strInterval] = candleData.Open; + } + else + { + DownBuyValue.Add(market + strInterval, candleData.Open); + } + } + else if (DownBuyValue.ContainsKey(market + strInterval) && DownBuyValue[market + strInterval] != 0 && 현재봉1_4 < 낮은값1_72_24 && DownList.ContainsKey(market + strInterval) && !DownList[market + strInterval]) + { + if (DownBuyValue[market + strInterval] > candleData.Close) + { + if (DownList.ContainsKey(market + strInterval)) + { + DownList[market + strInterval] = true; + } + else + { + DownList.Add(market + strInterval, true); + } + + } + + DownBuyValue[market + strInterval] = 0; + } + + //사는 시점 + if (!DownBuyList.ContainsKey(market + interval)) + { + if (( + 전전봉4 > 낮은값_48_24_전전봉 + && 전전봉4 < 높은값_48_24_전전봉 + && 전봉4 < 낮은값_48_24_전봉 + && 전봉12 > 낮은값_48_24_전봉 + && 전봉24 < 전전봉24 + && 전봉12 < 전전봉12 + && 전봉4 < 전전봉4 + && 낮은값_48_24_전봉 < candleData_전봉.IchimokData.상한선 + && candleData_전봉.Close < candleData_전봉.IchimokData.상한선 + && candleData_전봉.Open > candleData_전봉.Close + ) + && flag && !firstFlag && buyFlag && tempBuyFlag + && DownList.ContainsKey(market + strInterval) && DownList[market + strInterval] + ) + { + 전저점Data["tempBuyFlag"] = false; + if (!(candle15Flag && candle60Flag)) + continue; + + // 없으면 생성 + 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 }, + { "Candle", candleData } + }; + + DownBuyList.Add(market + interval, buyDic); + + if (val == 0) + 전저점Data["val"] = 전봉4; + + 전저점Data["flag"] = false; + 전저점Data["clearFlag"] = false; + + if(ShortCount < 2) + { + double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage); + 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 + interval]; + if (interval < MCandleTimeType.H1) + { + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval)) + { + continue; + } + } + //임시로 처리 + else + { + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours(((int)interval) / 60)) + { + continue; + } + } + + + 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"]}, + { "BuyPrice", buyPrice }, + { "Type", "하향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + DownResultList.Add(result); + DownBuyList.Remove(market + interval); + + 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); + } + } + } + */ +/* +if (영호조건식_상향돌파 || 영호조건식_하향돌파) + { + // 24,72 높은값 + var 높은값_72_24_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_72_24_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value); + // 24,72 높은값 + var 높은값_72_24_전봉 = Math.Max(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_72_24_전봉 = Math.Min(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value); + + // 24,72 높은값 + var 높은값_72_24 = Math.Max(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_72_24 = Math.Min(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value); + + var 전전봉4 = candleData_전전봉.movingAverageDataList[4].Value; + var 전전봉8 = candleData_전전봉.movingAverageDataList[8].Value; + var 전전봉12 = candleData_전전봉.movingAverageDataList[12].Value; + var 전전봉24 = candleData_전전봉.movingAverageDataList[24].Value; + var 전전봉72 = candleData_전전봉.movingAverageDataList[72].Value; + + var 전봉4 = candleData_전봉.movingAverageDataList[4].Value; + var 전봉8 = candleData_전봉.movingAverageDataList[8].Value; + var 전봉12 = candleData_전봉.movingAverageDataList[12].Value; + var 전봉24 = candleData_전봉.movingAverageDataList[24].Value; + var 전봉72 = candleData_전봉.movingAverageDataList[72].Value; + + var 현재봉4 = candleData.movingAverageDataList[4].Value; + var 현재봉8 = candleData.movingAverageDataList[8].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; + + if ((int)interval != 15) + { + continue; + } + + + 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)); + + try + { + //사는 시점 + if (!UpBuyList.ContainsKey(market + interval)) + { + if ( + ( + 전전봉4 < 높은값_72_24_전전봉 && + 전봉4 > 높은값_72_24_전봉 + && 전봉8 < 높은값_72_24_전봉 + && 전봉12 < 높은값_72_24_전봉 + && 전봉4 > 전전봉4 + && 전봉8 > 전전봉8 + && 전봉12 > 전전봉12 + && 전봉4 > candleData_전봉.IchimokData.하한선 + ) + ) + { + + // 없으면 생성 + 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 }, + { "Candle", candleData } + }; + + UpBuyList.Add(market + interval, buyDic); + SellLongStep.Add(market + interval, 0); + 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 + interval]; + if (interval < MCandleTimeType.H1) + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); + if (nowTime < buyTime) + continue; + } + //임시로 처리 + else + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); + if (nowTime < buyTime) + continue; + } + + var compareVal = 높은값_72_24; + var val = SellLongStep[market + interval]; + var sellFlag = false; + + if (val != 101) + { + if (높은값_72_24 < 현재봉8) + { + SellLongStep[market + interval] = 101; + val = 101; + } + } + + if (val == 101) + { + compareVal = 현재봉8; + } + + if (candleData_전봉.Close < candleData_전봉.Open && + candleData_전전봉.Close < candleData_전전봉.Open && + candleData_전전전봉.Close < candleData_전전전봉.Open) + sellFlag = true; + + if (현재봉4 < compareVal || sellFlag) + { + + double.TryParse(buyItem["Price"].ToString(), out var buyPrice); + var resultRate = ((price - buyPrice) / buyPrice) * 100; + + 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 + interval); + SellLongStep.Remove(market + interval); + + 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) + { + + } + } + 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)); + + try + { + //사는 시점 + if (!DownBuyList.ContainsKey(market + interval)) + { + if ( + 전전봉4 > 낮은값_72_24_전전봉 + && 전봉4 < 낮은값_72_24_전봉 + && 전봉8 > 낮은값_72_24_전봉 + && 전봉12 > 낮은값_72_24_전봉 + && 전봉4 < 전전봉4 + && 전봉8 < 전전봉8 + && 전봉12 < 전전봉12 + && candleData_전봉.IchimokData.상한선 > 전봉4 + ) + { + + // 없으면 생성 + 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 }, + { "Candle", candleData } + }; + + DownBuyList.Add(market + interval, buyDic); + SellShortStep.Add(market + interval, 0); + + 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 + interval]; + if (interval < MCandleTimeType.H1) + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); + if (nowTime < buyTime) + continue; + } + //임시로 처리 + else + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); + if (nowTime < buyTime) + continue; + } + + var compareVal = 낮은값_72_24; + var val = SellShortStep[market + interval]; + var sellFlag = false; + + if (val != 101) + { + if (낮은값_72_24 > 현재봉8) + { + SellShortStep[market + interval] = 101; + val = 101; + } + } + + if (val == 101) + { + compareVal = 현재봉8; + } + + + if (candleData_전봉.Close > candleData_전봉.Open && + candleData_전전봉.Close > candleData_전전봉.Open && + candleData_전전전봉.Close > candleData_전전전봉.Open) + sellFlag = true; + + + if (현재봉4 > compareVal || sellFlag) + { + double.TryParse(buyItem["Price"].ToString(), out var buyPrice); + var resultRate = ((price - buyPrice) / buyPrice) * 100; + + var result = new Dictionary() + { + { "MarketName", market }, + { "BuyDate", buyItem["BuyDate"]}, + { "BuyPrice", buyPrice }, + { "Type", "하향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + DownResultList.Add(result); + DownBuyList.Remove(market + interval); + SellLongStep.Remove(market + interval); + 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); + } + } + } + */ + + +/* + +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)); + + try + { + //사는 시점 + if (!UpBuyList.ContainsKey(market + interval)) + { + var buyFlag = false; + var buyTempFlag = false; + + var buyType = 0; + + if (BuyLongStep.ContainsKey(market + interval) && BuyLongStep[market + interval]) + { + if (전봉72 < 전봉24 && 전봉12 < 전봉2 && 전봉24 < 전봉2 && + candleData_전봉.IchimokData.상한선 < 전봉24 && + (전전봉24 < 전봉24 && 전전봉12 < 전봉12)) + { + buyTempFlag = true; + buyType = 2; + } + else if (전봉2 < 전봉24) + BuyLongStep[market + interval] = false; + } + else + { + if ( + candleData_전봉.IchimokData.상한선 > 전봉2 && candleData_전전봉.IchimokData.상한선 > 전전봉2 && + 전봉72 > 전봉2 && 전전봉72 > 전전봉2 && 전전봉24 > 전전봉2 && 전봉24 < 전봉2 && (전전봉24 < 전봉24 || 전전봉12 < 전봉12) + ) + { + buyTempFlag = true; + buyType = 1; + } + else if ( + candleData_전봉.IchimokData.하한선 < 전봉2 && candleData_전전봉.IchimokData.하한선 < 전전봉2 && + 전봉24 < 전봉2 && 전전봉2 < 전전봉24 && 전전봉72 < 전전봉2 && 전봉72 < 전봉2 && (전전봉24 < 전봉24 || 전전봉12 < 전봉12) + ) + { + BuyLongStep[market + interval] = true; + continue; + } + } + + if (buyTempFlag) + { + if (buyType == 1) + { + if (Bol12_Up < Bol24_Up && 전봉Bol12_Up < 전봉Bol24_Up && Math.Abs(전봉24 - 전봉Bol72_Down) < Math.Abs(전봉24 - 전봉72)) + { + buyFlag = true; + } + } + else if (buyType == 2) + { + if (Bol12_Up < Bol24_Up && 전봉Bol12_Up < 전봉Bol24_Up && Math.Abs(현재봉24 - Bol72_Up) < Math.Abs(현재봉24 - 현재봉72)) + { + 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 }, + { "MCandleTimeType", (int)interval }, + { "Type", buyType }, + { "CandleTime", candleData.Argument }, + { "MovingRate4_8", 현재봉8 - 현재봉4 }, + { "Candle", candleData } + }; + + UpBuyList.Add(market + interval, buyDic); + + var dic = new Dictionary + { + [1] = true, + [2] = false, + [3] = false, + [4] = false, + [5] = false + }; + SellLongStep.Add(market + interval, 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 + interval]; + + if (interval < MCandleTimeType.H1) + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); + if (nowTime < buyTime) + continue; + } + //임시로 처리 + else + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60); + if (nowTime < buyTime) + continue; + } + + var sellFlag = false; + int.TryParse(buyItem["Type"].ToString(), out var type); + var val = SellLongStep[market + interval]; + //switch (type) + //{ + // case 1: + // if (전봉12 > 전봉24 && !val[2]) + // val[2] = true; + // if (전봉2 > 전봉72 && !val[3]) + // val[3] = true; + // if (전봉12 > 전봉72 && !val[4]) + // val[4] = true; + // if (전봉24 > 전봉72 && !val[5]) + // val[5] = true; + + // if (val[1] && !val[2] && !val[3] && !val[4] && !val[5]) + // { + // sellFlag = !(전봉12 < 전봉24 && 전봉24 < 전봉2 && 전봉2 < 전봉72); + // } + // else if (val[1] && val[2] && !val[3] && !val[4] && !val[5]) + // { + // sellFlag = !(전봉24 < 전봉12 && 전봉12 < 전봉2 && 전봉2 < 전봉72); + // } + // else if (val[1] && !val[2] && val[3] && !val[4] && !val[5]) + // { + // sellFlag = !(전봉12 < 전봉24 && 전봉24 < 전봉72 && 전봉72 < 전봉2); + // } + // else if (val[1] && val[2] && val[3] && !val[4] && !val[5]) + // { + // sellFlag = !(전봉24 < 전봉12 && 전봉12 < 전봉72 && 전봉72 < 전봉2); + // } + // else if (val[1] && val[2] && val[3] && val[4] && !val[5]) + // { + // sellFlag = !(전봉24 < 전봉72 && 전봉72 < 전봉12 && 전봉12 < 전봉2); + // } + // else if (val[1] && val[2] && val[3] && val[4] && val[5]) + // { + // sellFlag = !(전봉72 < 전봉24 && 전봉24 < 전봉12 && 전봉12 < 전봉2); + // } + + // break; + // case 2: + // if ((전봉24 < 현재봉24 && 전봉12 < 현재봉12) || 현재봉2 > 현재봉24) + // { + // sellFlag = true; + // } + // break; + + //} + if (type == 1) + { + if (Math.Abs(전봉4 - 전봉Bol72_Down) < Math.Abs(전봉4 - 전봉72)) + { + if (전봉2 < 전봉4 && !(전봉24 > 전전봉24 && 전봉12 > 전전봉12)) + { + sellFlag = true; + BuyLongStep[market + interval] = false; + } + else + { + if ((전전봉24 > 전봉24 && 전전봉12 > 전봉12) || + (전봉2 < 전봉24)) + { + sellFlag = true; + BuyLongStep[market + interval] = false; + } + } + + } + else + { + if ((전전봉24 > 전봉24 && 전전봉12 > 전봉12) || + (전봉2 < 전봉24)) + { + sellFlag = true; + BuyLongStep[market + interval] = false; + } + } + } + else if (type == 2) + { + if ((전전봉24 > 전봉24 && 전전봉12 > 전봉12) || + ((전전봉24 > 전봉24 || 전전봉12 > 전봉12) && 현재봉2 < 현재봉72 && 전봉2 > 전봉72) || + 전봉24 > 전봉Bol72_Up && 전봉2 < 전봉Bol72_Up + ) + { + sellFlag = true; + BuyLongStep[market + interval] = false; + } + } + 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"]}, + { "Type", "상향"}, + { "BuyPrice", buyPrice }, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + UpResultList.Add(result); + UpBuyList.Remove(market + interval); + SellLongStep.Remove(market + interval); + + 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) + { + + } + } + 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)); + + try + { + //사는 시점 + if (!DownBuyList.ContainsKey(market + interval)) + { + var buyFlag = false; + var buyTempFlag = false; + + var buyType = 0; + + if (BuyShortStep.ContainsKey(market + interval) && BuyShortStep[market + interval]) + { + if (전봉72 > 전봉24 && 전봉12 > 전봉2 && 전봉24 > 전봉2 && + candleData_전봉.IchimokData.하한선 > 전봉24 && + (전전봉24 > 전봉24 && 전전봉12 > 전봉12)) + { + buyTempFlag = true; + buyType = 2; + } + else if (전봉2 > 전봉24) + BuyShortStep[market + interval] = false; + } + else + { + if ( + candleData_전봉.IchimokData.하한선 < 전봉2 && candleData_전전봉.IchimokData.하한선 < 전전봉2 && + 전봉72 < 전봉2 && 전전봉72 < 전전봉2 && 전전봉24 < 전전봉2 && 전봉24 > 전봉2 && (전전봉24 > 전봉24 || 전전봉12 > 전봉12) + ) + { + buyTempFlag = true; + buyType = 1; + } + else if ( + candleData_전봉.IchimokData.상한선 > 전봉2 && candleData_전전봉.IchimokData.상한선 > 전전봉2 && + 전봉24 > 전봉2 && 전전봉2 > 전전봉24 && 전전봉72 > 전전봉2 && 전봉72 > 전봉2 && (전전봉24 > 전봉24 || 전전봉12 > 전봉12) + ) + { + BuyShortStep[market + interval] = true; + continue; + } + } + + if (buyTempFlag) + { + if (buyType == 1) + { + if (Bol12_Down > Bol24_Down && 전봉Bol12_Down > 전봉Bol24_Down && Math.Abs(전봉24 - 전봉Bol72_Up) < Math.Abs(전봉24 - 전봉72)) + { + buyFlag = true; + } + } + else if (buyType == 2) + { + if (Bol12_Down > Bol24_Down && 전봉Bol12_Down > 전봉Bol24_Down && Math.Abs(현재봉24 - Bol72_Down) < Math.Abs(현재봉24 - 현재봉72)) + { + 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 }, + { "MCandleTimeType", (int)interval }, + { "Type", buyType }, + { "CandleTime", candleData.Argument }, + { "MovingRate4_8", 현재봉4 - 현재봉8 }, + { "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 (buyType == 2) + { + BuyShortStep[market + interval] = false; + } + 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 sellFlag = false; + var buyItem = DownBuyList[market + interval]; + + if (interval < MCandleTimeType.H1) + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); + if (nowTime < buyTime) + continue; + } + //임시로 처리 + else + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60); + if (nowTime < buyTime) + continue; + } + + int.TryParse(buyItem["Type"].ToString(), out var type); + + //switch (type) + //{ + // case 1: + // var val = SellShortStep[market + interval]; + // if (전봉12 < 전봉24 && !val[2]) + // val[2] = true; + // if (전봉2 < 전봉72 && !val[3]) + // val[3] = true; + // if (전봉12 < 전봉72 && !val[4]) + // val[4] = true; + // if (전봉24 < 전봉72 && !val[5]) + // val[5] = true; + + // if (val[1] && !val[2] && !val[3] && !val[4] && !val[5]) + // { + // sellFlag = !(전봉12 > 전봉24 && 전봉24 > 전봉2 && 전봉2 > 전봉72); + // } + // else if (val[1] && val[2] && !val[3] && !val[4] && !val[5]) + // { + // sellFlag = !(전봉24 > 전봉12 && 전봉12 > 전봉2 && 전봉2 > 전봉72); + // } + // else if (val[1] && !val[2] && val[3] && !val[4] && !val[5]) + // { + // sellFlag = !(전봉12 > 전봉24 && 전봉24 > 전봉72 && 전봉72 >전봉2); + // } + // else if (val[1] && val[2] && val[3] && !val[4] && !val[5]) + // { + // sellFlag = !(전봉24 > 전봉12 && 전봉12 > 전봉72 && 전봉72 > 전봉2); + // } + // else if (val[1] && val[2] && val[3] && val[4] && !val[5]) + // { + // sellFlag = !(전봉24 > 전봉72 && 전봉72 > 전봉12 && 전봉12 > 전봉2); + // } + // else if (val[1] && val[2] && val[3] && val[4] && val[5]) + // { + // sellFlag = !(전봉72 > 전봉24 && 전봉24 > 전봉12 && 전봉12 > 전봉2); + // } + // else + // sellFlag = true; + // break; + // case 2: + // if(전봉12 < 현재봉12 && 전봉24 < 현재봉24) + // { + // sellFlag = true; + // } + // break; + //} + + if (type == 1) + { + if (Math.Abs(전봉4 - 전봉Bol72_Up) < Math.Abs(전봉4 - 전봉72)) + { + if (전봉2 > 전봉4 && !(전봉24 < 전전봉24 && 전봉12 < 전전봉12)) + { + sellFlag = true; + BuyShortStep[market + interval] = false; + } + else + { + if ((전전봉24 < 전봉24 && 전전봉12 < 전봉12) || + (전봉2 > 전봉24)) + { + sellFlag = true; + BuyShortStep[market + interval] = false; + } + } + + } + else + { + if ((전전봉24 < 전봉24 && 전전봉12 < 전봉12) || + (전봉2 > 전봉24)) + { + sellFlag = true; + BuyShortStep[market + interval] = false; + } + } + } + else if (type == 2) + { + if ((전전봉24 < 전봉24 && 전전봉12 < 전봉12) || + ((전전봉24 < 전봉24 || 전전봉12 < 전봉12) && 현재봉2 > 현재봉72 && 전봉2 < 전봉72) || + 전봉24 < 전봉Bol72_Down && 전봉2 > 전봉Bol72_Down + ) + { + sellFlag = true; + BuyShortStep[market + interval] = false; + } + } + + 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"]}, + { "BuyPrice", buyPrice }, + { "Type", "하향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + DownResultList.Add(result); + DownBuyList.Remove(market + interval); + SellShortStep.Remove(market + interval); + 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); + } + } + + */ + +/** + +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)); + + try + { + //사는 시점 + if (!UpBuyList.ContainsKey(market + interval)) + { + var buyFlag = false; + + if(!BuyLongStep.ContainsKey(market + interval) || !BuyLongStep[market + interval]) + { + if(전전봉2 < 전전봉Bol72_Down) + { + BuyLongStep[market + interval] = true; + continue; + } + } + + if(BuyLongStep.ContainsKey(market + interval) || BuyLongStep[market + interval]) + { + if(전봉24 < 현재봉24 && 전봉24 < 전봉72 && 현재봉24 < 현재봉72 && 전봉72 > 전봉2 && 현재봉72 < 현재봉2 && 현재봉24 > Bol72_Down) + { + buyFlag = true; + } + } + + if (buyFlag) + { + BuyLongStep[market + interval] = false; + // 없으면 생성 + 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 }, + { "MovingRate4_8", 현재봉8 - 현재봉4 }, + { "Candle", candleData } + }; + + UpBuyList.Add(market + interval, buyDic); + + var dic = new Dictionary + { + [1] = true, + [2] = false, + [3] = false, + [4] = false, + [5] = false + }; + SellLongStep.Add(market + interval, 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 + interval]; + + if (interval < MCandleTimeType.H1) + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); + if (nowTime < buyTime) + continue; + } + //임시로 처리 + else + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60); + if (nowTime < buyTime) + continue; + } + + var sellFlag = false; + + if(전봉24 < 전봉72) + { + if (전봉2 < 전봉72) + sellFlag = true; + if (전봉2 < 전봉Bol72_Up && 전전봉2 > 전전봉Bol72_Up) + sellFlag = true; + + } + else + { + if (현재봉24 < 현재봉72) + sellFlag = true; + if (Bol72_Up < 현재봉24) + sellFlag = true; + if (전봉72 > 현재봉72 && 전봉24 > 현재봉24) + sellFlag = true; + } + + 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"]}, + { "Type", "상향"}, + { "BuyPrice", buyPrice }, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + UpResultList.Add(result); + UpBuyList.Remove(market + interval); + SellLongStep.Remove(market + interval); + + 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) + { + + } + } + 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)); + + try + { + //사는 시점 + if (!DownBuyList.ContainsKey(market + interval)) + { + var buyFlag = false; + + if (!BuyShortStep.ContainsKey(market + interval) || !BuyShortStep[market + interval]) + { + if (전전봉2 > 전전봉Bol72_Up) + { + BuyShortStep[market + interval] = true; + continue; + } + } + + if (BuyShortStep.ContainsKey(market + interval) || BuyShortStep[market + interval]) + { + if (전봉24 > 현재봉24 && 전봉24 > 전봉72 && 현재봉24 > 현재봉72 && 전봉72 < 전봉2 && 현재봉72 > 현재봉2 && 현재봉24 < Bol72_Up) + { + buyFlag = true; + } + } + + if (buyFlag) + { + BuyShortStep[market + interval] = false; + // 없으면 생성 + 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 }, + { "MovingRate4_8", 현재봉4 - 현재봉8 }, + { "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); + BuyShortStep[market + interval] = false; + 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 sellFlag = false; + var buyItem = DownBuyList[market + interval]; + + if (interval < MCandleTimeType.H1) + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval); + if (nowTime < buyTime) + continue; + } + //임시로 처리 + else + { + var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60); + if (nowTime < buyTime) + continue; + } + + if (전봉24 > 전봉72) + { + if (전봉2 > 전봉72) + sellFlag = true; + if (전봉2 > 전봉Bol72_Down && 전전봉2 > 전전봉Bol72_Down) + sellFlag = true; + } + else + { + if (현재봉24 > 현재봉72) + sellFlag = true; + if (Bol72_Down > 현재봉24) + sellFlag = true; + if (전봉72 < 현재봉72 && 전봉24 < 현재봉24) + sellFlag = true; + } + 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"]}, + { "BuyPrice", buyPrice }, + { "Type", "하향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + DownResultList.Add(result); + DownBuyList.Remove(market + interval); + SellShortStep.Remove(market + interval); + 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); + } + } + + */ \ No newline at end of file