Files
BitGet_API/Bitget_Server/Application/Indicators/MovingAverageConditionSetup.cs
2026-04-20 20:27:42 +09:00

106 lines
4.3 KiB
C#

using Bitget_Server.Domain.Enums;
using Bitget_Server.Domain.Indicators;
using Bitget_Server.Domain.Models;
namespace Bitget_Server.Application.Indicators;
[Serializable]
public class MovingAverageConditionSetup
{
public MovingAverageType MovingAverageType { get; set; }
// 기간 파라미터 (기존 WinForms와 동일)
public int CandleLength24 { get; set; } = 24;
public int CandleLength48 { get; set; } = 48;
public int CandleLength4 { get; set; } = 4;
public int CandleLength5 { get; set; } = 5;
public int CandleLength2 { get; set; } = 2;
public int CandleLength3 { get; set; } = 3;
public int CandleLength36 { get; set; } = 36;
public int CandleLength72 { get; set; } = 72;
public int CandleLength12 { get; set; } = 12;
public int CandleLength8 { get; set; } = 8;
public int CandleLength144 { get; set; } = 144;
public int CandleLength40 { get; set; } = 40;
public int CandleLength20 { get; set; } = 20;
public int CandleLength120 { get; set; } = 120;
public int CandleLength240 { get; set; } = 240;
public int CandleLength480 { get; set; } = 480;
public int CandleLength80 { get; set; } = 80;
public int CandleLength160 { get; set; } = 160;
public CandlePriceType MACandlePriceType { get; set; }
public void Cal_YHK_Downpublic(List<CandleData> candleDatas, CandleData candleData)
{
var endIndex = candleDatas.Count() - 1;
if (candleData == null) return;
if (candleData.movingAverageDataList == null)
{
candleData.movingAverageDataList = new Dictionary<int, MovingAverageData>
{
{ CandleLength2, new MovingAverageData() },
{ CandleLength4, new MovingAverageData() },
{ CandleLength5, new MovingAverageData() },
{ CandleLength12, new MovingAverageData() },
{ CandleLength24, new MovingAverageData() },
{ CandleLength36, new MovingAverageData() },
{ CandleLength144, new MovingAverageData() },
{ CandleLength40, new MovingAverageData() },
{ CandleLength48, new MovingAverageData() },
{ CandleLength72, new MovingAverageData() },
{ CandleLength3, new MovingAverageData() },
{ CandleLength8, new MovingAverageData() },
{ CandleLength20, new MovingAverageData() },
{ CandleLength80, new MovingAverageData() },
{ CandleLength160, new MovingAverageData() },
{ CandleLength120, new MovingAverageData() },
{ CandleLength240, new MovingAverageData() },
{ CandleLength480, new MovingAverageData() }
};
}
foreach (var item in candleData.movingAverageDataList.ToList())
{
var datas = candleDatas.FindAll(i =>
candleDatas.IndexOf(i) > endIndex - item.Key &&
candleDatas.IndexOf(i) <= endIndex);
candleData.movingAverageDataList[item.Key] = new MovingAverageData();
candleData.movingAverageDataList[item.Key].Value = datas.Sum(i => i.Close) / item.Key;
CalBolangerValue(datas, candleData.movingAverageDataList[item.Key], datas.Count - 1, item.Key);
CalBolangerValue(datas, candleData.movingAverageDataList[item.Key], datas.Count - 1, item.Key);
}
}
// 볼린저 밴드 계산
public void CalBolangerValue(List<CandleData> data, MovingAverageData mvData, int i, int period)
{
double total_average = 0;
if (i < period - 1) return;
for (int t = i - period + 1; t < i; t++)
total_average += data[t].Close;
total_average += data[i].Close;
double average = total_average / period;
double t_Close = 0;
double sum = 0;
double powSum = 0;
int j;
for (j = (i - period + 1); j < i; j++)
{
t_Close += Math.Pow(data[j].Close - average, 2);
sum += data[j].Close;
powSum += Math.Pow(data[j].Close, 2);
}
t_Close += Math.Pow(data[j].Close - average, 2);
mvData.BolangerValue_Down = average - mvData.BolangerSquared * Math.Sqrt(t_Close / period);
mvData.BolangerValue_Up = average + mvData.BolangerSquared * Math.Sqrt(t_Close / period);
mvData.Average = average;
}
}