Merge branch 'feature/V1.1' of http://222.96.13.116/Million into feature/V1.1

This commit is contained in:
JHLEE
2023-05-16 13:22:39 +09:00
3 changed files with 216 additions and 49 deletions

View File

@@ -352,7 +352,7 @@ namespace Million
var dic = new Dictionary<string, List<SearchResult>>();
Parallel.For(0, tableList.Count, i =>
{
//for (var i = 0; i < tableList.Count; i++)
// for (var i = 0; i < tableList.Count; i++)
//{
var market = tableList[i];
var distinctIndicator = IndicatorSetupManager.Distinct(totalIndicator);
@@ -374,7 +374,7 @@ namespace Million
foreach (var item in dic.Keys)
{
if(dic.ContainsKey(item))
if (dic.ContainsKey(item))
totalResultList.AddRange(dic[item]);
}
@@ -451,7 +451,13 @@ namespace Million
private List<SearchResult> CalculateHunterRealtime(List<IndicatorCoditionSetup> totalIndicator, DateTime startDate, DateTime endDate, MarketData market,
List<IndicatorCoditionSetup> distinctIndicator, Dictionary<string, bool> overlapBuyManagementList,
InteratorScripter buyScript, InteratorScripter sellScript, InteratorScripter sellExceptionScript)
{
{
var totalCandleTypeList = totalIndicator.Select(t => t.MCandleTimeType).ToList();
var maxCandleType = totalCandleTypeList.Max();
var minMaxCandleType = totalCandleTypeList.Where(t => t < MCandleTimeType.H1).Max();
var buyList = new List<CandleDataList>();
var subBuyList = new List<CandleDataList>();
var item = market.CoinFullName;
@@ -460,24 +466,42 @@ namespace Million
var resultData = new List<SearchResult>();
var startMiniuteDate = startDate.AddMinutes(-100);
var startHourDate = startDate.AddHours(-100);
var startMiniuteDate = startDate.AddMinutes((int)minMaxCandleType * -80);
var mCandleTypeList = new List<CommonProperty.MCandleTimeType>();
mCandleTypeList.Add(CommonProperty.MCandleTimeType.M1);
var hCandleTypeList = new List<CommonProperty.MCandleTimeType>();
hCandleTypeList.Add(CommonProperty.MCandleTimeType.H1);
var standardData = DataManager.GetStandardData(totalIndicator, startMiniuteDate, startDate, market, distinctIndicator, true, mCandleTypeList);
var hStandardData = DataManager.GetStandardData(totalIndicator, startHourDate, startDate, market, distinctIndicator, true, hCandleTypeList);
totalCandleTypeList.AddRange(mCandleTypeList);
if (maxCandleType >= MCandleTimeType.H1)
{
var startHourDate = startDate.AddHours((int)maxCandleType / 60 * -80);
var hCandleTypeList = new List<CommonProperty.MCandleTimeType>();
hCandleTypeList.Add(CommonProperty.MCandleTimeType.H1);
var hStandardData = DataManager.GetStandardData(totalIndicator, startHourDate, startDate, market, distinctIndicator, true, hCandleTypeList);
standardData.Add(CommonProperty.MCandleTimeType.H1, hStandardData[CommonProperty.MCandleTimeType.H1]);
totalCandleTypeList.AddRange(hCandleTypeList);
}
totalCandleTypeList = totalCandleTypeList.Distinct().ToList();
foreach(var candleTimeType in totalCandleTypeList)
{
if (standardData.ContainsKey(candleTimeType)) continue;
var candleDataList = standardData[MCandleTimeType.M1];
if (candleTimeType >= MCandleTimeType.H1)
candleDataList = standardData[MCandleTimeType.H1];
standardData[candleTimeType] = DataManager.GetConvertCandleDataList(candleDataList, candleTimeType);
}
standardData.Add(CommonProperty.MCandleTimeType.H1, hStandardData[CommonProperty.MCandleTimeType.H1]);
//속도 및 메모리 부하를 줄이기 위한 로직 추가
//db 전체 데이터 불러오는 로직 -> 1분봉 데이터 하나도 안빠져있다는 가정
#region 개선 후
var standardStartDate = startDate;
var standardEndDate = startDate.AddDays(7);
@@ -524,43 +548,22 @@ namespace Million
}
//remove
if (standardData[CommonProperty.MCandleTimeType.M1].Count > 150)
standardData[CommonProperty.MCandleTimeType.M1].RemoveAt(0);
if (standardData[CommonProperty.MCandleTimeType.H1].Count > 150)
standardData[CommonProperty.MCandleTimeType.H1].RemoveAt(0);
foreach (var key in standardData.Keys) {
if (standardData[key].Count > 150)
standardData[key].RemoveAt(0);
}
//1분씩 증가하면서 1h 처리
//1분씩 증가하면서 나머지 처리
minData.RecentlyDataFlag = true;
standardData[CommonProperty.MCandleTimeType.M1].Add(minData);
var compareHour = standardData[CommonProperty.MCandleTimeType.H1].LastOrDefault();
if (compareHour.DateTime.Hour != minData.DateTime.Hour)
foreach (var key in standardData.Keys)
{
var candle = new CandleData();
candle.CandleTimeType = (int)MCandleTimeType.H1;
candle.StartValue = minData.StartValue;
candle.HighValue = minData.HighValue;
candle.LowValue = minData.LowValue;
candle.RecentlyDataFlag = true;
candle.EndValue = minData.EndValue;
candle.MoneyVolume = minData.MoneyVolume;
var date = compareHour.DateTime.AddHours(1);
date = date.AddMinutes(-1 * date.Minute);
date = date.AddSeconds(-1 * date.Second);
candle.DateTime = date;
standardData[CommonProperty.MCandleTimeType.H1].Add(candle);
}
else
{
compareHour.HighValue = compareHour.HighValue < minData.HighValue ? minData.HighValue : compareHour.HighValue;
compareHour.LowValue = compareHour.LowValue < minData.LowValue ? compareHour.LowValue : minData.LowValue;
compareHour.EndValue = minData.EndValue;
compareHour.RecentlyDataFlag = true;
compareHour.MoneyVolume += minData.MoneyVolume;
var compareData = standardData[key].LastOrDefault();
var newFlag = false;
var candleData = DataManager.GetRecentlyCandleData(minData, compareData, key, ref newFlag);
if (newFlag)
standardData[key].Add(candleData);
}
standardData = DataManager.GetExecuteData(standardData, totalIndicator);
@@ -584,11 +587,9 @@ namespace Million
mDataList.CandleDataLists_Im.RemoveAt(0);
continue;
}
var recentlyDate = recentlyData.DateTime;
recentlyDate = recentlyDate.AddMinutes(recentlyDate.Minute * -1);
recentlyDate = recentlyDate.AddHours( -1);
//before 데이터 가져오는 함수
var beforeData = standardData[MCandleTimeType.H1].FirstOrDefault(t => t.DateTime == recentlyDate);
//before 데이터 가져오는 함수 -> 사는 케이스만
var beforeData = standardData[maxCandleType].LastOrDefault();
if (!buyList.Any(t => t.ConGoodsData.CoinFullName == item))
{

View File

@@ -137,13 +137,23 @@ namespace Million
public enum MCandleTimeType
{
M1 = 1,
M2 = 2,
M3 = 3,
M4 = 4,
M5 = 5,
M6 = 6,
M10 = 10,
M12 = 12,
M15 = 15,
M20 = 20,
M30 = 30,
H1 = 60,
H2 = 120,
H3 = 180,
H4 = 240,
H6 = 360,
H8 = 480,
H12 = 720,
D1 = 1000,
W1 = 10000,
MT1 = 100000

View File

@@ -219,5 +219,161 @@ namespace Million.Manager
result.SellCount = sellCandleData.BuyCount;
return result;
}
/// <summary>
/// CandleList 만들어주는거
/// </summary>
/// <param name="currentCandleList"></param>
/// <param name="mCandleTimeType"></param>
/// <returns></returns>
public static List<CandleData> GetConvertCandleDataList(List<CandleData> currentCandleList, MCandleTimeType mCandleTimeType) {
var returnData = new List<CandleData>();
var timeFlag = "minute";
var timeFlagValue = 0;
if(mCandleTimeType < MCandleTimeType.H1)
{
timeFlagValue = (int)mCandleTimeType;
}
else if(mCandleTimeType < MCandleTimeType.D1)
{
timeFlag = "hour";
timeFlagValue = ((int) mCandleTimeType) / 60;
}
var firstFlag = true;
foreach(var item in currentCandleList)
{
var flag = false;
var recentlyData = returnData.LastOrDefault();
if (recentlyData != null)
{
if (timeFlag == "minute")
{
if (item.DateTime.Minute % timeFlagValue == 0)
{
if (recentlyData.DateTime.Minute != item.DateTime.Minute)
flag = true;
}
}
else if (timeFlag == "hour")
{
if (item.DateTime.Hour % timeFlagValue == 0)
{
if (recentlyData.DateTime.Hour != item.DateTime.Hour)
flag = true;
}
}
}
if (firstFlag)
{
firstFlag = false;
flag = true;
}
//새로 생성
if (flag)
{
returnData.Add(item);
}
//기존 데이터 엎어쓰기
else
{
recentlyData.HighValue = recentlyData.HighValue < item.HighValue ? item.HighValue : recentlyData.HighValue;
recentlyData.LowValue = recentlyData.LowValue < item.LowValue ? recentlyData.LowValue : item.LowValue;
recentlyData.EndValue = item.EndValue;
recentlyData.MoneyVolume += item.MoneyVolume;
}
}
return returnData;
}
/// <summary>
/// 최근 데이터 업데이트 하는 로직
/// </summary>
/// <param name="candleData"></param>
/// <param name="recentlyData"></param>
/// <param name="mCandleTimeType"></param>
/// <param name="newFlag"></param>
/// <returns></returns>
public static CandleData GetRecentlyCandleData(CandleData candleData, CandleData recentlyData, MCandleTimeType mCandleTimeType, ref bool newFlag)
{
var timeFlag = "minute";
var timeFlagValue = 0;
if (mCandleTimeType < MCandleTimeType.H1)
{
timeFlagValue = (int)mCandleTimeType;
}
else if (mCandleTimeType < MCandleTimeType.D1)
{
timeFlag = "hour";
timeFlagValue = ((int)mCandleTimeType) / 60;
}
var flag = false;
if (recentlyData != null)
{
if (timeFlag == "minute")
{
if (candleData.DateTime.Minute % timeFlagValue == 0)
{
if (recentlyData.DateTime.Minute != candleData.DateTime.Minute)
flag = true;
}
}
else if (timeFlag == "hour")
{
if (candleData.DateTime.Hour % timeFlagValue == 0)
{
if (recentlyData.DateTime.Hour != candleData.DateTime.Hour)
flag = true;
}
}
}
//새로 생성
if (flag)
{
newFlag = true;
var candle = new CandleData();
candle.CandleTimeType = (int)mCandleTimeType;
candle.StartValue = candleData.StartValue;
candle.HighValue = candleData.HighValue;
candle.LowValue = candleData.LowValue;
candle.RecentlyDataFlag = true;
candle.EndValue = candleData.EndValue;
candle.MoneyVolume = candleData.MoneyVolume;
if (timeFlag == "minute")
{
var date = recentlyData.DateTime.AddMinutes((int)mCandleTimeType);
date = date.AddSeconds(-1 * date.Second);
candle.DateTime = date;
}
else if (timeFlag == "hour")
{
var date = recentlyData.DateTime.AddHours((int)mCandleTimeType/60);
date = date.AddMinutes(-1 * date.Minute);
date = date.AddSeconds(-1 * date.Second);
candle.DateTime = date;
}
return candle;
}
//기존 데이터 엎어쓰기
else
{
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.MoneyVolume += candleData.MoneyVolume;
return recentlyData;
}
}
}
}