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 candleDatas, CandleData candleData) { var endIndex = candleDatas.Count() - 1; if (candleData == null) return; if (candleData.movingAverageDataList == null) { candleData.movingAverageDataList = new Dictionary { { 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 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; } }