2024-05-29 17:37:10 +09:00
|
|
|
|
|
2024-06-19 12:51:35 +09:00
|
|
|
|
using BitgetApi.Data;
|
2024-06-14 16:49:57 +09:00
|
|
|
|
using BitgetAPI.Data;
|
|
|
|
|
|
using BitgetAPI.Data.IndicatorData;
|
2024-05-29 17:37:10 +09:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
namespace BitgetAPI.IndicatorConditionSetup
|
|
|
|
|
|
{
|
|
|
|
|
|
[Serializable]
|
2024-11-07 11:06:50 +09:00
|
|
|
|
public class MovingAverageConditionSetup
|
2024-05-29 17:37:10 +09:00
|
|
|
|
{
|
|
|
|
|
|
// 지표 기본 값 설정
|
|
|
|
|
|
// 이동 평균선 종류
|
|
|
|
|
|
public CommonProperty.MovingAverageType MovingAverageType { get; set; }
|
|
|
|
|
|
// 기간
|
2024-11-07 11:06:50 +09:00
|
|
|
|
public int CandleLength24 { get; set; } = 24;
|
|
|
|
|
|
public int CandleLength48 { get; set; } = 48;
|
2024-06-14 16:49:57 +09:00
|
|
|
|
// 기간
|
2024-11-07 11:06:50 +09:00
|
|
|
|
public int CandleLength4 { get; set; } = 4;
|
2024-06-14 16:49:57 +09:00
|
|
|
|
// 기간
|
2024-11-07 11:06:50 +09:00
|
|
|
|
public int CandleLength72 { get; set; } = 72;
|
2024-06-19 12:51:35 +09:00
|
|
|
|
// 기간
|
2024-11-07 11:06:50 +09:00
|
|
|
|
public int CandleLength12 { get; set; } = 12;
|
|
|
|
|
|
// 기간
|
|
|
|
|
|
public int CandleLength8 { get; set; } = 8;
|
2024-06-19 12:51:35 +09:00
|
|
|
|
|
2024-05-29 17:37:10 +09:00
|
|
|
|
// 가격
|
2024-11-07 11:06:50 +09:00
|
|
|
|
public CommonProperty.CandlePriceType MACandlePriceType { get; set; }
|
2024-06-14 16:49:57 +09:00
|
|
|
|
|
|
|
|
|
|
// 추후 업데이트 된것을 계산 안하는거 고려 !!!!
|
|
|
|
|
|
public void Cal_YHK_Downpublic(List<CandleData> candleDatas, CandleData candleData)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 현재 종가 인덱스
|
|
|
|
|
|
var endIndex = candleDatas.Count() - 1;
|
|
|
|
|
|
|
|
|
|
|
|
if (candleData == null) return;
|
|
|
|
|
|
|
|
|
|
|
|
// Moving 없으면 생성
|
2024-06-14 19:18:54 +09:00
|
|
|
|
if (candleData.movingAverageDataList == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
candleData.movingAverageDataList = new Dictionary<int, MovingAverageData>();
|
2024-06-14 16:49:57 +09:00
|
|
|
|
|
2024-11-07 11:06:50 +09:00
|
|
|
|
candleData.movingAverageDataList.Add(CandleLength4, new MovingAverageData());
|
|
|
|
|
|
candleData.movingAverageDataList.Add(CandleLength12, new MovingAverageData());
|
|
|
|
|
|
candleData.movingAverageDataList.Add(CandleLength24, new MovingAverageData());
|
|
|
|
|
|
candleData.movingAverageDataList.Add(CandleLength48, new MovingAverageData());
|
|
|
|
|
|
candleData.movingAverageDataList.Add(CandleLength72, new MovingAverageData());
|
|
|
|
|
|
candleData.movingAverageDataList.Add(CandleLength8, new MovingAverageData());
|
2024-06-14 19:18:54 +09:00
|
|
|
|
}
|
2024-06-14 16:49:57 +09:00
|
|
|
|
|
2024-06-14 19:18:54 +09:00
|
|
|
|
foreach(var item in candleData.movingAverageDataList.ToList())
|
2024-06-14 16:49:57 +09:00
|
|
|
|
{
|
|
|
|
|
|
// 전봉까지 만듬
|
|
|
|
|
|
var datas = candleDatas.FindAll(i =>
|
|
|
|
|
|
candleDatas.IndexOf(i) > endIndex - item.Key &&
|
|
|
|
|
|
candleDatas.IndexOf(i) <= endIndex);
|
|
|
|
|
|
|
|
|
|
|
|
candleData.movingAverageDataList[item.Key] = new MovingAverageData();
|
2024-06-14 19:18:54 +09:00
|
|
|
|
candleData.movingAverageDataList[item.Key].Value = datas.Sum(i => i.Close) / item.Key;
|
2024-06-19 12:51:35 +09:00
|
|
|
|
CalBolangerValue(datas, candleData.movingAverageDataList[item.Key], datas.Count - 1, item.Key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//볼랜저 계산
|
|
|
|
|
|
public void CalBolangerValue(List<CandleData> data, MovingAverageData mvData, int i, int period)
|
|
|
|
|
|
{
|
|
|
|
|
|
double total_average = 0;
|
|
|
|
|
|
if (i < period - 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
2024-06-14 16:49:57 +09:00
|
|
|
|
}
|
2024-06-19 12:51:35 +09:00
|
|
|
|
for (int t = i - period + 1; t < i; t++)
|
|
|
|
|
|
{
|
|
|
|
|
|
total_average += data[t].Close;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
total_average += data[i].Close;
|
|
|
|
|
|
|
|
|
|
|
|
double average = total_average / period;
|
|
|
|
|
|
double t_Close = 0;
|
|
|
|
|
|
|
|
|
|
|
|
//오버렙 값 구하기 위한 변수
|
|
|
|
|
|
double sum = 0;
|
|
|
|
|
|
double powSum = 0;
|
|
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
|
for (j = (i - period + 1); j < i; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
t_Close += Math.Pow(data[j].Close - average, 2);
|
|
|
|
|
|
sum += data[j].Close;
|
|
|
|
|
|
powSum += Math.Pow(data[j].Close, 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
t_Close += Math.Pow(data[j].Close - average, 2);
|
|
|
|
|
|
|
|
|
|
|
|
//하향선
|
|
|
|
|
|
if (mvData.BolangerType == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
mvData.BolangerValue = average - mvData.BolangerSquared * Math.Sqrt(t_Close / period);
|
|
|
|
|
|
}
|
|
|
|
|
|
//상향선
|
|
|
|
|
|
else if (mvData.BolangerType == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
mvData.BolangerValue = average + mvData.BolangerSquared * Math.Sqrt(t_Close / period);
|
|
|
|
|
|
}
|
|
|
|
|
|
//기준선
|
|
|
|
|
|
else if (mvData.BolangerType == 2)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
mvData.BolangerValue = average;
|
|
|
|
|
|
}
|
2024-06-14 16:49:57 +09:00
|
|
|
|
}
|
2024-05-29 17:37:10 +09:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|