buyer에 여러 MCandleTimeType호환 되도록 수정 중

This commit is contained in:
kyh
2023-05-17 15:31:55 +09:00
parent 3f000635f5
commit dd264b0cc5
2 changed files with 242 additions and 169 deletions

View File

@@ -1,4 +1,5 @@
using Million.Data;
using Million.Data.Upbit;
using Million.DbManagement;
using Million.IndicatorConditionSetup;
using System;
@@ -399,9 +400,49 @@ namespace Million.Manager
recentlyData.HighValue = recentlyData.HighValue < candleData.HighValue ? candleData.HighValue : recentlyData.HighValue;
recentlyData.LowValue = recentlyData.LowValue < candleData.LowValue ? recentlyData.LowValue : candleData.LowValue;
recentlyData.EndValue = candleData.EndValue;
recentlyData.RecentlyDataFlag = true;
recentlyData.MoneyVolume += candleData.MoneyVolume;
return recentlyData;
}
}
/// <summary>
/// Tick List를
/// </summary>
/// <param name="tickList"></param>
/// <returns></returns>
public static List<CandleData> GetOneMinuteCandleDataFromTickList(List<Ticker> tickList)
{
var returnData = new List<CandleData>();
var dateTimeList = tickList.Select(t => t.DateTime.Minute).Distinct().ToList();
foreach (var item in dateTimeList)
{
var list = tickList.Where(t => t.DateTime.Minute == item).ToList();
if (list.Count > 0)
{
var valueList = list.Select(t => t.TradePrice).ToList();
var startValue = list[0].TradePrice;
var endValue = list[list.Count - 1].TradePrice;
var highValue = valueList.Max();
var lowValue = valueList.Min();
var candle = new CandleData();
candle.DateTime = list[0].DateTime;
candle.DateTime.AddSeconds(candle.DateTime.Second * -1);
candle.CandleTimeType = 1;
candle.StartValue = startValue;
candle.HighValue = highValue;
candle.LowValue = lowValue;
candle.RecentlyDataFlag = true;
candle.EndValue = endValue;
returnData.Add(candle);
}
}
return returnData;
}
}
}

View File

@@ -234,179 +234,210 @@ namespace Million.Manager
tickList = cloneTickList.Where(t => t.CoinFullName == coinFullName).OrderBy(t=>t.DateTime).ToList();
// 호출 당시 시, 분, 초
var callH = basicDateTime.Hour;
var callM = basicDateTime.Minute;
var callS = basicDateTime.Second;
try
#region 여러 Type 다 호환 되도록 새로 구성
/*
* 1. Tick -> 1분봉으로 모두 변환(시가는 제일 작은거로 처리
* 2. 기존에 가지고 있는 봉 마지막꺼를 포함한 모든 데이터를 가지고 GetConvertCandleDataList로 처리
* 3. 마지막 봉삭제 후 모두 Addrange
* 4. 이후 300개 이상일 경우 삭제 처리
*/
var returnList = DataManager.GetOneMinuteCandleDataFromTickList(tickList);
if(item.CandleDataLists_Im.Count > 0)
{
if (type == MCandleTimeType.M1)
{
var equalMinuteList = tickList.Where(t => t.DateTime.Minute == callM).ToList();
//해당 분 고가
if (equalMinuteList.Count != 0)
{
var equalListM = equalMinuteList.Select(t => t.TradePrice).ToList();
double equalListMax = 0;
if (equalListM.Count != 0)
{
equalListMax = equalListM.Max();
}
//해당 분 저가
var equalListL = equalMinuteList.Select(t => t.TradePrice).ToList();
double equalListMin = 0;
if (equalListL.Count != 0)
{
equalListMin = equalListL.Min();
}
if (item.CandleDataLists_Im.Count != 0)
{
if (item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].HighValue < equalListMax && equalListMax != 0)
item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].HighValue = equalListMax;
if (item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].LowValue > equalListMin && equalListMin != 0)
item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].LowValue = equalListMin;
item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].RecentlyDataFlag = true;
item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].EndValue = equalMinuteList[equalMinuteList.Count - 1].TradePrice;
}
else
{
var candle = new CandleData();
candle.CandleTimeType = (int)MCandleTimeType.M1;
candle.StartValue = equalMinuteList[0].TradePrice;
candle.HighValue = equalListMax;
candle.LowValue = equalListMin;
candle.RecentlyDataFlag = true;
candle.EndValue = equalMinuteList[equalMinuteList.Count - 1].TradePrice;
var date = basicDateTime.AddMinutes(1);
date = date.AddSeconds(-1 * callS);
candle.DateTime = date;
if (item.CandleDataLists_Im.Count > 300)
item.CandleDataLists_Im.RemoveRange(0, item.CandleDataLists_Im.Count - 300);
item.CandleDataLists_Im.Add(candle);
}
}
var list = tickList.Where(t => t.DateTime > basicDateTime && t.DateTime.Minute != basicDateTime.Minute).ToList();
if (list.Count > 0)
{
// 데이터 가져올떄 1분 이상 걸릴 시 처리할 데이터
var minList = list.Select(t => t.DateTime.Minute).Distinct().ToList();
minList.Sort();
foreach (var min in minList)
{
var equalList = list.Where(t => t.DateTime.Minute == min).OrderBy(t => t.DateTime).ToList();
//해당 분 고가
var max = equalList.Select(t => t.TradePrice).ToList().Max();
//해당 분 저가
var low = equalList.Select(t => t.TradePrice).ToList().Min();
var candle = new CandleData();
candle.CandleTimeType = (int)MCandleTimeType.M1;
candle.StartValue = equalList[0].TradePrice;
candle.HighValue = max;
candle.LowValue = low;
candle.RecentlyDataFlag = true;
candle.EndValue = equalList[equalList.Count - 1].TradePrice;
var intervalMin = min - callM;
var date = basicDateTime.AddMinutes(intervalMin);
if(intervalMin < 0) date = date.AddHours(1);
date = date.AddSeconds(-1 * callS);
candle.DateTime = date;
if (item.CandleDataLists_Im.Count > 300)
item.CandleDataLists_Im.RemoveRange(0, item.CandleDataLists_Im.Count - 300);
item.CandleDataLists_Im.Add(candle);
}
}
}
else if (type == MCandleTimeType.H1)
{
var equalHourList = tickList.Where(t => t.DateTime.Hour == callH).ToList();
if (equalHourList.Count != 0)
{
var equalListM = equalHourList.Select(t => t.TradePrice).ToList();
double equalListMax = 0;
if (equalListM.Count != 0)
{
equalListMax = equalListM.Max();
}
//해당 분 저가
var equalListL = equalHourList.Select(t => t.TradePrice).ToList();
double equalListMin = 0;
if (equalListL.Count != 0)
{
equalListMin = equalListL.Min();
}
if (item.CandleDataLists_Im.Count > 0)
{
if (item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].HighValue < equalListMax && equalListMax != 0)
item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].HighValue = equalListMax;
if (item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].LowValue > equalListMin && equalListMin != 0)
item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].LowValue = equalListMin;
item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].RecentlyDataFlag = true;
item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].EndValue = equalHourList[equalHourList.Count - 1].TradePrice;
}
else
{
var candle = new CandleData();
candle.CandleTimeType = (int)MCandleTimeType.H1;
candle.StartValue = equalHourList[0].TradePrice;
candle.HighValue = equalListMax;
candle.LowValue = equalListMin;
candle.RecentlyDataFlag = true;
candle.EndValue = equalHourList[equalHourList.Count - 1].TradePrice;
var date = basicDateTime.AddHours(1);
date = date.AddMinutes(-1 * callM);
date = date.AddSeconds(-1 * callS);
candle.DateTime = date;
if (item.CandleDataLists_Im.Count > 300)
item.CandleDataLists_Im.RemoveRange(0, 100);
item.CandleDataLists_Im.Add(candle);
}
}
var list = tickList.Where(t => t.DateTime > basicDateTime && t.DateTime.Hour != basicDateTime.Hour).ToList();
if (list.Count > 0)
{
//해당 분 고가
var max = list.Select(t => t.TradePrice).ToList().Max();
//해당 분 저가
var low = list.Select(t => t.TradePrice).ToList().Min();
var candle = new CandleData();
candle.CandleTimeType = (int)MCandleTimeType.H1;
candle.StartValue = list[0].TradePrice;
candle.HighValue = max;
candle.LowValue = low;
candle.RecentlyDataFlag = true;
candle.EndValue = list[list.Count - 1].TradePrice;
var date = basicDateTime.AddHours(1);
date = date.AddMinutes(-1 * callM);
date = date.AddSeconds(-1 * callS);
candle.DateTime = date;
if (item.CandleDataLists_Im.Count > 300)
item.CandleDataLists_Im.RemoveRange(0, 100);
item.CandleDataLists_Im.Add(candle);
}
}
var lastData = item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1];
returnList.Insert(0, lastData);
}
catch (Exception e)
var dataList = DataManager.GetConvertCandleDataList(returnList, type);
if (item.CandleDataLists_Im.Count > 0)
{
throw;
item.CandleDataLists_Im.Remove(item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1]);
}
item.CandleDataLists_Im.AddRange(dataList);
if(item.CandleDataLists_Im.Count > 150)
{
item.CandleDataLists_Im.RemoveRange(0, item.CandleDataLists_Im.Count - 150);
}
#endregion
#region 옛날 소스
//// 호출 당시 시, 분, 초
//var callH = basicDateTime.Hour;
//var callM = basicDateTime.Minute;
//var callS = basicDateTime.Second;
//try
//{
// if (type == MCandleTimeType.M1)
// {
// var equalMinuteList = tickList.Where(t => t.DateTime.Minute == callM).ToList();
// //해당 분 고가
// if (equalMinuteList.Count != 0)
// {
// var equalListM = equalMinuteList.Select(t => t.TradePrice).ToList();
// double equalListMax = 0;
// if (equalListM.Count != 0)
// {
// equalListMax = equalListM.Max();
// }
// //해당 분 저가
// var equalListL = equalMinuteList.Select(t => t.TradePrice).ToList();
// double equalListMin = 0;
// if (equalListL.Count != 0)
// {
// equalListMin = equalListL.Min();
// }
// if (item.CandleDataLists_Im.Count != 0)
// {
// if (item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].HighValue < equalListMax && equalListMax != 0)
// item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].HighValue = equalListMax;
// if (item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].LowValue > equalListMin && equalListMin != 0)
// item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].LowValue = equalListMin;
// item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].RecentlyDataFlag = true;
// item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].EndValue = equalMinuteList[equalMinuteList.Count - 1].TradePrice;
// }
// else
// {
// var candle = new CandleData();
// candle.CandleTimeType = (int)MCandleTimeType.M1;
// candle.StartValue = equalMinuteList[0].TradePrice;
// candle.HighValue = equalListMax;
// candle.LowValue = equalListMin;
// candle.RecentlyDataFlag = true;
// candle.EndValue = equalMinuteList[equalMinuteList.Count - 1].TradePrice;
// var date = basicDateTime.AddMinutes(1);
// date = date.AddSeconds(-1 * callS);
// candle.DateTime = date;
// if (item.CandleDataLists_Im.Count > 300)
// item.CandleDataLists_Im.RemoveRange(0, item.CandleDataLists_Im.Count - 300);
// item.CandleDataLists_Im.Add(candle);
// }
// }
// var list = tickList.Where(t => t.DateTime > basicDateTime && t.DateTime.Minute != basicDateTime.Minute).ToList();
// if (list.Count > 0)
// {
// // 데이터 가져올떄 1분 이상 걸릴 시 처리할 데이터
// var minList = list.Select(t => t.DateTime.Minute).Distinct().ToList();
// minList.Sort();
// foreach (var min in minList)
// {
// var equalList = list.Where(t => t.DateTime.Minute == min).OrderBy(t => t.DateTime).ToList();
// //해당 분 고가
// var max = equalList.Select(t => t.TradePrice).ToList().Max();
// //해당 분 저가
// var low = equalList.Select(t => t.TradePrice).ToList().Min();
// var candle = new CandleData();
// candle.CandleTimeType = (int)MCandleTimeType.M1;
// candle.StartValue = equalList[0].TradePrice;
// candle.HighValue = max;
// candle.LowValue = low;
// candle.RecentlyDataFlag = true;
// candle.EndValue = equalList[equalList.Count - 1].TradePrice;
// var intervalMin = min - callM;
// var date = basicDateTime.AddMinutes(intervalMin);
// if(intervalMin < 0) date = date.AddHours(1);
// date = date.AddSeconds(-1 * callS);
// candle.DateTime = date;
// if (item.CandleDataLists_Im.Count > 300)
// item.CandleDataLists_Im.RemoveRange(0, item.CandleDataLists_Im.Count - 300);
// item.CandleDataLists_Im.Add(candle);
// }
// }
// }
// else if (type == MCandleTimeType.H1)
// {
// var equalHourList = tickList.Where(t => t.DateTime.Hour == callH).ToList();
// if (equalHourList.Count != 0)
// {
// var equalListM = equalHourList.Select(t => t.TradePrice).ToList();
// double equalListMax = 0;
// if (equalListM.Count != 0)
// {
// equalListMax = equalListM.Max();
// }
// //해당 분 저가
// var equalListL = equalHourList.Select(t => t.TradePrice).ToList();
// double equalListMin = 0;
// if (equalListL.Count != 0)
// {
// equalListMin = equalListL.Min();
// }
// if (item.CandleDataLists_Im.Count > 0)
// {
// if (item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].HighValue < equalListMax && equalListMax != 0)
// item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].HighValue = equalListMax;
// if (item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].LowValue > equalListMin && equalListMin != 0)
// item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].LowValue = equalListMin;
// item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].RecentlyDataFlag = true;
// item.CandleDataLists_Im[item.CandleDataLists_Im.Count - 1].EndValue = equalHourList[equalHourList.Count - 1].TradePrice;
// }
// else
// {
// var candle = new CandleData();
// candle.CandleTimeType = (int)MCandleTimeType.H1;
// candle.StartValue = equalHourList[0].TradePrice;
// candle.HighValue = equalListMax;
// candle.LowValue = equalListMin;
// candle.RecentlyDataFlag = true;
// candle.EndValue = equalHourList[equalHourList.Count - 1].TradePrice;
// var date = basicDateTime.AddHours(1);
// date = date.AddMinutes(-1 * callM);
// date = date.AddSeconds(-1 * callS);
// candle.DateTime = date;
// if (item.CandleDataLists_Im.Count > 300)
// item.CandleDataLists_Im.RemoveRange(0, 100);
// item.CandleDataLists_Im.Add(candle);
// }
// }
// var list = tickList.Where(t => t.DateTime > basicDateTime && t.DateTime.Hour != basicDateTime.Hour).ToList();
// if (list.Count > 0)
// {
// //해당 분 고가
// var max = list.Select(t => t.TradePrice).ToList().Max();
// //해당 분 저가
// var low = list.Select(t => t.TradePrice).ToList().Min();
// var candle = new CandleData();
// candle.CandleTimeType = (int)MCandleTimeType.H1;
// candle.StartValue = list[0].TradePrice;
// candle.HighValue = max;
// candle.LowValue = low;
// candle.RecentlyDataFlag = true;
// candle.EndValue = list[list.Count - 1].TradePrice;
// var date = basicDateTime.AddHours(1);
// date = date.AddMinutes(-1 * callM);
// date = date.AddSeconds(-1 * callS);
// candle.DateTime = date;
// if (item.CandleDataLists_Im.Count > 300)
// item.CandleDataLists_Im.RemoveRange(0, 100);
// item.CandleDataLists_Im.Add(candle);
// }
// }
//}
//catch (Exception e)
//{
// throw;
//}
#endregion
}
//});
}
@@ -457,3 +488,4 @@ namespace Million.Manager
}
}
}
;