chat gpt 이상해서 내가 계산 함
This commit is contained in:
@@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user