From 727c6fdc0a5a6127ebfa7919188435ad9ee161ee Mon Sep 17 00:00:00 2001 From: kyh <1329522@naver.com> Date: Fri, 13 Dec 2024 14:29:21 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=84=EC=A0=80=EC=A0=90=20=EC=A0=84?= =?UTF-8?q?=EC=A0=84=EC=A0=80=EC=A0=90=20=EC=A0=84=EA=B3=A0=EA=B0=80=20?= =?UTF-8?q?=EC=A0=84=EC=A0=84=EA=B3=A0=EA=B0=80=20=EA=B0=80=EC=A7=80?= =?UTF-8?q?=EA=B3=A0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IndicatorProcess.cs | 1467 +++++++++++++---- .../MovingAverageConditionSetup.cs | 16 + BitgetApi/MainForm.cs | 2 +- BitgetApi/WebService/WebConnection.cs | 4 +- 4 files changed, 1177 insertions(+), 312 deletions(-) diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 46520ae..248e20c 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -73,8 +73,8 @@ namespace BitgetAPI.IndicatorConditionSetup // 스레드 시작/종료 플래그 public bool Is_th_SignalInfo; - public Dictionary> 전저점 = new Dictionary>(); - public Dictionary> 전고점 = new Dictionary>(); + public Dictionary> 전저고점 = new Dictionary>(); + public List checkedMarkets; public List intervalList; @@ -233,29 +233,18 @@ namespace BitgetAPI.IndicatorConditionSetup var strInterval = Utils.Convertor.GetEnumDescription((Enum)interval); if (!intervalList.Contains(strInterval)) continue; - if (!전저점.ContainsKey(market + strInterval)) + 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("tempBuyFlag", true); - 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("tempBuyFlag", true); - dic.Add("flag", false); - dic.Add("breakFlag", false); - 전고점.Add(market + strInterval, dic); + var dic = new Dictionary(); + dic.Add("beforeHighVal", 0); + dic.Add("beforeLowVal", 0); + dic.Add("twoBeforeHighVal", 0); + dic.Add("twoBeforeLowVal", 0); + 전저고점.Add(market + strInterval, dic); + } + // 시간별로 정렬하기 (임시 리스트) var candleDatas = findedMarket.candleDataList[interval]; var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList(); @@ -376,6 +365,8 @@ namespace BitgetAPI.IndicatorConditionSetup var 전전전봉24 = candleData_전전전봉.movingAverageDataList[24].Value; var 전전전봉36 = candleData_전전전봉.movingAverageDataList[36].Value; var 전전전봉72 = candleData_전전전봉.movingAverageDataList[72].Value; + var 전전전봉40 = candleData_전전전봉.movingAverageDataList[40].Value; + var 전전봉2 = candleData_전전봉.movingAverageDataList[2].Value; var 전전봉4 = candleData_전전봉.movingAverageDataList[4].Value; @@ -385,6 +376,16 @@ namespace BitgetAPI.IndicatorConditionSetup var 전전봉36 = candleData_전전봉.movingAverageDataList[36].Value; var 전전봉72 = candleData_전전봉.movingAverageDataList[72].Value; + var 전전봉144 = candleData_전전봉.movingAverageDataList[144].Value; + var 전전봉20 = candleData_전전봉.movingAverageDataList[20].Value; + var 전전봉40 = candleData_전전봉.movingAverageDataList[40].Value; + var 전전봉120 = candleData_전전봉.movingAverageDataList[120].Value; + var 전전봉160 = candleData_전전봉.movingAverageDataList[160].Value; + var 전전봉240 = candleData_전전봉.movingAverageDataList[240].Value; + var 전전봉80 = candleData_전전봉.movingAverageDataList[80].Value; + var 전전봉480 = candleData_전전봉.movingAverageDataList[480].Value; + + var 전봉2 = candleData_전봉.movingAverageDataList[2].Value; var 전봉4 = candleData_전봉.movingAverageDataList[4].Value; var 전봉8 = candleData_전봉.movingAverageDataList[8].Value; @@ -392,6 +393,16 @@ namespace BitgetAPI.IndicatorConditionSetup var 전봉24 = candleData_전봉.movingAverageDataList[24].Value; var 전봉36 = candleData_전봉.movingAverageDataList[36].Value; var 전봉72 = candleData_전봉.movingAverageDataList[72].Value; + var 전봉144 = candleData_전봉.movingAverageDataList[144].Value; + + var 전봉20 = candleData_전봉.movingAverageDataList[20].Value; + var 전봉40 = candleData_전봉.movingAverageDataList[40].Value; + var 전봉80 = candleData_전봉.movingAverageDataList[80].Value; + var 전봉120 = candleData_전봉.movingAverageDataList[120].Value; + var 전봉160 = candleData_전봉.movingAverageDataList[160].Value; + var 전봉240 = candleData_전봉.movingAverageDataList[240].Value; + var 전봉480 = candleData_전봉.movingAverageDataList[480].Value; + var 현재봉2 = candleData.movingAverageDataList[2].Value; var 현재봉4 = candleData.movingAverageDataList[4].Value; @@ -399,7 +410,14 @@ namespace BitgetAPI.IndicatorConditionSetup var 현재봉12 = candleData.movingAverageDataList[12].Value; var 현재봉24 = candleData.movingAverageDataList[24].Value; var 현재봉36 = candleData.movingAverageDataList[36].Value; + var 현재봉20 = candleData.movingAverageDataList[20].Value; + var 현재봉40 = candleData.movingAverageDataList[40].Value; var 현재봉72 = candleData.movingAverageDataList[72].Value; + var 현재봉120 = candleData.movingAverageDataList[120].Value; + var 현재봉144 = candleData.movingAverageDataList[144].Value; + var 현재봉240 = candleData.movingAverageDataList[240].Value; + var 현재봉160 = candleData.movingAverageDataList[160].Value; + var 현재봉80 = candleData.movingAverageDataList[80].Value; var 전봉Bol4_Down = candleData_전봉.movingAverageDataList[4].BolangerValue_Down; @@ -410,6 +428,7 @@ namespace BitgetAPI.IndicatorConditionSetup var 전전봉Bol4_Down = candleData_전전봉.movingAverageDataList[4].BolangerValue_Down; var 전전봉Bol12_Down = candleData_전전봉.movingAverageDataList[12].BolangerValue_Down; var 전전봉Bol24_Down = candleData_전전봉.movingAverageDataList[24].BolangerValue_Down; + var 전전봉Bol72_Down = candleData_전전봉.movingAverageDataList[72].BolangerValue_Down; var Bol4_Down = candleData.movingAverageDataList[4].BolangerValue_Down; var Bol12_Down = candleData.movingAverageDataList[12].BolangerValue_Down; @@ -424,6 +443,7 @@ namespace BitgetAPI.IndicatorConditionSetup var 전전봉Bol4_Up = candleData_전전봉.movingAverageDataList[4].BolangerValue_Up; var 전전봉Bol12_Up = candleData_전전봉.movingAverageDataList[12].BolangerValue_Up; var 전전봉Bol24_Up = candleData_전전봉.movingAverageDataList[24].BolangerValue_Up; + var 전전봉Bol72_Up = candleData_전전봉.movingAverageDataList[72].BolangerValue_Up; var Bol4_Up = candleData.movingAverageDataList[4].BolangerValue_Up; var Bol12_Up = candleData.movingAverageDataList[12].BolangerValue_Up; @@ -435,6 +455,24 @@ namespace BitgetAPI.IndicatorConditionSetup continue; } + var 저고점 = 전저고점[market + strInterval]; + + if (전봉4 > (전전봉4 * 1.0001) && 전전봉4 < 전전전봉4) + { + 저고점["twoBeforeLowVal"] = 저고점["beforeLowVal"]; + 저고점["beforeLowVal"] = 전봉4; + } + + if (전봉4 < (전전봉4 * 1.0001) && 전전봉4 > 전전전봉4) + { + 저고점["twoBeforeHighVal"] = 저고점["beforeHighVal"]; + 저고점["beforeHighVal"] = 전봉4; + } + + if (저고점["twoBeforeLowVal"] == 0 || 저고점["twoBeforeHighVal"] == 0) + continue; + + if (영호조건식_상향돌파) { var price = candleData.Close; @@ -445,70 +483,28 @@ 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)); + //전 저점 계산 + try { + + //사는 시점 if (!UpBuyList.ContainsKey(market + interval)) { var buyFlag = false; - var buyTempFlag = false; - var buyType = 0; - - if (BuyLongStep.ContainsKey(market + interval) && BuyLongStep[market + interval]) + if ((전봉12 > 전전봉12 || 전봉24 > 전전봉24) && + 현재봉4 > 저고점["beforeHighVal"] && 전봉24 < 전봉4 && + 저고점["twoBeforeLowVal"] < 저고점["beforeLowVal"] && + 저고점["twoBeforeHighVal"] < 저고점["beforeHighVal"]) { - 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; + buyFlag = true; } - 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) { - + BuyLongStep[market + interval] = false; // 없으면 생성 if (signalData == null) { @@ -529,10 +525,11 @@ namespace BitgetAPI.IndicatorConditionSetup { "MarketName", market }, { "BuyDate", nowTime }, { "Price", price }, + { "MCandleTimeType", (int)interval }, - { "Type", buyType }, { "CandleTime", candleData.Argument }, - { "MovingRate4_8", 현재봉8 - 현재봉4 }, + { "HighData", 전봉144 > 전봉72 ? 144 : 72 }, + { "flag" , false }, { "Candle", candleData } }; @@ -591,95 +588,13 @@ namespace BitgetAPI.IndicatorConditionSetup } 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); - // } + if (저고점["twoBeforeHighVal"] > 저고점["beforeHighVal"]) + sellFlag = true; - // break; - // case 2: - // if ((전봉24 < 현재봉24 && 전봉12 < 현재봉12) || 현재봉2 > 현재봉24) - // { - // sellFlag = true; - // } - // break; + if (전봉4 < 저고점["beforeLowVal"]) + sellFlag = true; - //} - 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); @@ -769,63 +684,17 @@ namespace BitgetAPI.IndicatorConditionSetup if (!DownBuyList.ContainsKey(market + interval)) { var buyFlag = false; - var buyTempFlag = false; - - var buyType = 0; - - if (BuyShortStep.ContainsKey(market + interval) && BuyShortStep[market + interval]) + if ((전봉12 < 전전봉12 || 전봉24 < 전전봉24) && + 현재봉4 < 저고점["beforeLowVal"] && 전봉24 > 전봉4 && + 저고점["twoBeforeHighVal"] > 저고점["beforeHighVal"] && + 저고점["twoBeforeLowVal"] > 저고점["beforeLowVal"]) { - 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; - } - } + buyFlag = true; } if (buyFlag) { - + BuyShortStep[market + interval] = false; // 없으면 생성 if (signalData == null) { @@ -847,7 +716,8 @@ namespace BitgetAPI.IndicatorConditionSetup { "BuyDate", nowTime }, { "Price", price }, { "MCandleTimeType", (int)interval }, - { "Type", buyType }, + { "LowData", 전봉144 < 전봉72 ? 144 : 72 }, + { "flag" , false }, { "CandleTime", candleData.Argument }, { "MovingRate4_8", 현재봉4 - 현재봉8 }, { "Candle", candleData } @@ -863,10 +733,7 @@ namespace BitgetAPI.IndicatorConditionSetup [5] = false }; SellShortStep.Add(market + interval, dic); - if (buyType == 2) - { - BuyShortStep[market + interval] = false; - } + BuyShortStep[market + interval] = false; if (ShortCount < 5) { double size = YHKIM_OrderAmount / price * YHKIM_Leverage; @@ -911,97 +778,11 @@ namespace BitgetAPI.IndicatorConditionSetup continue; } - int.TryParse(buyItem["Type"].ToString(), out var type); + if (저고점["twoBeforeLowVal"] < 저고점["beforeLowVal"]) + sellFlag = true; - //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 (전봉4 > 저고점["beforeHighVal"]) + sellFlag = true; if (sellFlag) { @@ -3095,4 +2876,1072 @@ if (영호조건식_상향돌파 || 영호조건식_하향돌파) } } } + */ + + +/* + +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/MovingAverageConditionSetup.cs b/BitgetApi/IndicatorConditionSetup/MovingAverageConditionSetup.cs index 1b05ff3..d604e47 100644 --- a/BitgetApi/IndicatorConditionSetup/MovingAverageConditionSetup.cs +++ b/BitgetApi/IndicatorConditionSetup/MovingAverageConditionSetup.cs @@ -29,6 +29,14 @@ namespace BitgetAPI.IndicatorConditionSetup public int CandleLength12 { get; set; } = 12; // 기간 public int CandleLength8 { get; set; } = 8; + public int CandleLength144 { get; set; } = 144; + public int CandleLength40 { get; set; } = 40; + public int CandleLength20 { get; set; } = 20; + public int CandleLength120 { get; set; } = 120; + public int CandleLength240 { get; set; } = 240; + public int CandleLength480 { get; set; } = 480; + public int CandleLength80 { get; set; } = 80; + public int CandleLength160 { get; set; } = 160; // 가격 public CommonProperty.CandlePriceType MACandlePriceType { get; set; } @@ -50,9 +58,17 @@ namespace BitgetAPI.IndicatorConditionSetup candleData.movingAverageDataList.Add(CandleLength12, new MovingAverageData()); candleData.movingAverageDataList.Add(CandleLength24, new MovingAverageData()); candleData.movingAverageDataList.Add(CandleLength36, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLength144, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLength40, new MovingAverageData()); candleData.movingAverageDataList.Add(CandleLength48, new MovingAverageData()); candleData.movingAverageDataList.Add(CandleLength72, new MovingAverageData()); candleData.movingAverageDataList.Add(CandleLength8, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLength20, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLength80, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLength160, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLength120, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLength240, new MovingAverageData()); + candleData.movingAverageDataList.Add(CandleLength480, new MovingAverageData()); } foreach(var item in candleData.movingAverageDataList.ToList()) diff --git a/BitgetApi/MainForm.cs b/BitgetApi/MainForm.cs index d7d9185..e8f6a8a 100644 --- a/BitgetApi/MainForm.cs +++ b/BitgetApi/MainForm.cs @@ -62,7 +62,7 @@ namespace BitgetAPI IndicatorProcess indicatorProcess = null; // 종목별 캔들 데이터 : 캔들 개수 - const int candleCount = 200; + const int candleCount = 500; #endregion public MainForm() diff --git a/BitgetApi/WebService/WebConnection.cs b/BitgetApi/WebService/WebConnection.cs index 2ba4870..b374dcc 100644 --- a/BitgetApi/WebService/WebConnection.cs +++ b/BitgetApi/WebService/WebConnection.cs @@ -1050,7 +1050,7 @@ namespace BitgetAPI.WebService candleDataList.Add(candleData); // 기존 데이터 삭제 - if (candleDataList.Count > 250) + if (candleDataList.Count > 500) { // 가장 오래된 데이터 삭제 candleDataList.Remove(j => j.Argument == candleDataList.Min(i => i.Argument)); @@ -1260,7 +1260,7 @@ namespace BitgetAPI.WebService candleDataList.Add(candleData); // 기존 데이터 삭제 - if (candleDataList.Count > 250) + if (candleDataList.Count > 500) { // 가장 오래된 데이터 삭제 candleDataList.Remove(j => j.Argument == candleDataList.Min(i => i.Argument));