diff --git a/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs b/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs index 6d4e496..c9270e8 100644 --- a/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs +++ b/BitgetApi/IndicatorConditionSetup/SMABandConditionSetup.cs @@ -34,23 +34,11 @@ namespace BitgetApi.IndicatorConditionSetup /// 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, string market,bool flag = false) + 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(); @@ -75,27 +63,27 @@ namespace BitgetApi.IndicatorConditionSetup double prevSma72 = CalculateSMA(close, i - 1); // SMA4 관련 - double sma4 = Sma4(close, i); - double prevSma4 = Sma4(close, i - 1); - double prev2Sma4 = Sma4(close, i - 2); - double prev3Sma4 = Sma4(close, i - 3); + double sma4 = CalculateSMA(close, i, 4); + double prevSma4 = CalculateSMA(close, i - 1, 4); + double prev2Sma4 = CalculateSMA(close, i - 2, 4); + double prev3Sma4 = CalculateSMA(close, i - 3, 4); // 밴드 계산 - double sma4High = Highest(close, i, 12); - double sma4Middle = SMA(close, i, 12); - double sma4Low = Lowest(close, i, 12); + double sma4High = Highest(close, i, 12, 4); + double sma4Middle = CalculateSMA(close, i, 12); + double sma4Low = Lowest(close, i, 12, 4); - double prevSma4High = Highest(close, i - 1, 12); - double prevSma4Middle = SMA(close, i - 1, 12); - double prevSma4Low = Lowest(close, i - 1, 12); + double prevSma4High = Highest(close, i - 1, 12, 4); + double prevSma4Middle = CalculateSMA(close, i - 1, 12); + double prevSma4Low = Lowest(close, i - 1, 12, 4); - double prev2Sma4High = Highest(close, i - 2, 12); - double prev2Sma4Low = Lowest(close, i - 2, 12); - double prev2Sma4Middle = SMA(close, i - 2, 12); + double prev2Sma4High = Highest(close, i - 2, 12, 4); + double prev2Sma4Low = Lowest(close, i - 2, 12, 4); + double prev2Sma4Middle = CalculateSMA(close, i - 2, 12); - double prev3Sma4High = Highest(close, i - 3, 12); - double prev3Sma4Low = Lowest(close, i - 3, 12); - double prev3Sma4Middle = SMA(close, i - 3, 12); + double prev3Sma4High = Highest(close, i - 3, 12, 4); + double prev3Sma4Low = Lowest(close, i - 3, 12, 4); + double prev3Sma4Middle = CalculateSMA(close, i - 3, 12); var ichmok = GetIchimokuCloud(candles, i - 25); @@ -143,7 +131,7 @@ namespace BitgetApi.IndicatorConditionSetup } else if (type == SMABandType.LongSell) - { + { return rawLongSell; } else if (type == SMABandType.ShortSell) @@ -156,46 +144,54 @@ namespace BitgetApi.IndicatorConditionSetup return false; } - private double Sma4(List list, int index) => - Avg(list[index], list[index - 1], list[index - 2], list[index - 3]); - - private double Avg(params double[] values) => - values.Average(); - - private double SMA(List source, int currentIndex, int period) + public static double CalculateSMA(List data, int index, int period = 72) { - return Enumerable.Range(currentIndex - period + 1, period) - .Select(i => Sma4(source, i)) - .Average(); + var result = 0.0; + for (var i = 0; i < period; i++) + result += data[index - i]; + + + return result / period; } - private double Highest(List source, int currentIndex, int period) + private List GetAvgList(List source, int index, int period, int num) { - return Enumerable.Range(currentIndex - period + 1, period) - .Select(i => Sma4(source, i)) - .Max(); + var list = new List(); + + for (var i = 0; i < period; i++) + { + list.Add(CalculateSMA(source, index - i, num)); + } + + return list; } - private double Lowest(List source, int currentIndex, int period) + private double Highest(List source, int index, int period, int num) { - return Enumerable.Range(currentIndex - period + 1, period) - .Select(i => Sma4(source, i)) - .Min(); + + return GetAvgList(source, index, period, 4).Max(); + + } + + private double Lowest(List source, int index, int period, int num) + { + return GetAvgList(source, index, period, 4).Min(); } private bool IsSideways(List high, List low, int index, bool type) { double highestHigh = high.Skip(index - rangeLookback).Take(rangeLookback + 1).Max(); double lowestLow = low.Skip(index - rangeLookback).Take(rangeLookback + 1).Min(); + // long if (type) - { + { double range = high[index] - lowestLow; return range > (lowestLow * rangeThresholdPercent / 100.0) && highestHigh == high[index]; } //short else - { + { double range = highestHigh - low[index]; return range > (highestHigh * rangeThresholdPercent / 100.0) && lowestLow == low[index]; @@ -206,8 +202,8 @@ namespace BitgetApi.IndicatorConditionSetup { var highs = candles.Select(t => t.High).ToList(); var lows = candles.Select(t => t.Low).ToList(); - var closes = candles.Select(t => t.Close).ToList(); - + var closes = candles.Select(t => t.Close).ToList(); + var result = new IchimokuResult(); double tenkan = 0; @@ -253,7 +249,7 @@ namespace BitgetApi.IndicatorConditionSetup SenkouSpanB = senkouB, ChikouSpan = chikou }; - + } } }