From 3955d26b2dffec3bfc14eb72baa44883c3978f84 Mon Sep 17 00:00:00 2001 From: kyh <1329522@naver.com> Date: Wed, 20 Nov 2024 13:46:49 +0900 Subject: [PATCH] =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=AA=87=EA=B0=9C?= =?UTF-8?q?=EB=A7=8C=20=ED=95=98=EB=8F=84=EB=A1=9D=20=ED=8C=8C=EB=8A=94?= =?UTF-8?q?=EA=B1=B0=20=EB=94=94=ED=85=8C=EC=9D=BC=20=EC=9E=A1=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IndicatorProcess.cs | 826 +++++++++++++++--- 1 file changed, 689 insertions(+), 137 deletions(-) diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 529722f..8116d96 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -3,11 +3,13 @@ using BitgetAPI.Data; using BitgetAPI.IndicatorConditionSetup; using BitgetAPI.WebService; using DevExpress.Internal.WinApi.Windows.UI.Notifications; +using DevExpress.Utils.DirectXPaint; using DevExpress.Utils.IoC; using DevExpress.Xpo.Logger; using DevExpress.XtraPrinting.Native; using Newtonsoft.Json; using Serilog; +using Serilog.Debugging; using System; using System.Collections.Generic; using System.Collections.Specialized; @@ -247,11 +249,10 @@ namespace BitgetAPI.IndicatorConditionSetup // 시간별로 정렬하기 (임시 리스트) var candleDatas = findedMarket.candleDataList[interval]; - var candleDatas_정렬 = candleDatas.ToList().OrderBy(i => i.Argument).ToList(); - + var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); + var candleData = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); - if (candleData == null) continue; ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData); @@ -266,26 +267,11 @@ namespace BitgetAPI.IndicatorConditionSetup candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); var candleData_전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); + + if (candleData_전전봉 == null) continue; ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전전봉); 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); - if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선 && candleData.Close > candleData.IchimokData.상한선) { @@ -348,49 +334,55 @@ namespace BitgetAPI.IndicatorConditionSetup 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; + // 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 전전봉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 전봉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) + if ((int)interval != 5) { continue; } - - #region 5분봉 처리 - //15분봉이지만 60분봉으로 변경 - var candleDatas5 = findedMarket.candleDataList[MCandleTimeType.M5]; - var candleDatas5_정렬 = candleDatas5.ToList().OrderBy(i => i.Argument).ToList(); - - var candleData5 = candleDatas5.Find(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 candleData15_전봉 = candleDatas5.Find(i => i.Argument == candleDatas5_정렬.Last().Argument); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas5_정렬, candleData15_전봉); - ichimokuConditionSetup.calIchimokuData(candleDatas5_정렬, candleData15_전봉); - - - #endregion + if (영호조건식_상향돌파) { @@ -403,17 +395,23 @@ namespace BitgetAPI.IndicatorConditionSetup var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); try - { + { + //사는 시점 if (!UpBuyList.ContainsKey(market + interval)) { if ( - candleData_전봉.IchimokData.하한선 > candleData_전봉.Close && - candleData_전봉.Open < candleData_전봉.Close && - 현재봉4 > 전봉4 && - (전봉4 > 전봉8 && 전전봉4 < 전전봉8) && - (전봉8 < 전봉24 && 전봉24 < 전봉72) - ) { - + ( + 전전봉4 < 낮은값_72_24_전전봉 && + 전봉4 > 낮은값_72_24_전봉 + && 전봉8 < 낮은값_72_24_전봉 + && 전봉12 < 낮은값_72_24_전봉 + && 전봉4 > 전전봉4 + && 전봉8 > 전전봉8 + && 전봉12 > 전전봉12 + ) + ) + { + // 없으면 생성 if (signalData == null) { @@ -439,30 +437,29 @@ namespace BitgetAPI.IndicatorConditionSetup }; UpBuyList.Add(market + interval, buyDic); - - + SellLongStep.Add(market + interval, 0); if (LongCount < 2) { - double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + 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 + if (orderData != null) { - { "MarketName", market }, - { "BuyDate", nowTime }, - { "Price", price }, - { "MCandleTimeType", (int)interval }, - { "Candle", candleData }, - { "Size", size }, - { "orderId", orderDic["orderId"] } - }; - BuyLongList.Add(orderDataDic); - LongCount++; + var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); - SellLongStep.Add(market + interval, 8); + var orderDataDic = new Dictionary + { + { "MarketName", market }, + { "BuyDate", nowTime }, + { "Price", price }, + { "MCandleTimeType", (int)interval }, + { "Candle", candleData }, + { "Size", size }, + { "orderId", orderDic["orderId"] } + }; + BuyLongList.Add(orderDataDic); + LongCount++; + } } - } } //파는 시점 @@ -471,7 +468,9 @@ namespace BitgetAPI.IndicatorConditionSetup var buyItem = UpBuyList[market + interval]; if (interval < MCandleTimeType.H1) { - if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval)) + var com = ((DateTime)buyItem["BuyDate"]).Minute + (int)interval; + + if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < (com > 59 ? com - 60: com)) { continue; } @@ -479,33 +478,62 @@ namespace BitgetAPI.IndicatorConditionSetup //임시로 처리 else { - if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours(((int)interval) / 60)) + var com = ((DateTime)buyItem["BuyDate"]).Hour + ((int)interval / 60); + if ((nowTime.Hour == 0 ? 24 : nowTime.Hour) < (com > 23 ? com - 24 : com)) { continue; } } - var key = SellLongStep[market + interval]; - - switch (SellLongStep[market + interval]) { - case 8: - if (전봉8 > 전봉24) - { - SellLongStep[market + interval] = 24; - key = 24; + var compareVal = 낮은값_72_24; + var val = SellLongStep[market + interval]; + if (val < 100) + { + if (현재봉4 > 높은값_72_24) + { + SellLongStep[market + interval] = 100; + val = 100; + + } + else + { + if(val != 1) + { + if (낮은값_72_24 < 현재봉8 || 현재봉4 < 현재봉8) + { + SellLongStep[market + interval] = 1; + val = 1; + } } - - break; - case 24: - if (전봉8 > 전봉72) - { - SellLongStep[market + interval] = 72; - key = 72; + } + } + if(val > 100) + { + if(val != 101) + { + if (높은값_72_24 > 현재봉8) + { + SellLongStep[market + interval] = 101; + val = 101; } - break; + } } - if (candleData.movingAverageDataList[key].Value > 현재봉4) + if(val == 100) + { + compareVal = 높은값_72_24; + } + else if(val == 101) + { + compareVal = 현재봉8; + } + else if(val == 1) + { + compareVal = 현재봉12; + } + + + if (현재봉4 < compareVal) { double.TryParse(buyItem["Price"].ToString(), out var buyPrice); @@ -527,7 +555,7 @@ namespace BitgetAPI.IndicatorConditionSetup UpResultList.Add(result); UpBuyList.Remove(market + interval); - SellLongStep.Remove(market + interval); + SellLongStep.Remove(market + interval); var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market); @@ -595,14 +623,16 @@ namespace BitgetAPI.IndicatorConditionSetup if (!DownBuyList.ContainsKey(market + interval)) { if ( - candleData_전봉.IchimokData.상한선 < candleData_전봉.Close && - candleData_전봉.Open > candleData_전봉.Close && - 현재봉4 < 전봉4 && - (전봉4 < 전봉8 && 전전봉4 > 전전봉8) && - (전봉8 > 전봉24 && 전봉24 > 전봉72) - ) + 전전봉4 > 높은값_72_24_전전봉 + && 전봉4 < 높은값_72_24_전봉 + && 전봉8 > 높은값_72_24_전봉 + && 전봉12 > 높은값_72_24_전봉 + && 전봉4 < 전전봉4 + && 전봉8 < 전전봉8 + && 전봉12 < 전전봉12 + ) { - + // 없으면 생성 if (signalData == null) { @@ -628,27 +658,29 @@ namespace BitgetAPI.IndicatorConditionSetup }; DownBuyList.Add(market + interval, buyDic); - + SellShortStep.Add(market + interval, 0); - if(ShortCount < 2) + if (ShortCount < 2) { - double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + 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 + if (orderData != null) { - { "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); + 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++; + } } } } @@ -658,7 +690,7 @@ namespace BitgetAPI.IndicatorConditionSetup var buyItem = DownBuyList[market + interval]; if (interval < MCandleTimeType.H1) { - if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval)) + if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < ((DateTime)buyItem["BuyDate"]).Minute + (int)interval) { continue; } @@ -666,36 +698,62 @@ namespace BitgetAPI.IndicatorConditionSetup //임시로 처리 else { - if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours(((int)interval) / 60)) + if ((nowTime.Hour == 0 ? 24 : nowTime.Hour) < ((DateTime)buyItem["BuyDate"]).Hour + ((int)interval / 60)) { continue; } } - var key = SellShortStep[market + interval]; - - switch (SellShortStep[market + interval]) + var compareVal = 높은값_72_24; + var val = SellShortStep[market + interval]; + if (val < 100) { - case 8: - if (전봉8 < 전봉24) - { - SellShortStep[market + interval] = 24; - key = 24; - } + if (현재봉4 < 낮은값_72_24) + { + SellShortStep[market + interval] = 100; + val = 100; - break; - case 24: - if (전봉24 < 전봉72) + } + else + { + if (val != 1) { - SellShortStep[market + interval] = 72; - key = 72; + if (높은값_72_24 > 현재봉8 || 현재봉4 < 현재봉8) + { + SellShortStep[market + interval] = 1; + val = 1; + } } - break; + } + } + if (val > 100) + { + if (val != 101) + { + if (낮은값_72_24 > 현재봉8) + { + SellShortStep[market + interval] = 101; + val = 101; + } + } } - if (candleData.movingAverageDataList[key].Value < 현재봉4) + if (val == 100) { + compareVal = 낮은값_72_24; + } + else if (val == 101) + { + compareVal = 현재봉8; + } + else if (val == 1) + { + compareVal = 현재봉12; + } + + if (현재봉4 < compareVal) + { double.TryParse(buyItem["Price"].ToString(), out var buyPrice); var resultRate = ((price - buyPrice) / buyPrice) * 100; @@ -715,7 +773,7 @@ namespace BitgetAPI.IndicatorConditionSetup DownResultList.Add(result); DownBuyList.Remove(market + interval); - + SellLongStep.Remove(market + interval); var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market); if (orderDic != null) @@ -986,6 +1044,500 @@ namespace BitgetAPI.IndicatorConditionSetup } } +/* +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 (영호조건식_상향돌파 || 영호조건식_하향돌파) {