diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index bee0411..529722f 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -114,6 +114,9 @@ namespace BitgetAPI.IndicatorConditionSetup public List> BuyShortList = new List>(); public List> ResultList = new List>(); + public Dictionary SellShortStep = new Dictionary(); + public Dictionary SellLongStep = new Dictionary(); + // 전봉이 구름떼 돌파후 시가가 구름떼 위에서 시작하는 것 // 전봉이 구름떼 하락후 시가가 구름떼 밑에서 시작하는 것 @@ -261,6 +264,27 @@ namespace BitgetAPI.IndicatorConditionSetup ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전봉); movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전봉); + candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); + var candleData_전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); + ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전전봉); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전봉); + + // 24,72 높은값 + var 높은값_48_24_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_48_24_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value); + // 24,72 높은값 + var 높은값_48_24_전봉 = Math.Max(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_48_24_전봉 = Math.Min(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value); + + // 24,72 높은값 + var 높은값_48_24 = Math.Max(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value); + // 24,72 낮은값 + var 낮은값_48_24 = Math.Min(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value); + + var 높은값_12_낮은값72_24 = Math.Max(candleData.movingAverageDataList[12].Value, 낮은값_48_24); + var 낮은값_12_높은값72_24 = Math.Min(candleData.movingAverageDataList[12].Value, 높은값_48_24); if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선 && candleData.Close > candleData.IchimokData.상한선) @@ -323,6 +347,647 @@ namespace BitgetAPI.IndicatorConditionSetup } if (영호조건식_상향돌파 || 영호조건식_하향돌파) + { + var 전봉4 = candleData_전봉.movingAverageDataList[4].Value; + var 전봉8 = candleData_전봉.movingAverageDataList[8].Value; + var 전봉24 = candleData_전봉.movingAverageDataList[24].Value; + var 전봉48 = candleData_전봉.movingAverageDataList[48].Value; + var 전봉72 = candleData_전봉.movingAverageDataList[72].Value; + + var 전전봉4 = candleData_전전봉.movingAverageDataList[4].Value; + var 전전봉8 = candleData_전전봉.movingAverageDataList[8].Value; + var 전전봉24 = candleData_전전봉.movingAverageDataList[24].Value; + var 전전봉48 = candleData_전전봉.movingAverageDataList[48].Value; + var 전전봉72 = candleData_전전봉.movingAverageDataList[72].Value; + + var 현재봉4 = candleData.movingAverageDataList[4].Value; + var 현재봉8 = candleData.movingAverageDataList[8].Value; + var 현재봉12 = candleData.movingAverageDataList[12].Value; + var 현재봉24 = candleData.movingAverageDataList[24].Value; + var 현재봉48 = candleData.movingAverageDataList[48].Value; + var 현재봉72 = candleData.movingAverageDataList[72].Value; + + + if ((int)interval != 1) + { + continue; + } + + #region 5분봉 처리 + //15분봉이지만 60분봉으로 변경 + var candleDatas5 = findedMarket.candleDataList[MCandleTimeType.M5]; + var candleDatas5_정렬 = candleDatas5.ToList().OrderBy(i => i.Argument).ToList(); + + var candleData5 = candleDatas5.Find(i => i.Argument == candleDatas5_정렬.Last().Argument); + if (candleData5 == null) continue; + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas5_정렬, candleData5); + ichimokuConditionSetup.calIchimokuData(candleDatas5_정렬, candleData5); + + + candleDatas5_정렬.RemoveAt(candleDatas5_정렬.Count - 1); + var candleData15_전봉 = candleDatas5.Find(i => i.Argument == candleDatas5_정렬.Last().Argument); + movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas5_정렬, candleData15_전봉); + ichimokuConditionSetup.calIchimokuData(candleDatas5_정렬, candleData15_전봉); + + + #endregion + + if (영호조건식_상향돌파) + { + var price = candleData.Close; + var rate = (candleData.Close / candleData.Open) * 100 - 100; + var indicatorPrice = candleData.Open; + var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; + + var description = string.Format("{0} 72,24,4 상승", strInterval); + var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); + + try + { + if (!UpBuyList.ContainsKey(market + interval)) + { + if ( + candleData_전봉.IchimokData.하한선 > candleData_전봉.Close && + candleData_전봉.Open < candleData_전봉.Close && + 현재봉4 > 전봉4 && + (전봉4 > 전봉8 && 전전봉4 < 전전봉8) && + (전봉8 < 전봉24 && 전봉24 < 전봉72) + ) { + + // 없으면 생성 + if (signalData == null) + { + SignalInfoData signalInfoData = new SignalInfoData(); + signalInfoData.SignalStart = nowTime; + signalInfoData.MarketName = market; + signalInfoData.Description = description; + signalInfoData.Rate = rate; + signalInfoData.Price = price; + signalInfoData.IndicatorPrice = indicatorPrice; + signalInfoData.IndicatorRate = indicatorRate; + signalInfoData.MCandleTimeType = interval; + + signals_SD.Add(signalInfoData); + } + var buyDic = new Dictionary + { + { "MarketName", market }, + { "BuyDate", nowTime }, + { "Price", price }, + { "MCandleTimeType", (int)interval }, + { "Candle", candleData } + }; + + UpBuyList.Add(market + interval, buyDic); + + + if (LongCount < 2) + { + double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage); + var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); + + var orderDataDic = new Dictionary + { + { "MarketName", market }, + { "BuyDate", nowTime }, + { "Price", price }, + { "MCandleTimeType", (int)interval }, + { "Candle", candleData }, + { "Size", size }, + { "orderId", orderDic["orderId"] } + }; + BuyLongList.Add(orderDataDic); + LongCount++; + + SellLongStep.Add(market + interval, 8); + } + + } + } + //파는 시점 + else + { + var buyItem = UpBuyList[market + interval]; + if (interval < MCandleTimeType.H1) + { + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval)) + { + continue; + } + } + //임시로 처리 + else + { + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours(((int)interval) / 60)) + { + continue; + } + } + + var key = SellLongStep[market + interval]; + + switch (SellLongStep[market + interval]) { + case 8: + if (전봉8 > 전봉24) + { + SellLongStep[market + interval] = 24; + key = 24; + } + + break; + case 24: + if (전봉8 > 전봉72) + { + SellLongStep[market + interval] = 72; + key = 72; + } + break; + } + + if (candleData.movingAverageDataList[key].Value > 현재봉4) + { + + double.TryParse(buyItem["Price"].ToString(), out var buyPrice); + var resultRate = ((price - buyPrice) / buyPrice) * 100; + + var result = new Dictionary() + { + { "MarketName", market }, + { "BuyDate", buyItem["BuyDate"]}, + { "Type", "상향"}, + { "BuyPrice", buyPrice }, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + UpResultList.Add(result); + UpBuyList.Remove(market + interval); + SellLongStep.Remove(market + interval); + + var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market); + + if (orderDic != null) + { + double.TryParse(orderDic["Size"].ToString(), out var size); + var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellLong, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString()); + + if (sellOrder != null) + { + var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"])); + } + else + { + Log.Error("Sell 안됨 확인 필요"); + } + double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue); + //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]); + //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"])); + + //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); + + var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100; + + var orderResult = new Dictionary() + { + { "MarketName", market }, + { "BuyDate", orderDic["BuyDate"]}, + { "BuyPrice", orderDic["Price"] }, + { "Type", "상향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price}, + { "SellCandle", candleData }, + { "Rate", resultRateData } + }; + ResultList.Add(orderResult); + BuyLongList.Remove(orderDic); + LongCount--; + } + + } + } + + } + catch (Exception e) + { + + } + } + if (영호조건식_하향돌파) + { + var price = candleData.Close; + var rate = (candleData.Close / candleData.Open) * 100 - 100; + var indicatorPrice = candleData.Open; + var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100; + + var description = string.Format("{0} 72,24,4 하락", strInterval); + var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description)); + + try + { + //사는 시점 + if (!DownBuyList.ContainsKey(market + interval)) + { + if ( + candleData_전봉.IchimokData.상한선 < candleData_전봉.Close && + candleData_전봉.Open > candleData_전봉.Close && + 현재봉4 < 전봉4 && + (전봉4 < 전봉8 && 전전봉4 > 전전봉8) && + (전봉8 > 전봉24 && 전봉24 > 전봉72) + ) + { + + // 없으면 생성 + if (signalData == null) + { + SignalInfoData signalInfoData = new SignalInfoData(); + signalInfoData.SignalStart = nowTime; + signalInfoData.MarketName = market; + signalInfoData.Description = description; + signalInfoData.Rate = rate; + signalInfoData.Price = price; + signalInfoData.IndicatorPrice = indicatorPrice; + signalInfoData.IndicatorRate = indicatorRate; + signalInfoData.MCandleTimeType = interval; + + signals_SD.Add(signalInfoData); + } + var buyDic = new Dictionary + { + { "MarketName", market }, + { "BuyDate", nowTime }, + { "Price", price }, + { "MCandleTimeType", (int)interval }, + { "Candle", candleData } + }; + + DownBuyList.Add(market + interval, buyDic); + + + if(ShortCount < 2) + { + double size = YHKIM_OrderAmount / price * YHKIM_Leverage; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage); + var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); + + var orderDataDic = new Dictionary + { + { "MarketName", market }, + { "BuyDate", nowTime }, + { "Price", price }, + { "MCandleTimeType", (int)interval }, + { "Candle", candleData }, + { "Size", size }, + { "orderId", orderDic["orderId"] } + }; + BuyShortList.Add(orderDataDic); + ShortCount++; + SellShortStep.Add(market + interval, 8); + } + } + } + //파는 시점 + else + { + var buyItem = DownBuyList[market + interval]; + if (interval < MCandleTimeType.H1) + { + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval)) + { + continue; + } + } + //임시로 처리 + else + { + if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours(((int)interval) / 60)) + { + continue; + } + } + + var key = SellShortStep[market + interval]; + + switch (SellShortStep[market + interval]) + { + case 8: + if (전봉8 < 전봉24) + { + SellShortStep[market + interval] = 24; + key = 24; + } + + break; + case 24: + if (전봉24 < 전봉72) + { + SellShortStep[market + interval] = 72; + key = 72; + } + break; + } + + if (candleData.movingAverageDataList[key].Value < 현재봉4) + { + + double.TryParse(buyItem["Price"].ToString(), out var buyPrice); + var resultRate = ((price - buyPrice) / buyPrice) * 100; + + var result = new Dictionary() + { + { "MarketName", market }, + { "BuyDate", buyItem["BuyDate"]}, + { "BuyPrice", buyPrice }, + { "Type", "하향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRate } + }; + + DownResultList.Add(result); + DownBuyList.Remove(market + interval); + + var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market); + + if (orderDic != null) + { + double.TryParse(orderDic["Size"].ToString(), out var size); + var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellShort, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString()); + + if (sellOrder != null) + { + var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"])); + } + else + { + Log.Error("Sell 안됨 확인 필요"); + } + + + double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue); + //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]); + //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"])); + + //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); + + var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100; + + var orderResult = new Dictionary() + { + { "MarketName", market }, + { "BuyDate", orderDic["BuyDate"]}, + { "BuyPrice", orderDic["Price"] }, + { "Type", "하향"}, + { "MCandleTimeType", (int)interval }, + { "BuyCandle", buyItem["Candle"] }, + { "SellDate", nowTime}, + { "SellPrice", price }, + { "SellCandle", candleData }, + { "Rate", resultRateData } + }; + ResultList.Add(orderResult); + BuyShortList.Remove(orderDic); + ShortCount--; + } + } + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + } + } + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + } + + + public Dictionary GetPendingOrders() + { + var timeSpan = DateTime.Now; + + var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); + + var reqStr = "/api/v2/mix/order/orders-pending"; + + var nvc = new NameValueCollection { + {"ACCESS-KEY", YHKIM_AccessKey}, + {"ACCESS-SIGN", GenerateSignString(timestamp, "GET", reqStr, "productType=USDT-FUTURES", null, YHKIM_SecreteKey) }, + {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, + {"ACCESS-TIMESTAMP",timestamp} + }; + + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetPendingOrder_Future, BitgetURL_PendingOrders_Future, null, MCandleTimeType.M1, "", "", nvc); + } + + public List> GetFutureAccountList() + { + var timeSpan = DateTime.Now; + + var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); + + var reqStr = "/api/v2/mix/account/accounts"; + + var nvc = new NameValueCollection { + {"ACCESS-KEY", YHKIM_AccessKey}, + {"ACCESS-SIGN", GenerateSignString(timestamp, "GET", reqStr, "productType=USDT-FUTURES", null, YHKIM_SecreteKey) }, + {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, + {"ACCESS-TIMESTAMP",timestamp} + }; + + return (List>)WebConnection.SendWebServer(ExchangeWebReqType.BitgetAccountList_Future, BitgetURL_AccountList_Future, null, MCandleTimeType.M1, "", "", nvc); + } + + public Dictionary CancelFutureOrder(string symbol, string orderId) + { + var timeSpan = DateTime.Now; + + var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); + + var reqStr = "/api/v2/mix/order/cancel-order"; + var postStr = "{\"symbol\" : \"" + symbol + "\", \"orderId\" : \"" + orderId + "\", \"productType\" : \"usdt-futures\" , \"marginCoin\" : \"USDT\"}"; + var nvc = new NameValueCollection { + {"ACCESS-KEY", YHKIM_AccessKey}, + {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", postStr, YHKIM_SecreteKey)}, + {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, + {"ACCESS-TIMESTAMP", timestamp} + }; + + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetCancelOrder_Future, BitgetURL_CancelOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc); + } + + public Dictionary ChangeFuturePositionMode(FuturePositionMode mode) + { + var timeSpan = DateTime.Now; + + var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); + + var reqStr = "/api/v2/mix/account/set-position-mode"; + var postStr = "{\"productType\" : \"USDT-FUTURES\", \"posMode\" : \"" + Utils.Convertor.GetEnumDescription((Enum)mode) + "\"}"; + + var nvc = new NameValueCollection { + {"ACCESS-KEY", YHKIM_AccessKey}, + {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", postStr, YHKIM_SecreteKey)}, + {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, + {"ACCESS-TIMESTAMP", timestamp} + }; + + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangePositionMode_Future, BitgetURL_ChangePositionMode_Future, null, MCandleTimeType.M1, postStr, "", nvc); + } + + public Dictionary GetFutureOrderDetail(string symbol, string orderId) + { + var timeSpan = DateTime.Now; + var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); + + // sell은 ClientOID 가 필요 + var orderDetailStr = "/api/v2/mix/order/detail"; + timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); + var orderDetailnvc = new NameValueCollection { + {"ACCESS-KEY", YHKIM_AccessKey}, + {"ACCESS-SIGN", GenerateSignString(timestamp, "GET", orderDetailStr, "symbol="+symbol.ToString()+"&orderId="+orderId.ToString()+"&productType=USDT-FUTURES", null, YHKIM_SecreteKey) }, + {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, + {"ACCESS-TIMESTAMP",timestamp} + }; + + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrderDetail_Future, BitgetURL_OrderDetail_Future + "?symbol=" + symbol.ToString() + "&orderId=" + orderId.ToString() + "&productType=USDT-FUTURES", null, MCandleTimeType.M1, "", "", orderDetailnvc); + + } + + + public Dictionary FutureOrder(string symbol, FutureMarginMode marginMode, double size, double price, FutureSide futureSide, OrderType orderType, double leverage, string id = "") + { + var side = ""; + var tradeSide = ""; + + if (futureSide == FutureSide.BuyShort) + { + id = Guid.NewGuid().ToString(); + side = "sell"; + tradeSide = "open"; + } + else if (futureSide == FutureSide.BuyLong) + { + id = Guid.NewGuid().ToString(); + side = "buy"; + tradeSide = "Open"; + } + else if (futureSide == FutureSide.SellShort) + { + side = "sell"; + tradeSide = "close"; + } + else if (futureSide == FutureSide.SellLong) + { + side = "buy"; + tradeSide = "close"; + } + + if (orderType == OrderType.market) + price = 0; + + var timeSpan = DateTime.Now; + + var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); + + var reqStr = "/api/v2/mix/order/place-order"; + + if (futureSide == FutureSide.BuyShort || futureSide == FutureSide.BuyLong) + { + //change margin mode 이후 leverage 처리 해야 함 + var changeMarginModeStr = "{\"symbol\": \"" + symbol + "\", \"productType\": \"usdt-futures\", \"marginCoin\": \"USDT\", \"marginMode\": \"" + Utils.Convertor.GetEnumDescription((Enum)marginMode) + "\"}"; + + var nvcMargin = new NameValueCollection { + {"ACCESS-KEY", YHKIM_AccessKey}, + {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", "/api/v2/mix/account/set-margin-mode", "", changeMarginModeStr, YHKIM_SecreteKey)}, + {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, + {"ACCESS-TIMESTAMP", timestamp} + }; + var result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeMarginMode_Future, BitgetURL_ChangeMarginMode_Future, null, MCandleTimeType.M1, changeMarginModeStr, "", nvcMargin); + if (result == null || result["msg"]?.ToString() != "success") + { + return null; + } + + var leverageStr = "{\"symbol\": \"" + symbol + "\", \"productType\": \"USDT-FUTURES\", \"marginCoin\": \"USDT\", \"leverage\": \"" + leverage.ToString() + "\", \"holdSide\": \"" + (futureSide == FutureSide.BuyShort ? "short" : "long") + "\"}"; + timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); + var nvcLeverage = new NameValueCollection { + {"ACCESS-KEY", YHKIM_AccessKey}, + {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", "/api/v2/mix/account/set-leverage", "", leverageStr, YHKIM_SecreteKey)}, + {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, + {"ACCESS-TIMESTAMP", timestamp} + }; + result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeLeverage_Future, BitgetURL_ChangeLeverage_Future, null, MCandleTimeType.M1, leverageStr, "", nvcLeverage); + if (result == null ||result["msg"]?.ToString() != "success") + { + return null; + } + } + else { + var result = CancelFutureOrder(symbol, id); + if (result == null || result["msg"]?.ToString() != "success") + { + Log.Error("Sell에서 Cancel관련 Error"); + } + } + + var postStr = "{\"symbol\": \"" + symbol + "\", \"productType\": \"usdt-futures\", \"marginMode\": \"" + Utils.Convertor.GetEnumDescription((Enum)marginMode) + "\", \"marginCoin\": \"USDT\", \"size\": \"" + + size.ToString() + "\", \"price\": \"" + price.ToString() + "\", \"side\": \"" + side + "\", " + "\"tradeSide\": \"" + tradeSide + "\", \"orderType\": \"" + Utils.Convertor.GetEnumDescription((Enum)orderType) + + "\", \"force\": \"gtc\", \"clientOid\": \"" + id + "\" }"; + timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); + var nvc = new NameValueCollection { + {"ACCESS-KEY", YHKIM_AccessKey}, + {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", postStr, YHKIM_SecreteKey)}, + {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, + {"ACCESS-TIMESTAMP", timestamp} + }; + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrder_Future, BitgetURL_BuySellOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc); + } + + public string GenerateSignString(string timestamp, string method, string requestPath, string queryString, string body, string secretKey) + { + method = method.ToUpper(); + body = body == null ? "" : body; + queryString = string.IsNullOrWhiteSpace(queryString) ? "" : "?" + queryString; + string preHash = timestamp + method + requestPath + queryString + body; + + var encSecretKey_byteData = System.Text.Encoding.UTF8.GetBytes(secretKey); + var encPreHash_byteData = System.Text.Encoding.UTF8.GetBytes(preHash); + + return Convert.ToBase64String(new HMACSHA256(encSecretKey_byteData).ComputeHash(encPreHash_byteData)); + } + + public void calIchimokuProcess_Add() + { + + + } + + public void calIchimokuProcess_Update() + { + + } + } +} + +/* + if (영호조건식_상향돌파 || 영호조건식_하향돌파) { candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1); var candleData_전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument); @@ -1174,221 +1839,4 @@ namespace BitgetAPI.IndicatorConditionSetup } } } - } - } - } - catch (Exception e) - { - Console.WriteLine(e.Message); - } - } - } - - - public Dictionary GetPendingOrders() - { - var timeSpan = DateTime.Now; - - var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); - - var reqStr = "/api/v2/mix/order/orders-pending"; - - var nvc = new NameValueCollection { - {"ACCESS-KEY", YHKIM_AccessKey}, - {"ACCESS-SIGN", GenerateSignString(timestamp, "GET", reqStr, "productType=USDT-FUTURES", null, YHKIM_SecreteKey) }, - {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, - {"ACCESS-TIMESTAMP",timestamp} - }; - - return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetPendingOrder_Future, BitgetURL_PendingOrders_Future, null, MCandleTimeType.M1, "", "", nvc); - } - - public List> GetFutureAccountList() - { - var timeSpan = DateTime.Now; - - var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); - - var reqStr = "/api/v2/mix/account/accounts"; - - var nvc = new NameValueCollection { - {"ACCESS-KEY", YHKIM_AccessKey}, - {"ACCESS-SIGN", GenerateSignString(timestamp, "GET", reqStr, "productType=USDT-FUTURES", null, YHKIM_SecreteKey) }, - {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, - {"ACCESS-TIMESTAMP",timestamp} - }; - - return (List>)WebConnection.SendWebServer(ExchangeWebReqType.BitgetAccountList_Future, BitgetURL_AccountList_Future, null, MCandleTimeType.M1, "", "", nvc); - } - - public Dictionary CancelFutureOrder(string symbol, string orderId) - { - var timeSpan = DateTime.Now; - - var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); - - var reqStr = "/api/v2/mix/order/cancel-order"; - var postStr = "{\"symbol\" : \"" + symbol + "\", \"orderId\" : \"" + orderId + "\", \"productType\" : \"usdt-futures\" , \"marginCoin\" : \"USDT\"}"; - var nvc = new NameValueCollection { - {"ACCESS-KEY", YHKIM_AccessKey}, - {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", postStr, YHKIM_SecreteKey)}, - {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, - {"ACCESS-TIMESTAMP", timestamp} - }; - - return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetCancelOrder_Future, BitgetURL_CancelOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc); - } - - public Dictionary ChangeFuturePositionMode(FuturePositionMode mode) - { - var timeSpan = DateTime.Now; - - var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); - - var reqStr = "/api/v2/mix/account/set-position-mode"; - var postStr = "{\"productType\" : \"USDT-FUTURES\", \"posMode\" : \"" + Utils.Convertor.GetEnumDescription((Enum)mode) + "\"}"; - - var nvc = new NameValueCollection { - {"ACCESS-KEY", YHKIM_AccessKey}, - {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", postStr, YHKIM_SecreteKey)}, - {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, - {"ACCESS-TIMESTAMP", timestamp} - }; - - return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangePositionMode_Future, BitgetURL_ChangePositionMode_Future, null, MCandleTimeType.M1, postStr, "", nvc); - } - - public Dictionary GetFutureOrderDetail(string symbol, string orderId) - { - var timeSpan = DateTime.Now; - var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); - - // sell은 ClientOID 가 필요 - var orderDetailStr = "/api/v2/mix/order/detail"; - timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); - var orderDetailnvc = new NameValueCollection { - {"ACCESS-KEY", YHKIM_AccessKey}, - {"ACCESS-SIGN", GenerateSignString(timestamp, "GET", orderDetailStr, "symbol="+symbol.ToString()+"&orderId="+orderId.ToString()+"&productType=USDT-FUTURES", null, YHKIM_SecreteKey) }, - {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, - {"ACCESS-TIMESTAMP",timestamp} - }; - - return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrderDetail_Future, BitgetURL_OrderDetail_Future + "?symbol=" + symbol.ToString() + "&orderId=" + orderId.ToString() + "&productType=USDT-FUTURES", null, MCandleTimeType.M1, "", "", orderDetailnvc); - - } - - - public Dictionary FutureOrder(string symbol, FutureMarginMode marginMode, double size, double price, FutureSide futureSide, OrderType orderType, double leverage, string id = "") - { - var side = ""; - var tradeSide = ""; - - if (futureSide == FutureSide.BuyShort) - { - id = Guid.NewGuid().ToString(); - side = "sell"; - tradeSide = "open"; - } - else if (futureSide == FutureSide.BuyLong) - { - id = Guid.NewGuid().ToString(); - side = "buy"; - tradeSide = "Open"; - } - else if (futureSide == FutureSide.SellShort) - { - side = "sell"; - tradeSide = "close"; - } - else if (futureSide == FutureSide.SellLong) - { - side = "buy"; - tradeSide = "close"; - } - - if (orderType == OrderType.market) - price = 0; - - var timeSpan = DateTime.Now; - - var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); - - var reqStr = "/api/v2/mix/order/place-order"; - - if (futureSide == FutureSide.BuyShort || futureSide == FutureSide.BuyLong) - { - //change margin mode 이후 leverage 처리 해야 함 - var changeMarginModeStr = "{\"symbol\": \"" + symbol + "\", \"productType\": \"usdt-futures\", \"marginCoin\": \"USDT\", \"marginMode\": \"" + Utils.Convertor.GetEnumDescription((Enum)marginMode) + "\"}"; - - var nvcMargin = new NameValueCollection { - {"ACCESS-KEY", YHKIM_AccessKey}, - {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", "/api/v2/mix/account/set-margin-mode", "", changeMarginModeStr, YHKIM_SecreteKey)}, - {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, - {"ACCESS-TIMESTAMP", timestamp} - }; - var result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeMarginMode_Future, BitgetURL_ChangeMarginMode_Future, null, MCandleTimeType.M1, changeMarginModeStr, "", nvcMargin); - if (result == null || result["msg"]?.ToString() != "success") - { - return null; - } - - var leverageStr = "{\"symbol\": \"" + symbol + "\", \"productType\": \"USDT-FUTURES\", \"marginCoin\": \"USDT\", \"leverage\": \"" + leverage.ToString() + "\", \"holdSide\": \"" + (futureSide == FutureSide.BuyShort ? "short" : "long") + "\"}"; - timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); - var nvcLeverage = new NameValueCollection { - {"ACCESS-KEY", YHKIM_AccessKey}, - {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", "/api/v2/mix/account/set-leverage", "", leverageStr, YHKIM_SecreteKey)}, - {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, - {"ACCESS-TIMESTAMP", timestamp} - }; - result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeLeverage_Future, BitgetURL_ChangeLeverage_Future, null, MCandleTimeType.M1, leverageStr, "", nvcLeverage); - if (result == null ||result["msg"]?.ToString() != "success") - { - return null; - } - } - else { - var result = CancelFutureOrder(symbol, id); - if (result == null || result["msg"]?.ToString() != "success") - { - Log.Error("Sell에서 Cancel관련 Error"); - } - } - - var postStr = "{\"symbol\": \"" + symbol + "\", \"productType\": \"usdt-futures\", \"marginMode\": \"" + Utils.Convertor.GetEnumDescription((Enum)marginMode) + "\", \"marginCoin\": \"USDT\", \"size\": \"" - + size.ToString() + "\", \"price\": \"" + price.ToString() + "\", \"side\": \"" + side + "\", " + "\"tradeSide\": \"" + tradeSide + "\", \"orderType\": \"" + Utils.Convertor.GetEnumDescription((Enum)orderType) - + "\", \"force\": \"gtc\", \"clientOid\": \"" + id + "\" }"; - timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString(); - var nvc = new NameValueCollection { - {"ACCESS-KEY", YHKIM_AccessKey}, - {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", postStr, YHKIM_SecreteKey)}, - {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, - {"ACCESS-TIMESTAMP", timestamp} - }; - return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrder_Future, BitgetURL_BuySellOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc); - } - - public string GenerateSignString(string timestamp, string method, string requestPath, string queryString, string body, string secretKey) - { - method = method.ToUpper(); - body = body == null ? "" : body; - queryString = string.IsNullOrWhiteSpace(queryString) ? "" : "?" + queryString; - string preHash = timestamp + method + requestPath + queryString + body; - - var encSecretKey_byteData = System.Text.Encoding.UTF8.GetBytes(secretKey); - var encPreHash_byteData = System.Text.Encoding.UTF8.GetBytes(preHash); - - return Convert.ToBase64String(new HMACSHA256(encSecretKey_byteData).ComputeHash(encPreHash_byteData)); - } - - public void calIchimokuProcess_Add() - { - - - } - - public void calIchimokuProcess_Update() - { - - } - } -} \ No newline at end of file + */ \ No newline at end of file