From c17b0baf5b33677e6a84da7e5a81c4c2d68bec93 Mon Sep 17 00:00:00 2001 From: kyh <1329522@naver.com> Date: Mon, 19 May 2025 13:22:46 +0900 Subject: [PATCH] =?UTF-8?q?Macd,=20=EA=B0=80=EA=B2=A9=20Range=20SMA=20?= =?UTF-8?q?=ED=8F=89=EA=B7=A0=EC=9C=BC=EB=A1=9C=20=ED=8C=90=EB=A7=A4=20?= =?UTF-8?q?=EB=93=B1=20=EC=B6=94=EA=B0=80=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BitgetApi/BitgetApi.csproj | 1 + .../IndicatorProcess.cs | 3587 ++--------------- .../TradingViewConditionSetup.cs | 258 ++ 3 files changed, 496 insertions(+), 3350 deletions(-) create mode 100644 BitgetApi/IndicatorConditionSetup/TradingViewConditionSetup.cs diff --git a/BitgetApi/BitgetApi.csproj b/BitgetApi/BitgetApi.csproj index 35695d9..573d09d 100644 --- a/BitgetApi/BitgetApi.csproj +++ b/BitgetApi/BitgetApi.csproj @@ -112,6 +112,7 @@ + diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 8a1b60a..04d1a62 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -1,4 +1,6 @@ -using BitgetApi.Data; + +using BitgetApi.Data; +using BitgetApi.IndicatorConditionSetup; using BitgetApi.IndicatorData; using BitgetAPI.Data; using BitgetAPI.WebService; @@ -130,7 +132,7 @@ namespace BitgetAPI.IndicatorConditionSetup var range = 34; IchimokuConditionSetup ichimokuConditionSetup = new IchimokuConditionSetup(); MovingAverageConditionSetup movingAverageConditionSetup = new MovingAverageConditionSetup(); - ImpulseMacdConditionSetup impulseMacdConditionSetup = new ImpulseMacdConditionSetup(); + TradingViewConditionSetup tradingViewConditionSetup = new TradingViewConditionSetup(); signals_LU.Clear(); signals_SD.Clear(); signals_LD.Clear(); @@ -275,10 +277,8 @@ namespace BitgetAPI.IndicatorConditionSetup var candleData_Main = candleDatas_정렬_Temp[i]; if (candleData_Main == null) continue; - - totalImperseMACDData[market + strInterval].Add(candleData_Main.Argument, impulseMacdConditionSetup.AddDataPoint(candleData_Main.High, candleData_Main.Low, candleData_Main.Close, true)); - + candleDatas_Temp_List.Add(candleData_Main); ichimokuConditionSetup.calIchimokuData(candleDatas_Temp_List, candleData_Main); @@ -298,163 +298,156 @@ namespace BitgetAPI.IndicatorConditionSetup else { if(nowTime.Minute > 0 && nowTime.Hour == 24) 전저고점Flag = true; - } - var keys = totalImperseMACDData[market + strInterval].Keys.OrderBy(t => t).ToList(); - - - if (keys.Count > 500) - { - for (var i = 0; i < 250; i++) - totalImperseMACDData[market + strInterval].Remove(keys[i]); - } + } if (!BuyShortStep.ContainsKey(market)) { BuyShortStep[market] = 0; BuyLongStep[market] = 0; } - - if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m"))) + if (!(전저고점.ContainsKey(market + "30m"))) continue; + //if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m"))) + // continue; + #region 1분봉 처리 // 시간별로 정렬하기 (임시 리스트) - var candleDatas = findedMarket.candleDataList[MCandleTimeType.M1]; - var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); + //var candleDatas = findedMarket.candleDataList[MCandleTimeType.M1]; + //var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); - var calMacdCandleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); + //var calMacdCandleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); - var candleData = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); + //var candleData = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); - if (candleData == null) continue; + //if (candleData == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData); + //ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData); - candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); - var candleData_전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); + //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_전봉); + //if (candleData_전봉 == null) continue; + //ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전봉); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전봉); - candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); - var candleData_전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); + //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_전전봉); + //if (candleData_전전봉 == null) continue; + //ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전전봉); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전봉); - candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); - var candleData_전전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); + //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_전전전봉); + //if (candleData_전전전봉 == null) continue; + //ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전전전봉); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전전봉); - candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); - var candleData_전전전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); + //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_전전전전봉); + //if (candleData_전전전전봉 == null) continue; + //ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전전전전봉); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전전전봉); #endregion #region 5분봉 처리 // 시간별로 정렬하기 (임시 리스트) - var candleDatas_5 = findedMarket.candleDataList[MCandleTimeType.M5]; - var candleDatas_5_정렬 = candleDatas_5.OrderBy(i => i.Argument).ToList(); + //var candleDatas_5 = findedMarket.candleDataList[MCandleTimeType.M5]; + //var candleDatas_5_정렬 = candleDatas_5.OrderBy(i => i.Argument).ToList(); - var candleData_5 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); + //var candleData_5 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_5 == null) continue; + //if (candleData_5 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5); + //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5); - candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); - var candleData_5_전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); + //candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); + //var candleData_5_전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_5_전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전봉); + //if (candleData_5_전봉 == null) continue; + //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전봉); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전봉); - candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); - var candleData_5_전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); + //candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); + //var candleData_5_전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_5_전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전봉); + //if (candleData_5_전전봉 == null) continue; + //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전봉); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전봉); - candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); - var candleData_5_전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); + //candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); + //var candleData_5_전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_5_전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전봉); + //if (candleData_5_전전전봉 == null) continue; + //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전봉); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전봉); - candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); - var candleData_5_전전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); + //candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1); + //var candleData_5_전전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument); - if (candleData_5_전전전전봉 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전전봉); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전전봉); + //if (candleData_5_전전전전봉 == null) continue; + //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전전봉); + //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전전봉); #endregion #region 30분봉 처리 // 시간별로 정렬하기 (임시 리스트) var candleDatas_30 = findedMarket.candleDataList[MCandleTimeType.M30]; var candleDatas_30_정렬 = candleDatas_30.OrderBy(i => i.Argument).ToList(); - + var candleDatas_30_TempList = candleDatas_30.OrderBy(i => i.Argument).ToList(); var candleData_30 = candleDatas_30.Find(i => i.Argument == candleDatas_30_정렬.Last().Argument); if (candleData_30 == null) continue; - ichimokuConditionSetup.calIchimokuData(candleDatas_30_정렬, candleData_30); movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30); - var macdData_30 = new ImpulseMacdData(); + //var macdData_30 = new ImpulseMacdData(); - var imperseMacd_keys_30 = totalImperseMACDData[market + "30m"].Keys.OrderBy(t => t).ToList(); + //var imperseMacd_keys_30 = totalImperseMACDData[market + "30m"].Keys.OrderBy(t => t).ToList(); - if (imperseMacd_keys_30.LastOrDefault() < candleData_30.Argument) - { - macdData_30 = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, true); - totalImperseMACDData[market + "30m"].Add(candleData_30.Argument, macdData_30); - } - else - { - macdData_30 = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, false); - totalImperseMACDData[market + "30m"][candleData_30.Argument] = macdData_30; - } + //if (imperseMacd_keys_30.LastOrDefault() < candleData_30.Argument) + //{ + // macdData_30 = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, true); + // totalImperseMACDData[market + "30m"].Add(candleData_30.Argument, macdData_30); + //} + //else + //{ + // macdData_30 = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, false); + // totalImperseMACDData[market + "30m"][candleData_30.Argument] = macdData_30; + //} - if (candleData_30.impulseMacdDataList == null) candleData_30.impulseMacdDataList = new Dictionary(); - if (candleData_30.impulseMacdDataList.ContainsKey(30)) candleData_30.impulseMacdDataList[30] = new ImpulseMacdData(); + //if (candleData_30.impulseMacdDataList == null) candleData_30.impulseMacdDataList = new Dictionary(); + //if (candleData_30.impulseMacdDataList.ContainsKey(30)) candleData_30.impulseMacdDataList[30] = new ImpulseMacdData(); - candleData_30.impulseMacdDataList[30] = macdData_30; - var macdData_5 = new ImpulseMacdData(); + //candleData_30.impulseMacdDataList[30] = macdData_30; + //var macdData_5 = new ImpulseMacdData(); - var imperseMacd_keys_5 = totalImperseMACDData[market + "5m"].Keys.OrderBy(t => t).ToList(); + //var imperseMacd_keys_5 = totalImperseMACDData[market + "5m"].Keys.OrderBy(t => t).ToList(); - if (imperseMacd_keys_5.LastOrDefault() < candleData_5.Argument) - { - macdData_5 = impulseMacdConditionSetup.AddDataPoint(candleData_5.High, candleData_5.Low, candleData_5.Close, true); - totalImperseMACDData[market + "5m"].Add(candleData_5.Argument, macdData_5); - } - else - { - macdData_5 = impulseMacdConditionSetup.AddDataPoint(candleData_5.High, candleData_5.Low, candleData_5.Close, false); - totalImperseMACDData[market + "5m"][candleData_5.Argument] = macdData_5; - } + //if (imperseMacd_keys_5.LastOrDefault() < candleData_5.Argument) + //{ + // macdData_5 = impulseMacdConditionSetup.AddDataPoint(candleData_5.High, candleData_5.Low, candleData_5.Close, true); + // totalImperseMACDData[market + "5m"].Add(candleData_5.Argument, macdData_5); + //} + //else + //{ + // macdData_5 = impulseMacdConditionSetup.AddDataPoint(candleData_5.High, candleData_5.Low, candleData_5.Close, false); + // totalImperseMACDData[market + "5m"][candleData_5.Argument] = macdData_5; + //} - if (candleData_5.impulseMacdDataList == null) candleData_5.impulseMacdDataList = new Dictionary(); - if (candleData_5.impulseMacdDataList.ContainsKey(5)) candleData_5.impulseMacdDataList[5] = new ImpulseMacdData(); - candleData_30.impulseMacdDataList[5] = macdData_5; + //if (candleData_5.impulseMacdDataList == null) candleData_5.impulseMacdDataList = new Dictionary(); + //if (candleData_5.impulseMacdDataList.ContainsKey(5)) candleData_5.impulseMacdDataList[5] = new ImpulseMacdData(); + //candleData_30.impulseMacdDataList[5] = macdData_5; candleDatas_30_정렬.RemoveAt(candleDatas_30_정렬.Count - 1); var candleData_30_전봉 = candleDatas_30.Find(i => i.Argument == candleDatas_30_정렬.Last().Argument); @@ -486,71 +479,71 @@ namespace BitgetAPI.IndicatorConditionSetup movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30_전전전전봉); #endregion - if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선 - && candleData.Close > candleData.IchimokData.상한선) - { - var indicatorPrice = candleData.Open; - var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; + //if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선 + // && candleData.Close > candleData.IchimokData.상한선) + //{ + // var indicatorPrice = candleData.Open; + // var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; - var description = string.Format("{0} 구름떼 상승", strInterval); - var signalData = signals_LU.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); + // var description = string.Format("{0} 구름떼 상승", strInterval); + // var signalData = signals_LU.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); - // 없으면 생성 - if (signalData == null) - { - var price = candleData.Close; - var rate = (candleData.Close / candleData.Open) * 100 - 100; + // // 없으면 생성 + // if (signalData == null) + // { + // var price = candleData.Close; + // var rate = (candleData.Close / candleData.Open) * 100 - 100; - 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; + // 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_LU.Add(signalInfoData); - } + // signals_LU.Add(signalInfoData); + // } - } - else if (checked구름떼상향돌파 && candleData_전봉.Open > candleData_전봉.IchimokData.하한선 && candleData.Open < candleData.IchimokData.하한선 && candleData.High < candleData.IchimokData.하한선 - && candleData.Close < candleData.IchimokData.하한선) - { + //} + //else if (checked구름떼상향돌파 && candleData_전봉.Open > candleData_전봉.IchimokData.하한선 && candleData.Open < candleData.IchimokData.하한선 && candleData.High < candleData.IchimokData.하한선 + // && candleData.Close < candleData.IchimokData.하한선) + //{ - var indicatorPrice = candleData.Open; - var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; + // var indicatorPrice = candleData.Open; + // var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; - var description = string.Format("{0} 구름떼 하락", strInterval); - var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); + // var description = string.Format("{0} 구름떼 하락", strInterval); + // var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); - // 없으면 생성 - if (signalData == null) - { - var price = candleData.Close; - var rate = (candleData.Close / candleData.Open) * 100 - 100; + // // 없으면 생성 + // if (signalData == null) + // { + // var price = candleData.Close; + // var rate = (candleData.Close / candleData.Open) * 100 - 100; - 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; + // 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); - } - } + // signals_SD.Add(signalInfoData); + // } + //} if (영호조건식_상향돌파 || 영호조건식_하향돌파) { #region Main 봉 계산 - + /* var 전전전봉3 = candleData_전전전봉.movingAverageDataList[3].Value; var 전전전봉4 = candleData_전전전봉.movingAverageDataList[4].Value; var 전전전봉8 = candleData_전전전봉.movingAverageDataList[8].Value; @@ -642,22 +635,23 @@ namespace BitgetAPI.IndicatorConditionSetup var Bol12_Up = candleData.movingAverageDataList[12].BolangerValue_Up; var Bol24_Up = candleData.movingAverageDataList[24].BolangerValue_Up; var Bol72_Up = candleData.movingAverageDataList[72].BolangerValue_Up; + */ #endregion - 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 현재봉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 현재봉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 현재봉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 현재봉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 현재봉4_30 = candleData_30.movingAverageDataList[4].Value; var 전봉4_30 = candleData_30_전봉.movingAverageDataList[4].Value; @@ -665,33 +659,37 @@ namespace BitgetAPI.IndicatorConditionSetup var 전전전봉4_30 = candleData_30_전전전봉.movingAverageDataList[4].Value; var 현재봉72_30 = candleData_30.movingAverageDataList[72].Value; - var 현재봉72_5 = candleData_5.movingAverageDataList[72].Value; + //var 현재봉72_5 = candleData_5.movingAverageDataList[72].Value; - var 저고점_1 = 전저고점[market + "1m"]; - var 저고점_5 = 전저고점[market + "5m"]; + //var 저고점_1 = 전저고점[market + "1m"]; + //var 저고점_5 = 전저고점[market + "5m"]; var 저고점_30 = 전저고점[market + "30m"]; - 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); + //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; + var returnVal = Calculate전고점(market, "30m", MCandleTimeType.M30, 전봉4_30, 전전봉4_30, 전전전봉4_30, candleData_30); if (!returnVal) continue; - var 전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 2]]; - var 전전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 3]]; - var 전전전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 4]]; + //var 전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 2]]; + //var 전전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 3]]; + //var 전전전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 4]]; - var 전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 2]]; - var 전전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 3]]; - var 전전전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 4]]; + //var 전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 2]]; + //var 전전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 3]]; + //var 전전전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 4]]; + + //신규 데이터 Setup + tradingViewConditionSetup.SetData(candleDatas_30_TempList.Select(t => t.High).ToList(), + candleDatas_30_TempList.Select(t => t.Low).ToList(), candleDatas_30_TempList.Select(t => t.Close).ToList()); 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 price = candleData_30.Close; + var rate = (candleData_30.Close / candleData_30.Open) * 100 - 100; + var indicatorPrice = candleData_30.Open; + var indicatorRate = (candleData_30.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)); @@ -706,8 +704,21 @@ namespace BitgetAPI.IndicatorConditionSetup var buyFlag = false; - // 30분봉 - var flag_30 = ((저고점_30["Type"] == 0 && + if (!BuyLongStep.ContainsKey(market)) + BuyLongStep[market] = 0; + + if (BuyLongStep[market] == 0) + { + if (tradingViewConditionSetup.IsLongSignal()) + { + BuyLongStep[market] = 1; + BuyLongStepStampData[market] = 저고점_30["tempLowVal"]; + } + } + + if(BuyLongStep[market] == 1 && BuyLongStepStampData[market] < 저고점_30["tempLowVal"]) + { + buyFlag = ((저고점_30["Type"] == 0 && 저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] < 저고점_30["전저가"] && candleData_30_전봉.Close < 저고점_30["전고가"] && candleData_30.Close > 저고점_30["전고가"]) || (저고점_30["Type"] == 1 && 저고점_30["전저가"] > 저고점_30["전전저가"] && 저고점_30["전저가"] < 전봉4_30 && candleData_30_전봉.Close < 저고점_30["전고가"] && candleData_30.Close > 저고점_30["전고가"] && 전봉4_30 < 현재봉4_30 && 전봉4_30 < 전전봉4_30) @@ -715,145 +726,15 @@ namespace BitgetAPI.IndicatorConditionSetup 저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] > 저고점_30["전저가"] && candleData_30_전봉.Close < 저고점_30["전고가"] && candleData_30.Close > 저고점_30["전고가"])) && 전봉4_30 < 현재봉4_30 && candleData_30.Open < candleData_30.Close; - if(현재봉4_30 > 현재봉72_30) - { - if(저고점_30["전전고가"] > 저고점_30["전고가"]) + + //초기화 처리 필요 + if (저고점_30["전고가"] < 저고점_30["전전고가"] || + 저고점_30["전저가"] < 저고점_30["전전저가"]) { - flag_30 = false; + BuyLongStep[market] = 0; + buyFlag = false; } - } - - var flag_5 = ((저고점_5["Type"] == 0 && - 저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] < 저고점_5["전저가"] && candleData_5_전봉.Close < 저고점_5["전고가"] && candleData_5.Close > 저고점_5["전고가"]) - || (저고점_5["Type"] == 1 && - 저고점_5["전저가"] > 저고점_5["전전저가"] && 저고점_5["전저가"] < 전봉4_5 && candleData_5_전봉.Close < 저고점_5["전고가"] && candleData_5.Close > 저고점_5["전고가"] && 전봉4_5 < 현재봉4_5 && 전봉4_5 < 전전봉4_5) - || (저고점_5["Type"] == 0 && - 저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] > 저고점_5["전저가"] && candleData_5_전봉.Close < 저고점_5["전고가"] && candleData_5.Close > 저고점_5["전고가"])) - && 전봉4_5 < 현재봉4_5 && candleData_5.Open < candleData_5.Close; - - if (현재봉4_5 > 현재봉72_5) - { - if (저고점_5["전전고가"] > 저고점_5["전고가"]) - { - flag_5 = false; - } - } - - var flag_1 = ((저고점_1["Type"] == 0 && - 저고점_1["전전전저가"] > 저고점_1["전전저가"] && 저고점_1["전전저가"] < 저고점_1["전저가"] && candleData_전봉.Close < 저고점_1["전고가"] && candleData.Close > 저고점_1["전고가"]) - || (저고점_1["Type"] == 1 && - 저고점_1["전저가"] > 저고점_1["전전저가"] && 저고점_1["전저가"] < 전봉4 && candleData_전봉.Close < 저고점_1["전고가"] && candleData.Close > 저고점_1["전고가"] && 전봉4 < 현재봉4 && 전봉4 < 전전봉4) - || (저고점_1["Type"] == 0 && - 저고점_1["전전전저가"] > 저고점_1["전전저가"] && 저고점_1["전전저가"] > 저고점_1["전저가"] && candleData_전봉.Close < 저고점_1["전고가"] && candleData.Close > 저고점_1["전고가"])) - && 전봉4 < 현재봉4 && candleData.Open < candleData.Close; - - - var flag_1_72compare = 현재봉4 > 현재봉72 && 전봉4 > 전봉72; - - //추가 - - // - - //var macdFlag = false; - - //if ((전전봉macdData_5.SH <= 0 && 전봉macdData_5.SH > 0 && macdData_5.MD < -30 && macdData_5.MD > 전봉macdData_5.MD) - // || (전전전봉macdData_5.MD == 0 && 전전봉macdData_5.MD == 0 && macdData_5.MD > 0 && macdData_5.SH > 전봉macdData_5.SH)) - //{ - // macdFlag = true; - //} - - //&& flag_5 - //if (macdFlag && flag_1) - //{ - // buyFlag = true; - //} - - if (!BuyLongStep.ContainsKey(market)) - BuyLongStep[market] = 0; - - - if(BuyLongStep[market] == 0) - { - if (//(전전봉macdData_30.SH < 0 && 전봉macdData_30.SH > 0 && 전봉macdData_30.MD > 전전봉macdData_30.MD && macdData_30.MD > 전봉macdData_30.MD) || //&& 전봉macdData_30.MD < 0 - (전전전봉macdData_30.MD == 0 && 전전봉macdData_30.MD == 0 && 전봉macdData_30.MD > 0 && 전봉macdData_30.SH > 전전봉macdData_30.SH)) - { - BuyLongStep[market] = 1; - BuyLongStepStampData[market] = 저고점_30["tempLowVal"]; - } - - if(flag_30 && flag_5 && flag_1_72compare && flag_1 && 전봉macdData_30.SH > 0) - { - if (BuyLongStep[market] == 1) - buyFlag = true; - - BuyLongStep[market] = 2; - BuyLongStepStampData[market] = 저고점_30["tempLowVal"]; - } - } - - if(BuyLongStep[market] == 1) - { - if (flag_30 && flag_5 && flag_1_72compare && flag_1 && 전봉macdData_30.SH > 0) - buyFlag = true; - } - - if (BuyLongStep[market] == 2) - { - if ((전전봉macdData_30.SH < 0 && 전봉macdData_30.SH > 0 && macdData_30.MD > 전봉macdData_30.MD) || - (전전전봉macdData_30.MD == 0 && 전전봉macdData_30.MD == 0 && 전봉macdData_30.MD > 0 && 전봉macdData_30.SH > 전전봉macdData_30.SH)) - { - buyFlag = true; - } - } - - - if (저고점_30["tempLowVal"] != BuyLongStepStampData[market] && - (저고점_30["전저가"] > 전봉4_30 || - 저고점_30["전전저가"] > 저고점_30["전저가"] || - 저고점_30["전고가"] < 저고점_30["전전고가"] || - 전봉macdData_30.SH < 0)) - { - BuyLongStep[market] = 0; - buyFlag = false; - } - - - //if ((전전봉macdData_5.SH < 0 && 전봉macdData_5.SH > 0 && 전봉macdData_5.MD < 0 && 전봉macdData_5.MD > 전전봉macdData_5.MD) - // || (전전전봉macdData_5.MD == 0 && 전전봉macdData_5.MD == 0 && 전봉macdData_5.MD > 0 && 전봉macdData_5.SH > 전전봉macdData_5.SH)) - //{ - // BuyLongStep[market] = 1; - // BuyLongStepStampData[market] = 저고점_5["tempLowVal"]; - //} - - //if (BuyLongStep[market] == 1) - //{ - // if(flag_5) - // { - // BuyLongStep[market] = 2; - // } - // else - // { - // BuyLongStep[market] = 3; - // } - //} - - //if (BuyLongStep[market] == 2) - //{ - // buyFlag = true; - //} - //else if (BuyLongStep[market] == 3) - //{ - // if (flag_5) - // { - // buyFlag = true; - // } - - // if(저고점_5["tempLowVal"] != BuyLongStepStampData[market] && 저고점_5["전전저가"] > 저고점_5["전저가"]) - // { - // BuyLongStep[market] = 0; - // buyFlag = false; - // } - //} + } if (buyFlag) { @@ -881,8 +762,8 @@ namespace BitgetAPI.IndicatorConditionSetup { "Price", price }, { "Flag", 저고점_30["전고가"] > 저고점_30["전전고가"]}, { "MCandleTimeType", (int)interval }, - { "CandleTime", candleData.Argument }, - { "Candle", candleData } + { "CandleTime", candleData_30.Argument }, + { "Candle", candleData_30 } }; UpBuyList.Add(market, buyDic); @@ -910,7 +791,7 @@ namespace BitgetAPI.IndicatorConditionSetup { "BuyDate", nowTime }, { "Price", price }, { "MCandleTimeType", (int)interval }, - { "Candle", candleData }, + { "Candle", candleData_30 }, { "Size", size }, { "orderId", orderDic["orderId"] } }; @@ -942,26 +823,14 @@ namespace BitgetAPI.IndicatorConditionSetup } var sellFlag = false; - if (저고점_30["전저가"] > 전봉4_30) - sellFlag = true; - - if (전봉macdData_30.SH < 0) + + if(tradingViewConditionSetup.IsSmaMiddle(4, 12, true) || + 저고점_30["전고가"] < 저고점_30["전전고가"] || + 저고점_30["전저가"] > candleData_30_전봉.Close) + { sellFlag = true; - - if (flag) - { - if (저고점_30["전고가"] < 저고점_30["전전고가"]) - { - sellFlag = true; - } - } - else - { - if (저고점_30["전고가"] > 저고점_30["전전고가"]) - { - buyItem["Flag"] = true; - } } + if (sellFlag) { @@ -978,7 +847,7 @@ namespace BitgetAPI.IndicatorConditionSetup { "BuyCandle", buyItem["Candle"] }, { "SellDate", nowTime}, { "SellPrice", price }, - { "SellCandle", candleData }, + { "SellCandle", candleData_30 }, { "Rate", resultRate } }; @@ -1019,7 +888,7 @@ namespace BitgetAPI.IndicatorConditionSetup { "BuyCandle", buyItem["Candle"] }, { "SellDate", nowTime}, { "SellPrice", price}, - { "SellCandle", candleData }, + { "SellCandle", candleData_30 }, { "Rate", resultRateData } }; ResultList.Add(orderResult); @@ -1039,10 +908,10 @@ namespace BitgetAPI.IndicatorConditionSetup } 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 price = candleData_30.Close; + var rate = (candleData_30.Close / candleData_30.Open) * 100 - 100; + var indicatorPrice = candleData_30.Open; + var indicatorRate = (candleData_30.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)); @@ -1055,147 +924,37 @@ namespace BitgetAPI.IndicatorConditionSetup var buyFlag = false; - var flag_30 = ((저고점_30["Type"] == 1 && - 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && candleData_30.Close < 저고점_30["전저가"] && candleData_30_전봉.Close > 저고점_30["전저가"]) - || (저고점_30["Type"] == 0 && - 저고점_30["전고가"] < 저고점_30["전전고가"] && 저고점_30["전고가"] > 전봉4_30 && candleData_30_전봉.Close > 저고점_30["전저가"] && candleData_30.Close < 저고점_30["전저가"] && 전봉4_30 > 현재봉4_30 && 전봉4_30 > 전전봉4_30) - || (저고점_30["Type"] == 1 && - 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && candleData_30_전봉.Close > 저고점_30["전저가"] && candleData_30.Close < 저고점_30["전저가"])) && 전봉4_30 > 현재봉4_30 && candleData_30.Open > candleData_30.Close; - - if (현재봉4_30 < 현재봉72_30) - { - if (저고점_30["전전저가"] < 저고점_30["전저가"]) - { - flag_30 = false; - } - } - - var flag_5 = ((저고점_5["Type"] == 1 && - 저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] > 저고점_5["전고가"] && candleData_5.Close < 저고점_5["전저가"] && candleData_5_전봉.Close > 저고점_5["전저가"]) - || (저고점_5["Type"] == 0 && - 저고점_5["전고가"] < 저고점_5["전전고가"] && 저고점_5["전고가"] > 전봉4_5 && candleData_5.Close < 저고점_5["전저가"] && candleData_5_전봉.Close > 저고점_5["전저가"] && 전봉4_5 > 현재봉4_5 && 전봉4_5 > 전전봉4_5) - || (저고점_5["Type"] == 1 && - 저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] < 저고점_5["전고가"] && candleData_5.Close < 저고점_5["전저가"] && candleData_5_전봉.Close > 저고점_5["전저가"])) - && 전봉4_5 > 현재봉4_5 && candleData_5.Open > candleData_5.Close; - - if (현재봉4_5 < 현재봉72_5) - { - if (저고점_5["전전저가"] < 저고점_5["전저가"]) - { - flag_5 = false; - } - } - - var flag_1 = ((저고점_1["Type"] == 1 && - 저고점_1["전전전고가"] < 저고점_1["전전고가"] && 저고점_1["전전고가"] > 저고점_1["전고가"] && candleData.Close < 저고점_1["전저가"] && candleData_전봉.Close > 저고점_1["전저가"]) - || (저고점_1["Type"] == 0 && - 저고점_1["전고가"] < 저고점_1["전전고가"] && 저고점_1["전고가"] > 전봉4 && candleData.Close < 저고점_1["전저가"] && candleData_전봉.Close > 저고점_1["전저가"] && 전봉4 > 현재봉4 && 전봉4 > 전전봉4) - || (저고점_1["Type"] == 1 && - 저고점_1["전전전고가"] < 저고점_1["전전고가"] && 저고점_1["전전고가"] < 저고점_1["전고가"] && candleData.Close < 저고점_1["전저가"] && candleData_전봉.Close > 저고점_1["전저가"])) - && 전봉4 > 현재봉4 && candleData.Open > candleData.Close; - - var flag_1_72compare = 현재봉4 < 현재봉72 && 전봉4 < 전봉72; - - //var macdFlag = false; - - //if ((전전봉macdData_5.SH >= 0 && 전봉macdData_5.SH < 0 && macdData_5.MD > 5 && macdData_5.MD < 전봉macdData_5.MD) - // || (전전전봉macdData_5.MD == 0 && 전전봉macdData_5.MD == 0 && macdData_5.MD > 0 && macdData_5.SH < 전봉macdData_5.SH)) - //{ - // macdFlag = true; - //} - //&& flag_5 && flag_1 - - //if (flag_1 && macdFlag) - //{ - // buyFlag = true; - //} - if (!BuyShortStep.ContainsKey(market)) BuyShortStep[market] = 0; - if (BuyShortStep[market] == 0) { - if (//(전전봉macdData_30.SH > 0 && 전봉macdData_30.SH < 0 && 전봉macdData_30.MD < 전전봉macdData_30.MD && macdData_30.MD < 전봉macdData_30.MD) ||// 전봉macdData_30.MD > 0 && ) - (전전전봉macdData_30.MD == 0 && 전전봉macdData_30.MD == 0 && 전봉macdData_30.MD < 0 && 전봉macdData_30.SH < 전전봉macdData_30.SH)) + if (tradingViewConditionSetup.IsShortSignal()) { BuyShortStep[market] = 1; BuyShortStepStampData[market] = 저고점_30["tempHighVal"]; } + } - if (flag_30 && flag_5 && flag_1_72compare && flag_1 && 전봉macdData_30.SH < 0) + if (BuyShortStep[market] == 1 && BuyShortStepStampData[market] < 저고점_30["tempHighVal"]) + { + buyFlag = ((저고점_30["Type"] == 1 && + 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && candleData_30.Close < 저고점_30["전저가"] && candleData_30_전봉.Close > 저고점_30["전저가"]) + || (저고점_30["Type"] == 0 && + 저고점_30["전고가"] < 저고점_30["전전고가"] && 저고점_30["전고가"] > 전봉4_30 && candleData_30_전봉.Close > 저고점_30["전저가"] && candleData_30.Close < 저고점_30["전저가"] && 전봉4_30 > 현재봉4_30 && 전봉4_30 > 전전봉4_30) + || (저고점_30["Type"] == 1 && + 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && candleData_30_전봉.Close > 저고점_30["전저가"] && candleData_30.Close < 저고점_30["전저가"])) + && 전봉4_30 > 현재봉4_30 && candleData_30.Open > candleData_30.Close; + + //초기화 처리 필요 + if (저고점_30["전고가"] > 저고점_30["전전고가"] || + 저고점_30["전저가"] > 저고점_30["전전저가"]) { - if (BuyShortStep[market] == 1) - buyFlag = true; - - BuyShortStep[market] = 2; - BuyShortStepStampData[market] = 저고점_30["tempHighVal"]; + BuyShortStep[market] = 0; + buyFlag = false; } } - if (BuyShortStep[market] == 1) - { - if (flag_30 && flag_5 && flag_1_72compare && flag_1 && 전봉macdData_30.SH < 0) - buyFlag = true; - } - - - if (BuyShortStep[market] == 2) - { - if (//(전전봉macdData_30.SH > 0 && 전봉macdData_30.SH < 0 && 전봉macdData_30.MD < 전전봉macdData_30.MD && macdData_30.MD < 전봉macdData_30.MD) || // 전봉macdData_30.MD > 0 && ) - (전전전봉macdData_30.MD == 0 && 전전봉macdData_30.MD == 0 && 전봉macdData_30.MD < 0 && 전봉macdData_30.SH < 전전봉macdData_30.SH)) - { - buyFlag = true; - } - } - - if (저고점_30["tempHighVal"] != BuyShortStepStampData[market] && - (저고점_30["전전고가"] < 저고점_30["전고가"] || - 저고점_30["전저가"] > 저고점_30["전전저가"] || - 저고점_30["전고가"] < 전봉4_30 || - 전봉macdData_30.SH > 0)) - { - BuyShortStep[market] = 0; - buyFlag = false; - } - - - //if ((전전봉macdData_5.SH > 0 && 전봉macdData_5.SH < 0 && 전봉macdData_5.MD > 0 && 전봉macdData_5.MD < 전전봉macdData_5.MD) - //|| (전전전봉macdData_5.MD == 0 && 전전봉macdData_5.MD == 0 && 전봉macdData_5.MD < 0 && 전봉macdData_5.SH < 전전봉macdData_5.SH)) - //{ - // BuyShortStep[market] = 1; - // BuyShortStepStampData[market] = 저고점_5["tempHighVal"]; - //} - - //if (BuyShortStep[market] == 1) - //{ - // if (flag_5) - // { - // BuyShortStep[market] = 2; - // } - // else - // { - // BuyShortStep[market] = 3; - // } - //} - - //if (BuyShortStep[market] == 2) - //{ - // buyFlag = true; - //} - //else if (BuyShortStep[market] == 3) - //{ - // if (flag_5) - // { - // buyFlag = true; - // } - // if (저고점_5["tempHighVal"] != BuyShortStepStampData[market] && 저고점_5["전전고가"] < 저고점_5["전고가"]) - // { - // BuyShortStep[market] = 0; - // buyFlag = false; - // } - //} - if (buyFlag) { BuyShortStep[market] = 0; @@ -1221,8 +980,8 @@ namespace BitgetAPI.IndicatorConditionSetup { "Price", price }, { "Flag", 저고점_30["전저가"] < 저고점_30["전전저가"]}, { "MCandleTimeType", (int)interval }, - { "CandleTime", candleData.Argument }, - { "Candle", candleData } + { "CandleTime", candleData_30.Argument }, + { "Candle", candleData_30 } }; DownBuyList.Add(market, buyDic); @@ -1250,7 +1009,7 @@ namespace BitgetAPI.IndicatorConditionSetup { "BuyDate", nowTime }, { "Price", price }, { "MCandleTimeType", (int)interval }, - { "Candle", candleData }, + { "Candle", candleData_30 }, { "Size", size }, { "orderId", orderDic["orderId"] } }; @@ -1282,25 +1041,11 @@ namespace BitgetAPI.IndicatorConditionSetup } var sellFlag = false; - if (저고점_30["전고가"] < 전봉4_30) - sellFlag = true; - - if (전봉macdData_30.SH > 0) - sellFlag = true; - - if (flag) + if (tradingViewConditionSetup.IsSmaMiddle(4, 12, false) || + 저고점_30["전저가"] > 저고점_30["전전저가"] || + 저고점_30["전고가"] < candleData_30_전봉.Close) { - if (저고점_30["전저가"] > 저고점_30["전전저가"]) - { - sellFlag = true; - } - } - else - { - if (저고점_30["전저가"] < 저고점_30["전전저가"]) - { - buyItem["Flag"] = true; - } + sellFlag = true; } if (sellFlag) @@ -1319,7 +1064,7 @@ namespace BitgetAPI.IndicatorConditionSetup { "BuyCandle", buyItem["Candle"] }, { "SellDate", nowTime}, { "SellPrice", price }, - { "SellCandle", candleData }, + { "SellCandle", candleData_30 }, { "Rate", resultRate } }; @@ -1361,7 +1106,7 @@ namespace BitgetAPI.IndicatorConditionSetup { "BuyCandle", buyItem["Candle"] }, { "SellDate", nowTime}, { "SellPrice", price }, - { "SellCandle", candleData }, + { "SellCandle", candleData_30 }, { "Rate", resultRateData } }; ResultList.Add(orderResult); @@ -1711,2861 +1456,3 @@ 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 (영호조건식_상향돌파 || 영호조건식_하향돌파) - { - 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 diff --git a/BitgetApi/IndicatorConditionSetup/TradingViewConditionSetup.cs b/BitgetApi/IndicatorConditionSetup/TradingViewConditionSetup.cs new file mode 100644 index 0000000..a91def1 --- /dev/null +++ b/BitgetApi/IndicatorConditionSetup/TradingViewConditionSetup.cs @@ -0,0 +1,258 @@ +using DevExpress.XtraEditors.TextEditController.InputHandler; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip; + +namespace BitgetApi.IndicatorConditionSetup +{ + public class TradingViewConditionSetup + { + + // 기본 파라미터 + public int LengthMA = 34; + public int LengthSignal = 12; + public int AdxLength = 12; + public double AdxThreshold = 24; + public double RangeThreshold = 2.2; + public double RangeThresholdSell = 2.2; + + // 데이터 입력: High, Low, Close 배열 (최근 것이 맨 끝) + public List High; + public List Low; + public List Close; + + // SMA4 계산용 + private double[] Sma4; + + public void SetData(List high, List low, List close) + { + High = high; + Low = low; + Close = close; + Sma4 = ComputeSma4(); + } + + // 1. SMMA 계산 + private double CalcSmma(List src, int len) + { + double smma = src.Take(len).Average(); + for (int i = len; i < src.Count; i++) + { + smma = (smma * (len - 1) + src[i]) / len; + } + return smma; + } + + // 2. ZLEMA 계산 + private double CalcZlema(List src, int length) + { + double ema1 = Ema(src, length); + double ema2 = Ema(Enumerable.Repeat(ema1, src.Count).ToList(), length); + double d = ema1 - ema2; + return ema1 + d; + } + + // 3. EMA 계산 + private double Ema(List src, int length) + { + double alpha = 2.0 / (length + 1); + double ema = src[0]; + for (int i = 1; i < src.Count; i++) + { + ema = alpha * src[i] + (1 - alpha) * ema; + } + return ema; + } + + // 4. SMA(4) 계산 + private double[] ComputeSma4() + { + double[] sma4 = new double[Close.Count]; + for (int i = 3; i < Close.Count; i++) + { + sma4[i] = (Close[i] + Close[i - 1] + Close[i - 2] + Close[i - 3]) / 4.0; + } + return sma4; + } + + // 5. ADX (가장 간단한 형태) + private double ComputeAdx() + { + // 간단화: 실제 구현 시 true range, directional movement 등 추가 필요 + return 25.0; // 더미값 또는 타 라이브러리 사용 가능 + } + + // 6. Impulse MACD 계산 + public double ComputeMd(bool flag = true) + { + if (flag) + { + double hi = CalcSmma(High, LengthMA); + double lo = CalcSmma(Low, LengthMA); + var hlc3 = High.Zip(Low, (h, l) => (h + l + Close.Last()) / 3).ToList(); + double mi = CalcZlema(hlc3, LengthMA); + if (mi > hi) return mi - hi; + else if (mi < lo) return mi - lo; + return 0; + } + else + { + var highTemp = new List(); + foreach(var item in High) + highTemp.Add(item); + var lowTemp = new List(); + foreach (var item in Low) + lowTemp.Add(item); + var closeTemp = new List(); + foreach (var item in Close) + closeTemp.Add(item); + + highTemp.RemoveAt(highTemp.Count - 1); + lowTemp.RemoveAt(lowTemp.Count - 1); + closeTemp.RemoveAt(closeTemp.Count - 1); + + double hi = CalcSmma(highTemp, LengthMA); + double lo = CalcSmma(lowTemp, LengthMA); + var hlc3 = highTemp.Zip(lowTemp, (h, l) => (h + l + closeTemp.Last()) / 3).ToList(); + double mi = CalcZlema(hlc3, LengthMA); + if (mi > hi) return mi - hi; + else if (mi < lo) return mi - lo; + return 0; + } + + + } + + // 7. MACD, SignalLine 계산 + public (double macdLine, double signalLine) ComputeMacd() + { + double macdLine = Ema(Close, 34) - Ema(Close, 12); + double signalLine = Ema(Enumerable.Repeat(macdLine, Close.Count).ToList(), 12); + return (macdLine, signalLine); + } + + // 8. RangeBound 필터 + public bool IsRangeBound() + { + double highestHigh = High.Skip(High.Count - 12).Max(); + double lowestLow = Low.Skip(Low.Count - 12).Min(); + double range = highestHigh - lowestLow; + return range < (highestHigh * RangeThreshold / 100.0); + } + + public bool IsRangeBoundSell() + { + double highestHigh = High.Skip(High.Count - 12).Max(); + double lowestLow = Low.Skip(Low.Count - 12).Min(); + double range = highestHigh - lowestLow; + return range < (highestHigh * RangeThresholdSell / 100.0); + } + + // 9. 트렌드 여부 + public bool IsTrending() + { + return ComputeAdx() > AdxThreshold; + } + + // 10. 매수 조건 + public bool IsLongSignal() + { + double md = ComputeMd(); + double prevMd = ComputeMd(false); + var (macd, signal) = ComputeMacd(); + bool isUptrend = Close.Last() > Sma4.Last(); + + return isUptrend && + ((prevMd == 0 && md > 0) || (macd < 0 && macd > signal)) && + IsTrending() && !IsRangeBound(); + } + + // 11. 매도 조건 + public bool IsShortSignal() + { + double md = ComputeMd(); + double prevMd = ComputeMd(false); + var (macd, signal) = ComputeMacd(); + bool isDowntrend = Close.Last() < Sma4.Last(); + + return isDowntrend && + ((prevMd == 0 && md < 0) || (macd > 0 && macd < signal)) && + IsTrending() && !IsRangeBoundSell(); + } + + public bool IsSmaHigh(int range, int count) + { + var list = new List(); + for (int i = Close.Count - count - 1; i < count; i++) + { + var sum = 0.0; + for(int j = 0;j < range; j++) + { + sum += Close[i-j]; + } + var data = sum / range; + list.Add(data); + } + + if (list.Max() == list[list.Count - 1]) + return true; + else + return false; + } + + public bool IsSmaLow(int range, int count) + { + var list = new List(); + for (int i = Close.Count - count - 1; i < count; i++) + { + var sum = 0.0; + for (int j = 0; j < range; j++) + { + sum += Close[i - j]; + } + var data = sum / range; + list.Add(data); + } + + if (list.Min() == list[list.Count - 1]) + return true; + else + return false; + } + + public bool IsSmaMiddle(int range, int count, bool longFlag) { + var list = new List(); + for (int i = Close.Count - count - 1; i < count; i++) + { + var sum = 0.0; + for (int j = 0; j < range; j++) + { + sum += Close[i - j]; + } + var data = sum / range; + list.Add(data); + } + + if (longFlag) + { + if(list[list.Count - 1] > list.Average()) + { + return true; + } + } + else + { + if (list[list.Count - 1] < list.Average()) + { + return true; + } + } + return false; + } + } +} +