using Bitget_Server.Domain.Indicators; using Bitget_Server.Domain.Models; namespace Bitget_Server.Application.Indicators; [Serializable] public class IchimokuConditionSetup { /// 기준선 기간 public int BaselinePeriod { get; set; } = 26; /// 전환선 기간 public int ConversionPeriod { get; set; } = 9; /// 선행스팬2 기간 public int LaggingSpan2Period { get; set; } = 52; /// Shift public int Displacement { get; set; } = 26; // 캔들당 일목균형표 계산하기 public void calIchimokuData(List candleDatas, CandleData candleData) { // 현재 종가 인덱스 var endIndex = candleDatas.Count() - 1; if (candleData == null) return; if (candleData.IchimokData == null) candleData.IchimokData = new IchimokData(); var endValue = candleData.Close; // 전봉까지 만듬 var datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) > endIndex - ConversionPeriod && candleDatas.IndexOf(i) <= endIndex); if (datas == null || datas.Count == 0) return; candleData.IchimokData.전환선 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2; datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) > endIndex - BaselinePeriod && candleDatas.IndexOf(i) <= endIndex); candleData.IchimokData.기준선 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2; // 후행스팬 if (endIndex - Displacement >= 0) { if (candleDatas[candleDatas.Count - Displacement].IchimokData == null) { candleDatas[candleDatas.Count - Displacement].IchimokData = new IchimokData(); } candleDatas[candleDatas.Count - Displacement].IchimokData.후행스팬 = endValue; } // Displacement 일전봉 데이터 endIndex = candleDatas.Count - 1; endIndex = endIndex - Displacement + 1; datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) > endIndex - ConversionPeriod && candleDatas.IndexOf(i) <= endIndex); if (datas == null || datas.Count == 0) return; var displacement_전환선 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2; datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) > endIndex - BaselinePeriod && candleDatas.IndexOf(i) <= endIndex); if (datas == null || datas.Count == 0) return; var displacement_기준선 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2; candleData.IchimokData.선행스팬1 = (displacement_전환선 + displacement_기준선) / 2; datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) > endIndex - LaggingSpan2Period && candleDatas.IndexOf(i) <= endIndex); candleData.IchimokData.선행스팬2 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2; candleData.IchimokData.상한선 = Math.Max(candleData.IchimokData.선행스팬1, candleData.IchimokData.선행스팬2); candleData.IchimokData.하한선 = Math.Min(candleData.IchimokData.선행스팬1, candleData.IchimokData.선행스팬2); candleData.IchimokData.IsLongUp = candleData.IchimokData.상한선 < candleData.Close; candleData.IchimokData.IsShortDown = candleData.IchimokData.하한선 > candleData.Close; candleData.IchimokData.IsLongDown = candleData.IchimokData.상한선 > candleData.Close; candleData.IchimokData.IsShortUp = candleData.IchimokData.하한선 < candleData.Close; } }