Files
BitGet_API/BitgetApi/IndicatorConditionSetup/IchimokuConditionSetup.cs

128 lines
4.7 KiB
C#
Raw Normal View History

2024-05-29 17:37:10 +09:00
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
{
// 지표 기본 값 설정
/// <summary>
/// 기준선
/// </summary>
2024-06-02 22:24:23 +09:00
public int BaselinePeriod { get; set; } = 26;
2024-05-29 17:37:10 +09:00
/// <summary>
/// 전환선
/// </summary>
2024-06-02 22:24:23 +09:00
public int ConversionPeriod { get; set; } = 9;
2024-05-29 17:37:10 +09:00
/// <summary>
/// 선행스팬2
/// </summary>
2024-06-02 22:24:23 +09:00
public int LaggingSpan2Period { get; set; } = 52;
2024-05-29 17:37:10 +09:00
/// <summary>
/// Shift
/// </summary>
2024-06-02 22:24:23 +09:00
public int Displacement { get; set; } = 26;
2024-05-29 17:37:10 +09:00
2024-06-02 22:24:23 +09:00
// 캔들당 일목균형표 계산하기
public void calIchimokuData(List<CandleData> candleDatas, CandleData candleData)
2024-05-29 17:37:10 +09:00
{
2024-05-30 00:35:38 +09:00
// 현재 종가 인덱스
2024-06-02 22:24:23 +09:00
var endIndex = candleDatas.Count() - 1;
2024-05-30 00:35:38 +09:00
if (candleData == null) return;
2024-05-30 00:35:38 +09:00
// Ichimok 없으면 생성
2024-06-02 22:24:23 +09:00
if (candleData.IchimokData == null) candleData.IchimokData = new IchimokData();
2024-05-29 17:37:10 +09:00
// 현재 종가
2024-06-02 22:24:23 +09:00
var endValue = candleData.Close;
2024-05-29 17:37:10 +09:00
// 전봉까지 만듬
var datas = candleDatas.FindAll(i =>
2024-06-02 22:24:23 +09:00
candleDatas.IndexOf(i) > endIndex - ConversionPeriod &&
candleDatas.IndexOf(i) <= endIndex);
2024-05-29 17:37:10 +09:00
if (datas == null || datas.Count == 0) return;
2024-05-30 00:35:38 +09:00
2024-05-29 17:37:10 +09:00
// 전환선
2024-06-02 22:24:23 +09:00
candleData.IchimokData.전환선 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2;
2024-05-29 17:37:10 +09:00
datas = candleDatas.FindAll(i =>
2024-06-02 22:24:23 +09:00
candleDatas.IndexOf(i) > endIndex - BaselinePeriod &&
candleDatas.IndexOf(i) <= endIndex);
2024-05-29 17:37:10 +09:00
// 기준선
2024-06-02 22:24:23 +09:00
candleData.IchimokData.기준선 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2;
2024-05-29 17:37:10 +09:00
// 후행스팬
2024-05-30 00:35:38 +09:00
if (endIndex - Displacement >= 0)
{
2024-06-02 22:24:23 +09:00
if (candleDatas[candleDatas.Count - Displacement].IchimokData == null)
2024-05-30 00:35:38 +09:00
{
candleDatas[candleDatas.Count - Displacement].IchimokData = new IchimokData();
}
2024-05-29 17:37:10 +09:00
candleDatas[candleDatas.Count - Displacement].IchimokData.후행스팬 = endValue;
2024-05-30 00:35:38 +09:00
}
2024-05-29 17:37:10 +09:00
2024-05-30 00:35:38 +09:00
// Displacement : 26 일전봉 데이터 가져오기
2024-06-03 19:01:51 +09:00
endIndex = candleDatas.Count-1;
endIndex = endIndex - Displacement +1;
2024-05-29 17:37:10 +09:00
2024-05-30 00:35:38 +09:00
datas = candleDatas.FindAll(i =>
2024-06-02 22:24:23 +09:00
candleDatas.IndexOf(i) > endIndex - ConversionPeriod &&
candleDatas.IndexOf(i) <= endIndex);
2024-05-30 00:35:38 +09:00
if (datas == null || datas.Count == 0) return;
2024-05-30 00:35:38 +09:00
2024-06-02 17:21:39 +09:00
// 전환선 : 26일 전봉
2024-06-02 22:24:23 +09:00
var displacement_전환선 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2;
2024-05-30 00:35:38 +09:00
datas = candleDatas.FindAll(i =>
2024-06-02 22:24:23 +09:00
candleDatas.IndexOf(i) > endIndex - BaselinePeriod &&
candleDatas.IndexOf(i) <= endIndex);
2024-05-30 00:35:38 +09:00
if (datas == null || datas.Count == 0) return;
2024-05-30 00:35:38 +09:00
2024-06-02 17:21:39 +09:00
// 기준선 : 26일 전봉
2024-06-02 22:24:23 +09:00
var displacement_기준선 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2;
2024-05-30 00:35:38 +09:00
2024-06-02 17:21:39 +09:00
// 선행스팬 1
2024-06-02 22:24:23 +09:00
candleData.IchimokData.선행스팬1 =
2024-05-30 00:35:38 +09:00
(displacement_전환선 + displacement_기준선) / 2;
datas = candleDatas.FindAll(i =>
2024-06-02 22:24:23 +09:00
candleDatas.IndexOf(i) > endIndex - LaggingSpan2Period &&
candleDatas.IndexOf(i) <= endIndex);
2024-05-29 17:37:10 +09:00
2024-06-02 17:21:39 +09:00
// 선행스팬 2
2024-06-02 22:24:23 +09:00
candleData.IchimokData.선행스팬2 = (datas.Min(i => i.Low) + datas.Max(i => i.High)) / 2;
2024-05-29 17:37:10 +09:00
2024-06-02 17:21:39 +09:00
// 일목균형표 (전봉데이터)
2024-06-02 22:24:23 +09:00
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;
2024-05-29 17:37:10 +09:00
}
}
}