diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs index 37c08f7..02290f6 100644 --- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs +++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs @@ -375,16 +375,16 @@ namespace BitgetAPI.IndicatorConditionSetup { if(!FirstFlag[market + strInterval + "Long"]) { - if(sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongSell, true)) + if(sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongSell, market, true)) { FirstFlag[market + strInterval + "Long"] = true; } } - if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongBuy, true) && - !sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongSell, true) && - FirstFlag[market + strInterval + "Long"] && - 저고점["전저가"] > 저고점["전전저가"] + if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongBuy, market, true) && + !sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongSell, market, true) && + FirstFlag[market + strInterval + "Long"] + //&& 저고점["전저가"] > 저고점["전전저가"] ) { BuyLongStep[market] = 0; @@ -459,14 +459,14 @@ 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(1); var buyTwoTime = buyTime.AddMinutes(5); if (nowTime < buyTime) continue; else if (nowTime < buyTwoTime) { - if (!(sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongBuy, true) && - !sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongSell, true))) + if (!(sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongBuy, market, true) && + !sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongSell, market, true))) { buyItem["Flag"] = true; } @@ -489,7 +489,7 @@ namespace BitgetAPI.IndicatorConditionSetup sellFlag= true; } - if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongSell) || sellFlag) + if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.LongSell, market, true) || sellFlag) { double.TryParse(buyItem["Price"].ToString(), out var buyPrice); var resultRate = ((price - buyPrice) / buyPrice) * 100; @@ -580,17 +580,18 @@ namespace BitgetAPI.IndicatorConditionSetup { if (!FirstFlag[market + strInterval + "Short"]) { - if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortSell, true)) + if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortSell, market, true)) { FirstFlag[market + strInterval + "Short"] = true; } } - if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortBuy, true) && - !sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortSell, true) && - FirstFlag[market + strInterval + "Short"] && - 저고점["전고가"] < 저고점["전전고가"]) + if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortBuy, market, true) && + !sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortSell, market, true) && + FirstFlag[market + strInterval + "Short"] + //&& 저고점["전고가"] < 저고점["전전고가"]) + ) { BuyShortStep[market] = 0; // 없으면 생성 @@ -663,15 +664,15 @@ 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(1); var buyTwoTime = buyTime.AddMinutes(5); if (nowTime < buyTime) continue; else if (nowTime < buyTwoTime) { - if (!(sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortBuy, true) && - !sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortSell, true))) + if (!(sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortBuy, market, true) && + !sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortSell, market, true))) { buyItem["Flag"] = true; } @@ -696,7 +697,7 @@ namespace BitgetAPI.IndicatorConditionSetup sellFlag = true; } - if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortSell) || sellFlag) + if (sMABandConditionSetup.Calculate(candleDatas_5_TempList, SMABandType.ShortSell, market, true) || sellFlag) { BuyShortStep[market] = 0; double.TryParse(buyItem["Price"].ToString(), out var buyPrice); @@ -897,13 +898,13 @@ namespace BitgetAPI.IndicatorConditionSetup {"ACCESS-TIMESTAMP",timestamp} }; - return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetPendingOrder_Future, BitgetURL_PendingOrders_Future, null, MCandleTimeType.M1, "", "", nvc); + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetPendingOrder_Future, BitgetURL_PendingOrders_Future, null, MCandleTimeType.M5, "", "", nvc); } public long GetTimeStamp() { - var result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetGetTimeStamp, BitgetURL_GetTimestamp, null, MCandleTimeType.M1, "", "", null); + var result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetGetTimeStamp, BitgetURL_GetTimestamp, null, MCandleTimeType.M5, "", "", null); if (result == null) { return 0; @@ -929,7 +930,7 @@ namespace BitgetAPI.IndicatorConditionSetup {"ACCESS-TIMESTAMP",timestamp} }; - return (List>)WebConnection.SendWebServer(ExchangeWebReqType.BitgetAccountList_Future, BitgetURL_AccountList_Future, null, MCandleTimeType.M1, "", "", nvc); + return (List>)WebConnection.SendWebServer(ExchangeWebReqType.BitgetAccountList_Future, BitgetURL_AccountList_Future, null, MCandleTimeType.M5, "", "", nvc); } public Dictionary CancelFutureOrder(string symbol, string orderId) @@ -947,7 +948,7 @@ namespace BitgetAPI.IndicatorConditionSetup {"ACCESS-TIMESTAMP", timestamp} }; - return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetCancelOrder_Future, BitgetURL_CancelOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc); + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetCancelOrder_Future, BitgetURL_CancelOrder_Future, null, MCandleTimeType.M5, postStr, "", nvc); } public Dictionary ChangeFuturePositionMode(FuturePositionMode mode) @@ -966,7 +967,7 @@ namespace BitgetAPI.IndicatorConditionSetup {"ACCESS-TIMESTAMP", timestamp} }; - return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangePositionMode_Future, BitgetURL_ChangePositionMode_Future, null, MCandleTimeType.M1, postStr, "", nvc); + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangePositionMode_Future, BitgetURL_ChangePositionMode_Future, null, MCandleTimeType.M5, postStr, "", nvc); } public Dictionary GetFutureOrderDetail(string symbol, string orderId) @@ -984,7 +985,7 @@ namespace BitgetAPI.IndicatorConditionSetup {"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); + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrderDetail_Future, BitgetURL_OrderDetail_Future + "?symbol=" + symbol.ToString() + "&orderId=" + orderId.ToString() + "&productType=USDT-FUTURES", null, MCandleTimeType.M5, "", "", orderDetailnvc); } @@ -1037,7 +1038,7 @@ namespace BitgetAPI.IndicatorConditionSetup {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, {"ACCESS-TIMESTAMP", timestamp} }; - var result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeMarginMode_Future, BitgetURL_ChangeMarginMode_Future, null, MCandleTimeType.M1, changeMarginModeStr, "", nvcMargin); + var result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeMarginMode_Future, BitgetURL_ChangeMarginMode_Future, null, MCandleTimeType.M5, changeMarginModeStr, "", nvcMargin); if (result == null || result["msg"]?.ToString() != "success") { return null; @@ -1051,7 +1052,7 @@ namespace BitgetAPI.IndicatorConditionSetup {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, {"ACCESS-TIMESTAMP", timestamp} }; - result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeLeverage_Future, BitgetURL_ChangeLeverage_Future, null, MCandleTimeType.M1, leverageStr, "", nvcLeverage); + result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeLeverage_Future, BitgetURL_ChangeLeverage_Future, null, MCandleTimeType.M5, leverageStr, "", nvcLeverage); if (result == null || result["msg"]?.ToString() != "success") { return null; @@ -1076,7 +1077,7 @@ namespace BitgetAPI.IndicatorConditionSetup {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey }, {"ACCESS-TIMESTAMP", timestamp} }; - return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrder_Future, BitgetURL_BuySellOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc); + return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrder_Future, BitgetURL_BuySellOrder_Future, null, MCandleTimeType.M5, postStr, "", nvc); } public string GenerateSignString(string timestamp, string method, string requestPath, string queryString, string body, string secretKey) diff --git a/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs b/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs index eef5771..fbca86a 100644 --- a/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs +++ b/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs @@ -29,14 +29,28 @@ namespace BitgetApi.IndicatorConditionSetup public class SMABandConditionSetup { private readonly int rangeLookback = 12; - private readonly double rangeThresholdPercent = 0.7; + private double rangeThresholdPercent = 0.7; /// /// false 는 구매 전, true는 판매 후 /// private bool firstCloudFlag = true; + public static double CalculateSMA(List data, int index, int period = 72) + { + var result = 0.0; + for(var i = 0; i candles, SMABandType type, bool flag = false) + + return result / period; + } + + public bool Calculate(List candles, SMABandType type, string market,bool flag = false) { + if (market.Contains("BTC")) + { + rangeThresholdPercent = 0.3; + } + var close = candles.Select(t => t.Close).ToList(); var high = candles.Select(t => t.High).ToList(); @@ -57,6 +71,9 @@ namespace BitgetApi.IndicatorConditionSetup if (close.Count < 100 || high.Count < 100 || low.Count < 100 || open.Count < 100) return false; + double sma72 = CalculateSMA(close, i); + double prevSma72 = CalculateSMA(close, i - 1); + // SMA4 관련 double sma4 = Sma4(close, i); double prevSma4 = Sma4(close, i - 1); @@ -106,14 +123,14 @@ namespace BitgetApi.IndicatorConditionSetup bool redCandle = open[i] > close[i]; // 진입/청산 조건 - bool rawNewLong = sma4 > cloudBottomNow && IsSideways(high, low, i, true) && isSma4AboveCloud && (sma4 == sma4High && prevSma4 <= prevSma4High && prev2Sma4 <= prev2Sma4High) && (sma4 >= prevSma4 && prevSma4 >= prev2Sma4 && prev2Sma4 >= prev3Sma4); + bool rawNewLong = sma4 == sma4High && prevSma4 sma72 && sma4 > cloudTopNow && ichmok.SenkouSpanA > ichmok.SenkouSpanB; // sma4 > cloudBottomNow && IsSideways(high, low, i, true) && isSma4AboveCloud && (sma4 == sma4High && prevSma4 <= prevSma4High && prev2Sma4 <= prev2Sma4High) && (sma4 >= prevSma4 && prevSma4 >= prev2Sma4 && prev2Sma4 >= prev3Sma4); - bool rawLongSell = (sma4 <= prevSma4 && prevSma4 <= prev2Sma4 && sma4 < sma4Middle); + bool rawLongSell = (sma4Middle < sma72 && prevSma4Middle > prevSma72) || (sma4 < cloudBottomNow);// (sma4 <= prevSma4 && prevSma4 <= prev2Sma4 && sma4 < sma4Middle); //cloudFlag && - bool rawNewShort = sma4 < cloudTopNow && IsSideways(high, low, i, false) && isSma4BelowCloud && (sma4 == sma4Low && prevSma4 >= prevSma4Low && prev2Sma4 >= prev2Sma4Low) && (sma4 <= prevSma4 && prevSma4 <= prev2Sma4 && prev2Sma4 <= prev3Sma4); + bool rawNewShort = sma4High < sma72 && prevSma4High > prevSma72;//sma4 < cloudTopNow && IsSideways(high, low, i, false) && isSma4BelowCloud && (sma4 == sma4Low && prevSma4 >= prevSma4Low && prev2Sma4 >= prev2Sma4Low) && (sma4 <= prevSma4 && prevSma4 <= prev2Sma4 && prev2Sma4 <= prev3Sma4); - bool rawShortSell = (sma4 >= prevSma4 && prevSma4 >= prev2Sma4 && sma4 > sma4Middle); + bool rawShortSell = (sma4Middle > sma72 && prevSma4Middle < prevSma72) || (sma4 > cloudTopNow);//(sma4 >= prevSma4 && prevSma4 >= prev2Sma4 && sma4 > sma4Middle); // === 시그널 계산 === if (type == SMABandType.LongBuy)