diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 561cb62..8fbd0fb 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -294,7 +294,7 @@ namespace BitgetAPI.IndicatorConditionSetup BuyLongStep[market] = false; } - if (!(전저고점.ContainsKey(market + "30m") && 전저고점.ContainsKey(market + "4H"))) continue; + if (!(전저고점.ContainsKey(market + "30m"))) continue; //if (!(전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "15m") && 전저고점.ContainsKey(market + "1H"))) // continue; @@ -387,7 +387,7 @@ namespace BitgetAPI.IndicatorConditionSetup #region 60분봉 처리 // 시간별로 정렬하기 (임시 리스트) - + /* var candleDatas_240 = findedMarket.candleDataList[MCandleTimeType.H4]; var candleDatas_240_정렬 = candleDatas_240.OrderBy(i => i.Argument).ToList(); @@ -426,7 +426,7 @@ namespace BitgetAPI.IndicatorConditionSetup if (candleData_240_전전전전봉 == null) continue; ichimokuConditionSetup.calIchimokuData(candleDatas_240_정렬, candleData_240_전전전전봉); movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_240_정렬, candleData_240_전전전전봉); - + */ #endregion if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선 @@ -613,7 +613,7 @@ namespace BitgetAPI.IndicatorConditionSetup var 전전봉5_1 = candleData_1_전전봉.movingAverageDataList[5].Value; var 전전전봉5_1 = candleData_1_전전전봉.movingAverageDataList[5].Value; */ - + /* var 현재봉2_240 = candleData_240.movingAverageDataList[2].Value; var 전봉2_240 = candleData_240_전봉.movingAverageDataList[2].Value; var 전전봉2_240 = candleData_240_전전봉.movingAverageDataList[2].Value; @@ -638,7 +638,7 @@ namespace BitgetAPI.IndicatorConditionSetup var 현재봉24_240 = candleData_240.movingAverageDataList[24].Value; var 전봉24_240 = candleData_240_전봉.movingAverageDataList[24].Value; - + */ var oneList = new List() { 현재봉24, 현재봉48, @@ -668,11 +668,7 @@ namespace BitgetAPI.IndicatorConditionSetup || (저고점_30["전저가"] < 저고점_30["전전저가"] && 저고점_30["전고가"] < 저고점_30["전전고가"]) || (저고점_30["전저가"] < 저고점_30["전전저가"] - && 저고점_30["전고가"] > 저고점_30["전전고가"])) - && 저고점_30["tempHighVal"] > 저고점_30["tempLowVal"] - && 저고점_30["tempLowVal"] > 저고점_30["tempHigh2Val"] - && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow2Val"] - && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh3Val"]) + && 저고점_30["전고가"] > 저고점_30["전전고가"]))) && candleData.IchimokData.상한선 > candleData.Close //&& candleData_240.Close < 현재봉24_240 //&& 현재봉24_240 < 전봉24_240 @@ -685,32 +681,36 @@ namespace BitgetAPI.IndicatorConditionSetup && 전봉3 < 저고점_30["전고가"]) || (저고점_30["전저가"] < 저고점_30["전전저가"] && 전봉3 > 저고점_30["전고가"])) - && 전전봉3 < 전봉3 && 전봉3 > 현재봉3 - && 저고점_30["tempHighVal"] < 저고점_30["tempLowVal"] - && 저고점_30["tempLowVal"] < 저고점_30["tempHigh2Val"] - && 저고점_30["tempHigh2Val"] < 저고점_30["tempLow2Val"] - && 저고점_30["tempLow2Val"] < 저고점_30["tempHigh3Val"]) + && 전전봉3 < 전봉3 && 전봉3 > 현재봉3) && candleData.IchimokData.상한선 > candleData.Close //&& candleData_240.Close < 현재봉24_240 //&& 현재봉24_240 < 전봉24_240 && 현재봉24 > 현재봉72; + var tempFlag1Long = (저고점_30["Type"] == 0 + && ((저고점_30["전저가"] > 저고점_30["전전저가"] + && 저고점_30["전전고가"] < 저고점_30["전고가"]) + || (저고점_30["전저가"] > 저고점_30["전전저가"] + && 저고점_30["전고가"] < 저고점_30["전전고가"]) + || (저고점_30["전저가"] > 저고점_30["전전저가"] + && 저고점_30["전고가"] < 저고점_30["전전고가"]))) + && candleData.IchimokData.하한선 < candleData.Close + //&& candleData_240.Close > 현재봉24_240 + //&& 현재봉24_240 > 전봉24_240; + && 현재봉24 < 현재봉72; - var tempFlag2Long = (저고점_30["Type"] == 0 - && ((저고점_30["전저가"] > 저고점_30["전전저가"] + var tempFlag2Long = (저고점_30["Type"] == 1 + && ((전봉3 > 저고점_30["전저가"] && 저고점_30["전전고가"] < 저고점_30["전고가"]) - || (저고점_30["전저가"] > 저고점_30["전전저가"] + || (전봉3 > 저고점_30["전저가"] && 저고점_30["전고가"] < 저고점_30["전전고가"]) - || (저고점_30["전저가"] < 저고점_30["전전저가"] - && 저고점_30["전고가"] > 저고점_30["전전고가"])) - && 저고점_30["tempLowVal"] > 저고점_30["tempHighVal"] - && 저고점_30["tempHighVal"] > 저고점_30["tempLow2Val"] - && 저고점_30["tempLow2Val"] > 저고점_30["tempHigh2Val"] - && 저고점_30["tempHigh2Val"] > 저고점_30["tempLow3Val"]) - //&& candleData.IchimokData.상한선 > candleData.Close - && candleData_240.Close > 현재봉24_240 - && 현재봉24_240 > 전봉24_240; - //&& 현재봉24 < 현재봉72; + || (전봉3 > 저고점_30["전저가"] + && 저고점_30["전고가"] < 저고점_30["전전고가"])) + && 전전봉3 > 전봉3 && 전봉3 < 현재봉3) + && candleData.IchimokData.하한선 < candleData.Close + //&& candleData_240.Close > 현재봉24_240 + //&& 현재봉24_240 > 전봉24_240; + && 현재봉24 < 현재봉72; //var tempFlagShort = (저고점_30["Type"] == 1 // && 저고점_30["전고가"] < 저고점_30["전전고가"] @@ -738,7 +738,7 @@ namespace BitgetAPI.IndicatorConditionSetup if (영호조건식_상향돌파) { - if (!tempFlag2Long && !BuyLongStep[market]) + if (!tempFlag1Long && !tempFlag2Long && !BuyLongStep[market]) { BuyLongStep[market] = true; } @@ -760,7 +760,7 @@ namespace BitgetAPI.IndicatorConditionSetup if (!UpBuyList.ContainsKey(market)) { var buyFlag = false; - if (tempFlag2Long) + if (tempFlag2Long || tempFlag1Long) { // 60분봉 @@ -797,20 +797,33 @@ namespace BitgetAPI.IndicatorConditionSetup // && 저고점_30["전고가"] < candleData.Close; //// && 저고점_30["전고가"] > candleData.Open; - var finalSellPrice = 0.0; + var minSec = 저고점_30["tempHighVal"]; if (minSec > 0) { - var minData = new DateTime(1970, 1, 1, 0, 0, 0); - minData = minData.AddSeconds(minSec); - minData = minData.AddMinutes(-3 * (int)interval); + var minDate = new DateTime(1970, 1, 1, 0, 0, 0); + minDate = minDate.AddSeconds(minSec); + minDate = minDate.AddHours(8); + minDate = minDate.AddMinutes(-3 * (int)interval); var candleDataList = candleDatas.OrderBy(i => i.Argument).ToList(); - var list = candleDataList.Where(t => t.Argument > minData).ToList(); - list.RemoveAt(list.Count - 1); - finalSellPrice = list.Min(t => t.Close); - var maxData = list.Max(t => t.Close); + var list = candleDataList.Where(t => t.Argument > minDate).ToList(); + + var closeDataList = new List(); + + if (list.Count > 3) + { + closeDataList.Add(list[0].Close); + closeDataList.Add(list[1].Close); + closeDataList.Add(list[2].Close); + } + else + { + closeDataList = list.Select(t => t.Close).ToList(); + } + + var maxData = closeDataList.Max(); if (candleData.Close > maxData && 현재봉3 > 전봉3) { @@ -840,8 +853,7 @@ namespace BitgetAPI.IndicatorConditionSetup { { "MarketName", market }, { "BuyDate", nowTime }, - { "Price", price }, - { "finalSellPrice", finalSellPrice }, + { "Price", price }, { "Flag", 저고점_30["전고가"] > 저고점_30["전전고가"]}, { "MCandleTimeType", (int)interval }, { "CandleTime", candleData.Argument }, @@ -891,7 +903,7 @@ namespace BitgetAPI.IndicatorConditionSetup var buyItem = UpBuyList[market]; var flag = (bool)buyItem["Flag"]; - var finalSellPrice = (double)buyItem["finalSellPrice"]; + if (interval < MCandleTimeType.H1) { var buyTime = ((DateTime)buyItem["CandleTime"]).AddMinutes((int)interval); @@ -916,21 +928,6 @@ namespace BitgetAPI.IndicatorConditionSetup var sellFlag = false; - if (finalSellPrice > candleData.Close) - sellFlag = true; - - if (buyTimeUnix < 저고점_30["tempHighVal"]) - { - if (저고점_30["전고가"] < 저고점_30["전전고가"]) - { - sellFlag = true; - } - if (저고점_30["전전고가"] > candleData.Close) - { - sellFlag = true; - } - } - if (candleData.Close < candleData_전봉.Low || candleData.Close < candleData_전전봉.Low || candleData.Close < candleData_전전전봉.Low) @@ -1023,7 +1020,7 @@ namespace BitgetAPI.IndicatorConditionSetup var description = string.Format("{0} 72,24,4 하락", strInterval); var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); - if (!tempFlag2Short && !BuyShortStep[market]) + if (!tempFlag1Short && !tempFlag2Short && !BuyShortStep[market]) { BuyShortStep[market] = true; } @@ -1068,20 +1065,33 @@ namespace BitgetAPI.IndicatorConditionSetup //{ // buyFlag = true; //} - var finalSellPrice = 0.0; + var minSec = 저고점_30["tempLowVal"]; if (minSec > 0) { var minDate = new DateTime(1970, 1, 1, 0, 0, 0); minDate = minDate.AddSeconds(minSec); + minDate = minDate.AddHours(8); minDate = minDate.AddMinutes(-3 * (int)interval); var candleDataList = candleDatas.OrderBy(i => i.Argument).ToList(); - var list = candleDataList.Where(t => t.Argument > minDate).ToList(); - list.RemoveAt(list.Count - 1); - var minData = list.Min(t => t.Close); - finalSellPrice = list.Max(t => t.Close); + var list = candleDataList.Where(t => t.Argument > minDate).ToList(); + var closeDataList = new List(); + + if (list.Count > 3) + { + closeDataList.Add(list[0].Close); + closeDataList.Add(list[1].Close); + closeDataList.Add(list[2].Close); + } + else + { + closeDataList = list.Select(t => t.Close).ToList(); + } + + var minData = closeDataList.Min(); + if (candleData.Close < minData && 현재봉3 < 전봉3) { buyFlag = true; @@ -1112,7 +1122,7 @@ namespace BitgetAPI.IndicatorConditionSetup { "MarketName", market }, { "BuyDate", nowTime }, { "Price", price }, - { "finalSellPrice", finalSellPrice }, + { "Flag", 저고점_30["전저가"] < 저고점_30["전전저가"] }, { "MCandleTimeType", (int)interval }, { "CandleTime", candleData.Argument }, @@ -1162,7 +1172,7 @@ namespace BitgetAPI.IndicatorConditionSetup { var buyItem = DownBuyList[market]; var flag = (bool)buyItem["Flag"]; - var finalSellPrice = (double)buyItem["finalSellPrice"]; + if (interval < MCandleTimeType.H1) { var buyTime = ((DateTime)buyItem["CandleTime"]).AddMinutes((int)interval); @@ -1188,20 +1198,6 @@ namespace BitgetAPI.IndicatorConditionSetup var sellFlag = false; - if (finalSellPrice < candleData.Close) - sellFlag = true; - - if (buyTimeUnix < 저고점_30["tempLowVal"]) - { - if (저고점_30["전저가"] > 저고점_30["전전저가"]) - { - sellFlag = true; - } - if (저고점_30["전전저가"] < candleData.Close) - { - sellFlag = true; - } - } if (candleData.Close > candleData_전봉.High || candleData.Close > candleData_전전봉.High ||