From 581fb7cf7857215bf6207d995513355f19b1b0cc Mon Sep 17 00:00:00 2001 From: kyh <1329522@naver.com> Date: Thu, 17 Oct 2024 13:13:54 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9E=84=EC=8B=9C=EB=A1=9C=20Buyer=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IndicatorProcess.cs | 166 +++++++++++++++--- 1 file changed, 144 insertions(+), 22 deletions(-) diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 68cfb9b..9064f1b 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -15,6 +15,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static BitgetAPI.CommonProperty; + using static DevExpress.Utils.Drawing.Helpers.NativeMethods; namespace BitgetAPI.IndicatorConditionSetup @@ -69,6 +70,13 @@ namespace BitgetAPI.IndicatorConditionSetup public Dictionary DownList = new Dictionary(); public Dictionary DownBuyValue = new Dictionary(); + public int LongCount = 0; + public int ShortCount = 0; + + public List> BuyLongList = new List>(); + public List> BuyShortList = new List>(); + public List> ResultList = new List>(); + // 전봉이 구름떼 돌파후 시가가 구름떼 위에서 시작하는 것 // 전봉이 구름떼 하락후 시가가 구름떼 밑에서 시작하는 것 @@ -86,8 +94,13 @@ namespace BitgetAPI.IndicatorConditionSetup ChangeFuturePositionMode(FuturePositionMode.hedge_mode); GetFutureAccountList(); //order 로직 - var orderData = FutureOrder("XRPUSDT", FutureMarginMode.isolated, 10, (double)0.541, FutureSide.BuyShort, OrderType.limit, 10); - var sellData = FutureOrder("XRPUSDT", FutureMarginMode.isolated, 10, 0, FutureSide.SellShort, OrderType.market, 10, "1230644068203786241"); + //var orderData = FutureOrder("XRPUSDT", FutureMarginMode.isolated, 10, (double)0.541, FutureSide.BuyShort, OrderType.limit, 10); + + //var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"])); + //var orderValue = new Dictionary(); + //orderValue.Add("orderId", orderDic["orderId"]); + + //var sellData = FutureOrder("XRPUSDT", FutureMarginMode.isolated, 10, 0, FutureSide.SellShort, OrderType.market, 10, orderDic["orderId"]); @@ -695,6 +708,28 @@ namespace BitgetAPI.IndicatorConditionSetup 전고점Data["flag"] = false; 전고점Data["clearFlag"] = false; + + + if (LongCount < 3) + { + double size = 50 / price; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, 10); + 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++; + } + } } //파는 시점 @@ -739,6 +774,40 @@ namespace BitgetAPI.IndicatorConditionSetup UpResultList.Add(result); UpBuyList.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, 10, orderDic["orderId"].ToString()); + var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"])); + + var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]); + var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"])); + + double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); + double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue); + var resultRateData = ((sellPriceValue - 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", detailOrderDic["price"] }, + { "SellCandle", candleData }, + { "Rate", resultRateData } + }; + ResultList.Add(orderResult); + BuyLongList.Remove(orderDic); + LongCount--; + } + } } @@ -943,8 +1012,27 @@ namespace BitgetAPI.IndicatorConditionSetup 전저점Data["flag"] = false; 전저점Data["clearFlag"] = false; - } + if(ShortCount < 3) + { + double size = 50 / price; + var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, 10); + 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 @@ -989,6 +1077,39 @@ namespace BitgetAPI.IndicatorConditionSetup 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, 10, orderDic["orderId"].ToString()); + var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"])); + + var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]); + var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"])); + + double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue); + double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue); + var resultRateData = ((sellPriceValue - 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", detailOrderDic["price"] }, + { "SellCandle", candleData }, + { "Rate", resultRateData } + }; + ResultList.Add(orderResult); + BuyShortList.Remove(orderDic); + ShortCount--; + } } } } @@ -1082,6 +1203,25 @@ namespace BitgetAPI.IndicatorConditionSetup 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=" + id.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 = "") { @@ -1150,25 +1290,7 @@ namespace BitgetAPI.IndicatorConditionSetup { return null; } - } - //else - //{ - // // 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="+id.ToString()+"&productType=USDT-FUTURES", null, YHKIM_SecreteKey) }, - // {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, - // {"ACCESS-TIMESTAMP",timestamp} - // }; - - // var orderDetail = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrderDetail_Future, BitgetURL_OrderDetail_Future + "?symbol=" + symbol.ToString() + "&orderId=" + id.ToString() + "&productType=USDT-FUTURES", null, MCandleTimeType.M1, "", "", orderDetailnvc); - // if (orderDetail == null || orderDetail["msg"]?.ToString() != "success") return null; - - // var data = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderDetail["data"])); - // //id = data["clientOid"].ToString(); - //} + } 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)