using BitgetAPI.Data; using BitgetAPI.Data.IndicatorData; using DevExpress.Utils.Extensions; 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; } = 26; /// /// 전환선 /// public int ConversionPeriod { get; set; } = 9; /// /// 선행스팬2 /// public int LaggingSpan2Period { get; set; } = 52; /// /// Shift /// public int Displacement { get; set; } = 26; // 기준선 설정z public CommonProperty.Indicator_IchmokuOverLine IndicatorIchmokuOverLine { get; set; } // 캔들당 일목균형표 계산하기 public void calIchimokuData(List candleDatas, CandleData candleData) { // 현재 종가 인덱스 var endIndex = candleDatas.Count() - 1; // Ichimok 없으면 생성 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) 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 : 26 일전봉 데이터 가져오기 endIndex = endIndex - Displacement; datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) > endIndex - ConversionPeriod && candleDatas.IndexOf(i) <= endIndex); if (datas == null) return; // 전환선 : 26일 전봉 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) return; // 기준선 : 26일 전봉 var displacement_기준선 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2; // 선행스팬 1 candleData.IchimokData.선행스팬1 = (displacement_전환선 + displacement_기준선) / 2; datas = candleDatas.FindAll(i => candleDatas.IndexOf(i) > endIndex - LaggingSpan2Period && candleDatas.IndexOf(i) <= endIndex); // 선행스팬 2 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); if (candleData.IchimokData.상한선 < candleData.Close) candleData.IchimokData.IsLongUp = true; else candleData.IchimokData.IsLongUp = false; if (candleData.IchimokData.하한선 > candleData.Close) candleData.IchimokData.IsShortDown = true; else candleData.IchimokData.IsShortDown = false; if (candleData.IchimokData.상한선 > candleData.Close) candleData.IchimokData.IsLongDown = true; else candleData.IchimokData.IsLongDown = false; if (candleData.IchimokData.하한선 < candleData.Close) candleData.IchimokData.IsShortUp = true; else candleData.IchimokData.IsShortUp = false; } } }