diff --git a/BitgetApi/IndicatorConditionSetup/ImpulseMacdConditionSetup.cs b/BitgetApi/IndicatorConditionSetup/ImpulseMacdConditionSetup.cs index 1a03509..a596c4c 100644 --- a/BitgetApi/IndicatorConditionSetup/ImpulseMacdConditionSetup.cs +++ b/BitgetApi/IndicatorConditionSetup/ImpulseMacdConditionSetup.cs @@ -22,7 +22,7 @@ namespace BitgetAPI.IndicatorConditionSetup private List sbList = new List(); private List shList = new List(); - public ImpulseMacdConditionSetup(int lengthMA = 26, int lengthSignal = 12) + public ImpulseMacdConditionSetup(int lengthMA = 34, int lengthSignal = 12) { this.lengthMA = lengthMA; this.lengthSignal = lengthSignal; @@ -40,6 +40,8 @@ namespace BitgetAPI.IndicatorConditionSetup else { srcList[srcList.Count - 1] = src; + highList[highList.Count - 1] = high; + lowList[lowList.Count - 1] = low; } double smmaHigh = CalculateSMMA(highList, smmaHighList, lengthMA); @@ -52,16 +54,31 @@ namespace BitgetAPI.IndicatorConditionSetup else if (zlema < smmaLow) md = zlema - smmaLow; - mdList.Add(md); - - if (mdList.Count < lengthSignal) - return null; + if (flag) + { + mdList.Add(md); + } + else + { + mdList[mdList.Count - 1] = md; + } double sb = mdList.Skip(mdList.Count - lengthSignal).Average(); double sh = md - sb; - sbList.Add(sb); - shList.Add(sh); + if (flag) + { + sbList.Add(sb); + shList.Add(sh); + } + else + { + sbList[sbList.Count - 1] = sb; + shList[shList.Count - 1] = sh; + } + + if (mdList.Count < lengthSignal) + return null; if (mdList.Count > 100) { diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index fd8ca23..9dc22e1 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -4,9 +4,11 @@ using BitgetAPI.Data; using BitgetAPI.WebService; using Newtonsoft.Json; using Serilog; +using Serilog.Debugging; using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Diagnostics; using System.Linq; using System.Security.Cryptography; using static BitgetAPI.CommonProperty; @@ -110,10 +112,13 @@ namespace BitgetAPI.IndicatorConditionSetup public Dictionary> SellShortStep = new Dictionary>(); public Dictionary> SellLongStep = new Dictionary>(); - public Dictionary BuyShortStep = new Dictionary(); - public Dictionary BuyLongStep = new Dictionary(); + public Dictionary BuyShortStep = new Dictionary(); + public Dictionary BuyLongStep = new Dictionary(); + public Dictionary BuyShortStepStampData = new Dictionary(); + public Dictionary BuyLongStepStampData = new Dictionary(); + public int 전가Flag = 1; @@ -271,8 +276,8 @@ namespace BitgetAPI.IndicatorConditionSetup if (candleData_Main == null) continue; - if(interval == MCandleTimeType.M30) - totalImperseMACDData[market + strInterval].Add(candleData_Main.Argument, impulseMacdConditionSetup.AddDataPoint(candleData_Main.High, candleData_Main.Low, candleData_Main.Close, true)); + + 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); @@ -303,10 +308,10 @@ namespace BitgetAPI.IndicatorConditionSetup totalImperseMACDData[market + strInterval].Remove(keys[i]); } - if (!BuyShortStep.ContainsKey(market + strInterval)) + if (!BuyShortStep.ContainsKey(market)) { - BuyShortStep[market + strInterval] = false; - BuyLongStep[market + strInterval] = false; + BuyShortStep[market] = 0; + BuyLongStep[market] = 0; } if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m"))) @@ -413,19 +418,44 @@ namespace BitgetAPI.IndicatorConditionSetup ichimokuConditionSetup.calIchimokuData(candleDatas_30_정렬, candleData_30); movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30); - var macdData = new ImpulseMacdData(); - - if (keys.LastOrDefault() < candleData_30.Argument) + var macdData_30 = new ImpulseMacdData(); + + var imperseMacd_keys_30 = totalImperseMACDData[market + "30m"].Keys.OrderBy(t => t).ToList(); + + if (imperseMacd_keys_30.LastOrDefault() < candleData_30.Argument) { - macdData = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, true); - totalImperseMACDData[market + "30m"].Add(candleData_30.Argument, macdData); + 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 = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, false); - totalImperseMACDData[market + "30m"][candleData_30.Argument] = macdData; + 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(); + + candleData_30.impulseMacdDataList[30] = macdData_30; + var macdData_5 = new ImpulseMacdData(); + + 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 (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); @@ -633,7 +663,9 @@ namespace BitgetAPI.IndicatorConditionSetup var 전봉4_30 = candleData_30_전봉.movingAverageDataList[4].Value; var 전전봉4_30 = candleData_30_전전봉.movingAverageDataList[4].Value; var 전전전봉4_30 = candleData_30_전전전봉.movingAverageDataList[4].Value; - + + var 현재봉72_30 = candleData_30.movingAverageDataList[72].Value; + var 현재봉72_5 = candleData_5.movingAverageDataList[72].Value; var 저고점_1 = 전저고점[market + "1m"]; var 저고점_5 = 전저고점[market + "5m"]; @@ -646,7 +678,13 @@ namespace BitgetAPI.IndicatorConditionSetup 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_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]]; if (영호조건식_상향돌파) { @@ -669,45 +707,157 @@ namespace BitgetAPI.IndicatorConditionSetup var buyFlag = false; // 30분봉 - var flag_30 = (저고점_30["Type"] == 0 && - 저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] < 저고점_30["전저가"] && candleData_30.Close > 저고점_30["전고가"]) + var flag_30 = ((저고점_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) + || (저고점_30["Type"] == 0 && + 저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] > 저고점_30["전저가"] && candleData_30_전봉.Close < 저고점_30["전고가"] && candleData_30.Close > 저고점_30["전고가"])) && 전봉4_30 < 현재봉4_30 && candleData_30.Open < candleData_30.Close; - //|| (저고점_30["Type"] == 1 && - //저고점_30["전저가"] > 저고점_30["전전저가"] && 저고점_30["전저가"] < 전봉4_30 && candleData_30.Close > 저고점_30["전고가"] && 전봉4_30 < 현재봉4_30 && 전봉4_30 < 전전봉4_30) - //|| (저고점_30["Type"] == 0 && - //저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] > 저고점_30["전저가"] && candleData_30.Close > 저고점_30["전고가"]); - var flag_5 = (저고점_5["Type"] == 0 && - 저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] < 저고점_5["전저가"] && candleData_5.Close > 저고점_5["전고가"]) + if(현재봉4_30 > 현재봉72_30) + { + if(저고점_30["전전고가"] > 저고점_30["전고가"]) + { + flag_30 = 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["전고가"] && 전봉4_5 < 현재봉4_5 && 전봉4_5 < 전전봉4_5) + 저고점_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["전고가"]) && 전봉4_5 < 현재봉4_5; + 저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] > 저고점_5["전저가"] && candleData_5_전봉.Close < 저고점_5["전고가"] && candleData_5.Close > 저고점_5["전고가"])) + && 전봉4_5 < 현재봉4_5 && candleData_5.Open < candleData_5.Close; - var flag_1 = 현재봉4 > 현재봉72 && 전봉4 > 전봉72; + 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; + //var macdFlag = false; - if ((macdData.SH > 0 && macdData.MD < 0 && macdData.MD < -50) - || (totalImperseMACDData[market + "30m"][keys[keys.Count - 2]].MD == 0 && - totalImperseMACDData[market + "30m"][keys[keys.Count - 3]].MD == 0 && - macdData.MD > 0 && macdData.SH > 0)) + //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) { - macdFlag = true; + 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 > 전봉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 (flag_30 && flag_5 && flag_1 && macdFlag) + if (저고점_30["tempLowVal"] != BuyLongStepStampData[market] && + (저고점_30["전저가"] > 전봉4_30 || + 저고점_30["전전저가"] > 저고점_30["전저가"] || + 저고점_30["전고가"] < 저고점_30["전전고가"] || + 전봉macdData_30.SH < 0)) { - buyFlag = true; + 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) { + BuyLongStep[market] = 0; // 없으면 생성 if (signalData == null) { @@ -729,7 +879,7 @@ namespace BitgetAPI.IndicatorConditionSetup { "MarketName", market }, { "BuyDate", nowTime }, { "Price", price }, - { "Flag", 저고점_5["전고가"] > 저고점_5["전전고가"]}, + { "Flag", 저고점_30["전고가"] > 저고점_30["전전고가"]}, { "MCandleTimeType", (int)interval }, { "CandleTime", candleData.Argument }, { "Candle", candleData } @@ -779,7 +929,7 @@ namespace BitgetAPI.IndicatorConditionSetup var flag = (bool)buyItem["Flag"]; if (interval < MCandleTimeType.H1) { - var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes(5); + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes(30); if (nowTime < buyTime) continue; } @@ -793,18 +943,21 @@ namespace BitgetAPI.IndicatorConditionSetup var sellFlag = false; if (저고점_30["전저가"] > 전봉4_30) + sellFlag = true; + + if (전봉macdData_30.SH < 0) sellFlag = true; if (flag) { - if (저고점_5["전고가"] < 저고점_5["전전고가"]) + if (저고점_30["전고가"] < 저고점_30["전전고가"]) { sellFlag = true; } } else { - if (저고점_5["전고가"] > 저고점_5["전전고가"]) + if (저고점_30["전고가"] > 저고점_30["전전고가"]) { buyItem["Flag"] = true; } @@ -814,7 +967,7 @@ namespace BitgetAPI.IndicatorConditionSetup { double.TryParse(buyItem["Price"].ToString(), out var buyPrice); var resultRate = ((price - buyPrice) / buyPrice) * 100; - BuyLongStep[market] = false; + BuyLongStep[market] = 0; var result = new Dictionary() { { "MarketName", market }, @@ -902,43 +1055,150 @@ namespace BitgetAPI.IndicatorConditionSetup var buyFlag = false; - var flag_30 = (저고점_30["Type"] == 1 && - 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && candleData_30.Close < 저고점_30["전저가"]) - && 전봉4_30 > 현재봉4_30 && candleData_30.Open > candleData_30.Close; - //|| (저고점_30["Type"] == 0 && - //저고점_30["전고가"] < 저고점_30["전전고가"] && 저고점_30["전고가"] > 전봉4_30 && candleData_30.Close < 저고점_30["전저가"] && 전봉4_30 > 현재봉4_30 && 전봉4_30 > 전전봉4_30) - //|| (저고점_30["Type"] == 1 && - //저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && candleData_30.Close < 저고점_30["전저가"]); + var flag_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; - var flag_5 = (저고점_5["Type"] == 1 && - 저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] > 저고점_5["전고가"] && candleData_5.Close < 저고점_5["전저가"]) + 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["전저가"] && 전봉4_5 > 현재봉4_5 && 전봉4_5 > 전전봉4_5) + 저고점_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["전저가"]) - && 전봉4_5 > 현재봉4_5; + 저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] < 저고점_5["전고가"] && candleData_5.Close < 저고점_5["전저가"] && candleData_5_전봉.Close > 저고점_5["전저가"])) + && 전봉4_5 > 현재봉4_5 && candleData_5.Open > candleData_5.Close; - - var flag_1 = 현재봉4 < 현재봉72 && 전봉4 < 전봉72; - - var macdFlag = false; - - if ((macdData.SH < 0 && macdData.MD > 0 && macdData.MD > 50) - || (totalImperseMACDData[market + "30m"][keys[keys.Count - 2]].MD == 0 && - totalImperseMACDData[market + "30m"][keys[keys.Count - 3]].MD == 0 && - macdData.MD < 0 && macdData.SH < 0)) + if (현재봉4_5 < 현재봉72_5) { - macdFlag = true; + 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)) + { + 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) + buyFlag = true; + + BuyShortStep[market] = 2; + BuyShortStepStampData[market] = 저고점_30["tempHighVal"]; + } + } + + if (BuyShortStep[market] == 1) + { + if (flag_30 && flag_5 && flag_1_72compare && flag_1 && 전봉macdData_30.SH < 0) + buyFlag = true; } - if (flag_30 && flag_5 && flag_1 && macdFlag) + if (BuyShortStep[market] == 2) { - buyFlag = true; + 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; // 없으면 생성 if (signalData == null) { @@ -959,7 +1219,7 @@ namespace BitgetAPI.IndicatorConditionSetup { "MarketName", market }, { "BuyDate", nowTime }, { "Price", price }, - { "Flag", 저고점_5["전저가"] < 저고점_5["전전저가"]}, + { "Flag", 저고점_30["전저가"] < 저고점_30["전전저가"]}, { "MCandleTimeType", (int)interval }, { "CandleTime", candleData.Argument }, { "Candle", candleData } @@ -1009,7 +1269,7 @@ namespace BitgetAPI.IndicatorConditionSetup var flag = (bool)buyItem["Flag"]; if (interval < MCandleTimeType.H1) { - var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes(5); + var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes(30); if (nowTime < buyTime) continue; } @@ -1025,16 +1285,19 @@ namespace BitgetAPI.IndicatorConditionSetup if (저고점_30["전고가"] < 전봉4_30) sellFlag = true; + if (전봉macdData_30.SH > 0) + sellFlag = true; + if (flag) { - if (저고점_5["전저가"] > 저고점_5["전전저가"]) + if (저고점_30["전저가"] > 저고점_30["전전저가"]) { sellFlag = true; } } else { - if (저고점_5["전저가"] < 저고점_5["전전저가"]) + if (저고점_30["전저가"] < 저고점_30["전전저가"]) { buyItem["Flag"] = true; } @@ -1042,7 +1305,7 @@ namespace BitgetAPI.IndicatorConditionSetup if (sellFlag) { - BuyShortStep[market] = false; + BuyShortStep[market] = 0; double.TryParse(buyItem["Price"].ToString(), out var buyPrice); var resultRate = ((price - buyPrice) / buyPrice) * 100;