139 lines
4.4 KiB
C#
139 lines
4.4 KiB
C#
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
|
|
{
|
|
|
|
// 지표 기본 값 설정
|
|
/// <summary>
|
|
/// 기준선
|
|
/// </summary>
|
|
public int BaselinePeriod { get; set; }
|
|
|
|
/// <summary>
|
|
/// 전환선
|
|
/// </summary>
|
|
public int ConversionPeriod { get; set; }
|
|
|
|
/// <summary>
|
|
/// 선행스팬2
|
|
/// </summary>
|
|
public int LaggingSpan2Period { get; set; }
|
|
|
|
/// <summary>
|
|
/// Shift
|
|
/// </summary>
|
|
public int Displacement { get; set; }
|
|
|
|
// 기준선 설정z
|
|
public CommonProperty.Indicator_IchmokuOverLine IndicatorIchmokuOverLine { get; set; }
|
|
|
|
public void GetIchmokuData(List<CandleData> 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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
}
|