using BitgetAPI.Data; using BitgetAPI.Data.IndicatorData; using DevExpress.Utils.Extensions; using Million.Data; using Million.Manager; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BitgetAPI.IndicatorConditionSetup { [Serializable] public class IchimokuConditionSetup { // 지표 기본 값 설정 /// /// 기준선 /// public int BaselinePeriod { get; set; } /// /// 전환선 /// public int ConversionPeriod { get; set; } /// /// 선행스팬2 /// public int LaggingSpan2Period { get; set; } /// /// Shift /// public int Displacement { get; set; } // 기준선 설정z public CommonProperty.Indicator_IchmokuOverLine IndicatorIchmokuOverLine { get; set; } public void GetIchmokuData(List candleDatas) { /* * 전환선 : (과거 n일간의 최고가 + 과거 n일간의 최저가) / 2 기준선 : (과거 m일간의 최고가 + 과거 m일간의 최저가) / 2 후행스팬 : 금일 종가를 ℓ일 전에 기입 선행스팬1 : (금일 전환선 + 금일 기준선) / 2한 값을 ℓ일 후에 기입 선행스팬2 : (과거 k일간의 최고가 + 과거 k일간의 최저가) /2한 값을 ℓ일 후에 기입 */ // 현재 종가 인덱스 var endIndex = candleDatas.Count - 1; var 한봉전까지Index = endIndex - 1; // 현재 시간 캔들 var nowCandle = candleDatas[endIndex]; // Ichimok 없으면 생성 if (nowCandle.IchimokData == null) nowCandle.IchimokData = new IchimokData(); // 현재 종가 var endValue = nowCandle.Close; // 전봉까지 만듬 var datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) >= 한봉전까지Index - ConversionPeriod && candleDatas.IndexOf(i) <= 한봉전까지Index); if (datas == null) return; // 전환선 nowCandle.IchimokData.전환선 = (datas.Min(i => i.Low) + datas.Min(i => i.High)) / 2; datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) >= 한봉전까지Index - BaselinePeriod && candleDatas.IndexOf(i) <= 한봉전까지Index); // 기준선 nowCandle.IchimokData.기준선 = (datas.Min(i => i.Low) + datas.Min(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 : 26 일전봉 데이터 가져오기 endIndex = endIndex - Displacement; 한봉전까지Index = 한봉전까지Index - Displacement; datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) >= 한봉전까지Index - ConversionPeriod && candleDatas.IndexOf(i) <= 한봉전까지Index); if (datas == null) return; // 전환선 var displacement_전환선 = (datas.Min(i => i.Low) + datas.Min(i => i.High)) / 2; datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) >= 한봉전까지Index - BaselinePeriod && candleDatas.IndexOf(i) <= 한봉전까지Index); if (datas == null) return; // 기준선 var displacement_기준선 = (datas.Min(i => i.Low) + datas.Min(i => i.High)) / 2; nowCandle.IchimokData.선행스팬1 = (displacement_전환선 + displacement_기준선) / 2; // 선행스팬 2 datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) >= 한봉전까지Index - LaggingSpan2Period && candleDatas.IndexOf(i) <= 한봉전까지Index); nowCandle.IchimokData.선행스팬2 = (datas.Min(i => i.Low) + datas.Min(i => i.High)) / 2; } } }