diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 67f05f7..b158796 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -20,6 +20,7 @@ namespace BitgetAPI.IndicatorConditionSetup // 스레드 시작/종료 플래그 public bool Is_th_SignalInfo; public Dictionary> 전저점 = new Dictionary>(); + public Dictionary> 전고점 = new Dictionary>(); public List checkedMarkets; public List intervalList; @@ -147,6 +148,16 @@ namespace BitgetAPI.IndicatorConditionSetup dic.Add("breakFlag", false); 전저점.Add(market + strInterval, dic); } + if (!전고점.ContainsKey(market + strInterval)) + { + var dic = new Dictionary(); + dic.Add("val", 0); + dic.Add("clearFlag", true); + dic.Add("firstFlag", true); + dic.Add("flag", false); + dic.Add("breakFlag", false); + 전고점.Add(market + strInterval, dic); + } // 시간별로 정렬하기 (임시 리스트) var candleDatas = findedMarket.candleDataList[interval]; @@ -237,38 +248,39 @@ namespace BitgetAPI.IndicatorConditionSetup movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전봉); - // 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,48 높은값 + var 높은값_48_24_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[48].Value, candleData_전전봉.movingAverageDataList[24].Value); + // 24,48 낮은값 + var 낮은값_48_24_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[48].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); + // 24,48 높은값 + var 높은값_48_24_전봉 = Math.Max(candleData_전봉.movingAverageDataList[48].Value, candleData_전봉.movingAverageDataList[24].Value); + // 24,48 낮은값 + var 낮은값_48_24_전봉 = Math.Min(candleData_전봉.movingAverageDataList[48].Value, candleData_전봉.movingAverageDataList[24].Value); + // 24,48 높은값 var 높은값_48_24 = Math.Max(candleData.movingAverageDataList[48].Value, candleData.movingAverageDataList[24].Value); + // 24,48 낮은값 + var 낮은값_48_24 = Math.Min(candleData.movingAverageDataList[48].Value, candleData.movingAverageDataList[24].Value); + + var 높은값_12_낮은값48_24 = Math.Max(candleData.movingAverageDataList[12].Value, 낮은값_48_24); + var 낮은값_12_높은값48_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 전전봉48 = candleData_전전봉.movingAverageDataList[48].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 전봉48 = candleData_전봉.movingAverageDataList[48].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 현재봉48 = candleData.movingAverageDataList[48].Value; - var 현재봉72 = candleData.movingAverageDataList[72].Value; + var 전봉Bol4 = candleData_전봉.movingAverageDataList[4].BolangerValue; var 전봉Bol12 = candleData_전봉.movingAverageDataList[12].BolangerValue; @@ -280,56 +292,260 @@ namespace BitgetAPI.IndicatorConditionSetup var Bol4 = candleData.movingAverageDataList[4].BolangerValue; var Bol12 = candleData.movingAverageDataList[12].BolangerValue; var Bol24 = candleData.movingAverageDataList[24].BolangerValue; + - ////볼랜저 12 24중 12가 크고 전전봉 전봉 12 차이보다 전전봉 전봉 24가 작아야함(하향) - //var data12 = 전봉Bol12 - 전전봉Bol12 > 0 - // ? 전봉Bol12 - 전전봉Bol12 : - // (전봉Bol12 - 전전봉Bol12) * -1; + if ((int)interval != 60) + { + continue; + } + + #region 240분봉 처리 + //60분봉 관련 처리 + var candleDatas240 = findedMarket.candleDataList[MCandleTimeType.H4]; + var candleDatas240_정렬 = candleDatas240.OrderBy(i => i.Argument).ToList(); + + var candleData240 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument); + if (candleData240 == null) continue; + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240); + ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240); - //var data24 = 전봉Bol24 - 전전봉Bol24 > 0 - // ? 전봉Bol24 - 전전봉Bol24 : - // (전봉Bol24 - 전전봉Bol24) * -1; + candleDatas240_정렬.RemoveAt(candleDatas240_정렬.Count - 1); + var candleData240_전봉 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240_전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240_전봉); - //var buyFlag = 전봉Bol12 - 전봉Bol24 > Bol12 - Bol24 && 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24; + candleDatas240_정렬.RemoveAt(candleDatas240_정렬.Count - 1); + var candleData240_전전봉 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240_전전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240_전전봉); + candleDatas240_정렬.RemoveAt(candleDatas240_정렬.Count - 1); + var candleData240_전전전봉 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240_전전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240_전전봉); - //var sellFlag = 전봉Bol12 - 전봉Bol24 < Bol12 - Bol24 || 현재봉4 > 낮은값_72_24; + var 낮은값240_48_24 = Math.Min(candleData240.movingAverageDataList[48].Value, candleData240.movingAverageDataList[24].Value); + var 높은값240_48_24 = Math.Max(candleData240.movingAverageDataList[48].Value, candleData240.movingAverageDataList[24].Value); + var 전봉낮은값240_48_24 = Math.Min(candleData240_전봉.movingAverageDataList[48].Value, candleData240_전봉.movingAverageDataList[24].Value); + var 전봉높은값240_48_24 = Math.Max(candleData240_전봉.movingAverageDataList[48].Value, candleData240_전봉.movingAverageDataList[24].Value); + var 전전봉낮은값240_48_24 = Math.Min(candleData240_전봉.movingAverageDataList[48].Value, candleData240_전봉.movingAverageDataList[24].Value); + var 전전봉높은값240_48_24 = Math.Max(candleData240_전봉.movingAverageDataList[48].Value, candleData240_전봉.movingAverageDataList[24].Value); - if (영호조건식_상향돌파 && + var 현재봉240_12 = candleData240.movingAverageDataList[12].Value; + var 전봉240_12 = candleData240_전봉.movingAverageDataList[12].Value; + var 전전봉240_12 = candleData240_전전봉.movingAverageDataList[12].Value; - // 전전봉의 4가 72, 21 보다 높고 - candleData_전전봉.movingAverageDataList[4].Value <= 높은값_72_24_전전봉 && - // 전봉의 4가 72,21 보다 작고나서 - candleData_전봉.movingAverageDataList[4].Value > 높은값_72_24_전봉 && - // 현재 시가도 4가 72,21 보다 작고, 고가도 - candleData.movingAverageDataList[4].Value > 높은값_72_24) + var 현재봉240_4 = candleData240.movingAverageDataList[4].Value; + var 전봉240_4 = candleData240_전봉.movingAverageDataList[4].Value; + var 전전봉240_4 = candleData240_전전봉.movingAverageDataList[4].Value; + + var 전봉240Bol4 = candleData240_전봉.movingAverageDataList[4].BolangerValue; + var 전봉240Bol12 = candleData240_전봉.movingAverageDataList[12].BolangerValue; + var 전봉240Bol24 = candleData240_전봉.movingAverageDataList[24].BolangerValue; + + var 전전봉240Bol4 = candleData240_전전봉.movingAverageDataList[4].BolangerValue; + var 전전봉240Bol12 = candleData240_전전봉.movingAverageDataList[12].BolangerValue; + var 전전봉240Bol24 = candleData240_전전봉.movingAverageDataList[24].BolangerValue; + var 현재봉240Bol4 = candleData240.movingAverageDataList[4].BolangerValue; + var 현재봉240Bol12 = candleData240.movingAverageDataList[12].BolangerValue; + var 현재봉240Bol24 = candleData240.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} 48,24,4 상승", strInterval); + var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); - var description = string.Format("{0} 72,24,4 상승", strInterval); ; - var signalData = signals_LU.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); - - // 없으면 생성 - if (signalData == null) + try { - var indicatorPrice = candleData.Open; - var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; + var candle240Flag = 현재봉240_4 < 높은값240_48_24 && + 현재봉240_4 < 전봉240_4 && + 현재봉240_12 < 전봉240_12 && + 전봉240Bol12 - 전봉240Bol24 > 현재봉240Bol12 - 현재봉240Bol24; - SignalInfoData signalInfoData = new SignalInfoData(); - signalInfoData.SignalStart = nowTime; - signalInfoData.MarketName = market; - signalInfoData.Description = description; - signalInfoData.Rate = rate; - signalInfoData.Price = price; - signalInfoData.IndicatorPrice = indicatorPrice; - signalInfoData.IndicatorRate = indicatorRate; - signalInfoData.MCandleTimeType = interval; + var buyFlag = 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4; + var sellFlag = 현재봉4 < 낮은값_12_높은값48_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); + + if (현재봉4 < 낮은값_48_24) + { + if (firstFlag) + 전고점Data["firstFlag"] = false; + + 전고점Data["flag"] = true; + 전고점Data["clearFlag"] = true; + 전고점Data["val"] = 0; + 전고점Data["breakFlag"] = false; + } + + 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 (!BuyList.ContainsKey(market + interval)) + { + if ( + ( + 전전봉4 < 높은값_48_24_전전봉 && + 전봉4 > 높은값_48_24_전봉 && + 전봉12 > 전전봉12 && + (전봉4 < candleData_전봉.IchimokData.하한선 + || 전봉4 > candleData_전봉.IchimokData.상한선) && + 전봉4 - 전전봉4 > 전봉12 - 전전봉12 && + 전봉12 - 전전봉12 > 전봉24 - 전전봉24 + ) + && flag && !firstFlag + && + buyFlag && + candle240Flag + ) + { + // 없으면 생성 + 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 } + }; + + BuyList.Add(market + interval, buyDic); + 최초조건Flag[market + interval] = false; + if (현재봉4 > 현재봉12) + { + 판매조건Flag[market + interval] = false; + } + else + { + 판매조건Flag[market + interval] = true; + } + if (val == 0) + 전고점Data["val"] = 전봉4; + + 전고점Data["flag"] = false; + 전고점Data["clearFlag"] = false; + } + else + { + if (현재봉240_12 > 전봉240_12) + 최초조건Flag[market + interval] = true; + } + } + //파는 시점 + else + { + var buyItem = BuyList[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 (현재봉4 > 현재봉12 && !판매조건Flag[market + interval]) + { + 판매조건Flag[market + interval] = true; + } + + if (!판매조건Flag[market + interval]) + { + sellFlag = 현재봉4 < 높은값_48_24; + } + + 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 } + }; + + ResultList.Add(result); + BuyList.Remove(market + interval); + } + } + + } + catch (Exception e) + { - signals_LU.Add(signalInfoData); } } else if (영호조건식_하향돌파) @@ -339,74 +555,16 @@ namespace BitgetAPI.IndicatorConditionSetup var indicatorPrice = candleData.Open; var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; - var description = string.Format("{0} 72,24,4 하락", strInterval); + var description = string.Format("{0} 48,24,4 하락", strInterval); var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); try { - if ((int)interval != 60) - { - continue; - } - #region 240분봉 처리 - //60분봉 관련 처리 - var candleDatas240 = findedMarket.candleDataList[MCandleTimeType.H4]; - var candleDatas240_정렬 = candleDatas240.OrderBy(i => i.Argument).ToList(); - - var candleData240 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument); - if (candleData240 == null) continue; - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240); - ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240); - - - candleDatas240_정렬.RemoveAt(candleDatas240_정렬.Count - 1); - var candleData240_전봉 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240_전봉); - ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240_전봉); - - candleDatas240_정렬.RemoveAt(candleDatas240_정렬.Count - 1); - var candleData240_전전봉 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240_전전봉); - ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240_전전봉); - - candleDatas240_정렬.RemoveAt(candleDatas240_정렬.Count - 1); - var candleData240_전전전봉 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument); - movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240_전전봉); - ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240_전전봉); - - var 낮은값240_72_24 = Math.Min(candleData240.movingAverageDataList[72].Value, candleData240.movingAverageDataList[24].Value); - var 높은값240_72_24 = Math.Max(candleData240.movingAverageDataList[72].Value, candleData240.movingAverageDataList[24].Value); - - var 전봉낮은값240_72_24 = Math.Min(candleData240_전봉.movingAverageDataList[72].Value, candleData240_전봉.movingAverageDataList[24].Value); - var 전봉높은값240_72_24 = Math.Max(candleData240_전봉.movingAverageDataList[72].Value, candleData240_전봉.movingAverageDataList[24].Value); - var 전전봉낮은값240_72_24 = Math.Min(candleData240_전봉.movingAverageDataList[72].Value, candleData240_전봉.movingAverageDataList[24].Value); - var 전전봉높은값240_72_24 = Math.Max(candleData240_전봉.movingAverageDataList[72].Value, candleData240_전봉.movingAverageDataList[24].Value); - - var 현재봉240_12 = candleData240.movingAverageDataList[12].Value; - var 전봉240_12 = candleData240_전봉.movingAverageDataList[12].Value; - var 전전봉240_12 = candleData240_전전봉.movingAverageDataList[12].Value; - - var 현재봉240_4 = candleData240.movingAverageDataList[4].Value; - var 전봉240_4 = candleData240_전봉.movingAverageDataList[4].Value; - var 전전봉240_4 = candleData240_전전봉.movingAverageDataList[4].Value; - - var 전봉240Bol4 = candleData240_전봉.movingAverageDataList[4].BolangerValue; - var 전봉240Bol12 = candleData240_전봉.movingAverageDataList[12].BolangerValue; - var 전봉240Bol24 = candleData240_전봉.movingAverageDataList[24].BolangerValue; - - var 전전봉240Bol4 = candleData240_전전봉.movingAverageDataList[4].BolangerValue; - var 전전봉240Bol12 = candleData240_전전봉.movingAverageDataList[12].BolangerValue; - var 전전봉240Bol24 = candleData240_전전봉.movingAverageDataList[24].BolangerValue; - var 현재봉240Bol4 = candleData240.movingAverageDataList[4].BolangerValue; - var 현재봉240Bol12 = candleData240.movingAverageDataList[12].BolangerValue; - var 현재봉240Bol24 = candleData240.movingAverageDataList[24].BolangerValue; - - var candle240Flag = 현재봉240_4 < 높은값240_72_24 && + var candle240Flag = 현재봉240_4 < 높은값240_48_24 && 현재봉240_4 < 전봉240_4 && 현재봉240_12 < 전봉240_12 && 전봉240Bol12 - 전봉240Bol24 > 현재봉240Bol12 - 현재봉240Bol24; - - #endregion + #region 3분봉 처리 /* @@ -430,13 +588,13 @@ namespace BitgetAPI.IndicatorConditionSetup var 높은값3_48_24 = Math.Max(candleData3.movingAverageDataList[48].Value, candleData3.movingAverageDataList[24].Value); - var 낮은값3_72_24 = Math.Min(candleData3.movingAverageDataList[72].Value, candleData3.movingAverageDataList[24].Value); - var 높은값3_72_24 = Math.Max(candleData3.movingAverageDataList[72].Value, candleData3.movingAverageDataList[24].Value); + var 낮은값3_48_24 = Math.Min(candleData3.movingAverageDataList[48].Value, candleData3.movingAverageDataList[24].Value); + var 높은값3_48_24 = Math.Max(candleData3.movingAverageDataList[48].Value, candleData3.movingAverageDataList[24].Value); - var 전봉낮은값3_72_24 = Math.Min(candleData3_전봉.movingAverageDataList[72].Value, candleData3_전봉.movingAverageDataList[24].Value); - var 전봉높은값3_72_24 = Math.Max(candleData3_전봉.movingAverageDataList[72].Value, candleData3_전봉.movingAverageDataList[24].Value); - var 전전봉낮은값3_72_24 = Math.Min(candleData3_전전봉.movingAverageDataList[72].Value, candleData3_전전봉.movingAverageDataList[24].Value); - var 전전봉높은값3_72_24 = Math.Max(candleData3_전전봉.movingAverageDataList[72].Value, candleData3_전전봉.movingAverageDataList[24].Value); + var 전봉낮은값3_48_24 = Math.Min(candleData3_전봉.movingAverageDataList[48].Value, candleData3_전봉.movingAverageDataList[24].Value); + var 전봉높은값3_48_24 = Math.Max(candleData3_전봉.movingAverageDataList[48].Value, candleData3_전봉.movingAverageDataList[24].Value); + var 전전봉낮은값3_48_24 = Math.Min(candleData3_전전봉.movingAverageDataList[48].Value, candleData3_전전봉.movingAverageDataList[24].Value); + var 전전봉높은값3_48_24 = Math.Max(candleData3_전전봉.movingAverageDataList[48].Value, candleData3_전전봉.movingAverageDataList[24].Value); var 현재봉3_12 = candleData3.movingAverageDataList[12].Value; var 전봉3_12 = candleData3_전봉.movingAverageDataList[12].Value; @@ -457,22 +615,22 @@ namespace BitgetAPI.IndicatorConditionSetup var 현재봉3Bol12 = candleData3.movingAverageDataList[12].BolangerValue; var 현재봉3Bol24 = candleData3.movingAverageDataList[24].BolangerValue; - //var candle3Flag = 현재봉3_4 < 낮은값3_72_24 && 전봉3_4 > 현재봉3_4 && 전전봉3_4 > 전봉3_4 && candleData3.Close < candleData3.IchimokData.상한선 && candleData3.Close < candleData3.Open; + //var candle3Flag = 현재봉3_4 < 낮은값3_48_24 && 전봉3_4 > 현재봉3_4 && 전전봉3_4 > 전봉3_4 && candleData3.Close < candleData3.IchimokData.상한선 && candleData3.Close < candleData3.Open; */ #endregion var buyFlag = 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4; //파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜 - //var sellFlag = 전봉Bol12 - 전봉Bol24 < Bol12 - Bol24 || 현재봉4 > 낮은값_72_24; - //var sellFlag = 현재봉4 > 낮은값_72_24 || 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24; - var sellFlag = 현재봉4 > 높은값_48_24;// 현재봉4 > 낮은값_72_24 || 전봉12 < 전봉4 || (전봉4 > 전전봉4 && 전봉12 > 전전봉12) || 현재봉60_4 > 전봉60_4;// || 전봉4 - 전전봉4 > 0;// || 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24; + //var sellFlag = 전봉Bol12 - 전봉Bol24 < Bol12 - Bol24 || 현재봉4 > 낮은값_48_24; + //var sellFlag = 현재봉4 > 낮은값_48_24 || 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24; + var sellFlag = 현재봉4 > 높은값_12_낮은값48_24;// 현재봉4 > 낮은값_48_24 || 전봉12 < 전봉4 || (전봉4 > 전전봉4 && 전봉12 > 전전봉12) || 현재봉60_4 > 전봉60_4;// || 전봉4 - 전전봉4 > 0;// || 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24; //파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜 //var buyFlag = candleData_전봉.movingAverageDataList[12].BolangerValue > candleData_전봉.movingAverageDataList[24].BolangerValue && 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24; ////파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜 - //var sellFlag = 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24 || 현재봉4 > 낮은값_72_24; + //var sellFlag = 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24 || 현재봉4 > 낮은값_48_24; var 전저점Data = 전저점[market + strInterval]; double.TryParse(전저점Data["val"].ToString(), out var val); @@ -481,7 +639,7 @@ namespace BitgetAPI.IndicatorConditionSetup bool.TryParse(전저점Data["clearFlag"].ToString(), out var clearFlag); bool.TryParse(전저점Data["breakFlag"].ToString(), out var breakFlag); - if (현재봉4 > 높은값_72_24) + if (현재봉4 > 높은값_48_24) { if (firstFlag) 전저점Data["firstFlag"] = false; @@ -529,23 +687,22 @@ namespace BitgetAPI.IndicatorConditionSetup { if ( ( - 전전봉4 > 낮은값_72_24_전전봉 - && 전전봉4 < 높은값_72_24_전전봉 && - 전봉4 < 낮은값_72_24_전봉 && - //전봉12 > 낮은값_72_24_전봉 && - 전봉24 < 전전봉24 && - 낮은값_72_24_전봉 < candleData_전봉.IchimokData.상한선 && - candleData_전봉.Close < candleData_전봉.IchimokData.상한선 && - //candleData_전봉.Open > candleData_전봉.Close && - (flag && !firstFlag) + 전전봉4 > 낮은값_48_24_전전봉 && + 전봉4 < 낮은값_48_24_전봉 && + //전봉24 < 전전봉24 && + 전봉12 < 전전봉12 && + (전봉4 > candleData_전봉.IchimokData.상한선 + || 전봉4 < candleData_전봉.IchimokData.하한선) && + 전봉4 - 전전봉4 < 전봉12 - 전전봉12 && + 전봉12 - 전전봉12 < 전봉24 - 전전봉24 ) //|| //( // 전봉4 < 전전봉4 && 전봉12 < 전전봉12 && - // 전봉24 < 전전봉24 && 전봉72 < 전전봉72 && - // 현재봉4 < 낮은값_72_24 && 현재봉12 > 현재봉4 && + // 전봉24 < 전전봉24 && 전봉48 < 전전봉48 && + // 현재봉4 < 낮은값_48_24 && 현재봉12 > 현재봉4 && // candleData_전봉.Open > candleData_전봉.Close && - && candleData.Open > candleData.Close + && flag && !firstFlag //) && //최초조건Flag.ContainsKey(market + interval) && 최초조건Flag[market + interval] == true && @@ -615,7 +772,7 @@ namespace BitgetAPI.IndicatorConditionSetup //임시로 처리 else { - if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours((int)interval)) + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours(((int)interval) / 60)) { continue; } @@ -627,20 +784,21 @@ namespace BitgetAPI.IndicatorConditionSetup if (!판매조건Flag[market + interval]) { - sellFlag = 현재봉4 > 낮은값_72_24; + sellFlag = 현재봉4 > 낮은값_48_24; } if (sellFlag) { double.TryParse(buyItem["Price"].ToString(), out var buyPrice); - var resultRate = ((price - buyPrice) / buyPrice) * 100; + var resultRate = ((price - buyPrice) / buyPrice) * 100 * -1; var result = new Dictionary() { { "MarketName", market }, { "BuyDate", buyItem["BuyDate"]}, { "BuyPrice", buyPrice }, + { "Type", "하향"}, { "MCandleTimeType", (int)interval }, { "BuyCandle", buyItem["Candle"] }, { "SellDate", nowTime},