92 lines
3.6 KiB
C#
92 lines
3.6 KiB
C#
using Bitget_Server.Domain.Indicators;
|
|
using Bitget_Server.Domain.Models;
|
|
|
|
namespace Bitget_Server.Application.Indicators;
|
|
|
|
[Serializable]
|
|
public class IchimokuConditionSetup
|
|
{
|
|
/// <summary>기준선 기간</summary>
|
|
public int BaselinePeriod { get; set; } = 26;
|
|
/// <summary>전환선 기간</summary>
|
|
public int ConversionPeriod { get; set; } = 9;
|
|
/// <summary>선행스팬2 기간</summary>
|
|
public int LaggingSpan2Period { get; set; } = 52;
|
|
/// <summary>Shift</summary>
|
|
public int Displacement { get; set; } = 26;
|
|
|
|
// 캔들당 일목균형표 계산하기
|
|
public void calIchimokuData(List<CandleData> 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;
|
|
}
|
|
}
|