chat gpt 이상해서 내가 계산 함

This commit is contained in:
kyh
2025-06-19 12:16:35 +09:00
parent b2813cc62c
commit 98c5eb598c

View File

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