Merge branch 'feature/V1.1' of http://222.96.13.116/Million into feature/V1.1
This commit is contained in:
@@ -352,7 +352,7 @@ namespace Million
|
|||||||
var dic = new Dictionary<string, List<SearchResult>>();
|
var dic = new Dictionary<string, List<SearchResult>>();
|
||||||
Parallel.For(0, tableList.Count, i =>
|
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 market = tableList[i];
|
||||||
var distinctIndicator = IndicatorSetupManager.Distinct(totalIndicator);
|
var distinctIndicator = IndicatorSetupManager.Distinct(totalIndicator);
|
||||||
@@ -374,7 +374,7 @@ namespace Million
|
|||||||
|
|
||||||
foreach (var item in dic.Keys)
|
foreach (var item in dic.Keys)
|
||||||
{
|
{
|
||||||
if(dic.ContainsKey(item))
|
if (dic.ContainsKey(item))
|
||||||
totalResultList.AddRange(dic[item]);
|
totalResultList.AddRange(dic[item]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -451,7 +451,13 @@ namespace Million
|
|||||||
private List<SearchResult> CalculateHunterRealtime(List<IndicatorCoditionSetup> totalIndicator, DateTime startDate, DateTime endDate, MarketData market,
|
private List<SearchResult> CalculateHunterRealtime(List<IndicatorCoditionSetup> totalIndicator, DateTime startDate, DateTime endDate, MarketData market,
|
||||||
List<IndicatorCoditionSetup> distinctIndicator, Dictionary<string, bool> overlapBuyManagementList,
|
List<IndicatorCoditionSetup> distinctIndicator, Dictionary<string, bool> overlapBuyManagementList,
|
||||||
InteratorScripter buyScript, InteratorScripter sellScript, InteratorScripter sellExceptionScript)
|
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 buyList = new List<CandleDataList>();
|
||||||
var subBuyList = new List<CandleDataList>();
|
var subBuyList = new List<CandleDataList>();
|
||||||
var item = market.CoinFullName;
|
var item = market.CoinFullName;
|
||||||
@@ -460,24 +466,42 @@ namespace Million
|
|||||||
|
|
||||||
var resultData = new List<SearchResult>();
|
var resultData = new List<SearchResult>();
|
||||||
|
|
||||||
var startMiniuteDate = startDate.AddMinutes(-100);
|
var startMiniuteDate = startDate.AddMinutes((int)minMaxCandleType * -80);
|
||||||
var startHourDate = startDate.AddHours(-100);
|
|
||||||
|
|
||||||
var mCandleTypeList = new List<CommonProperty.MCandleTimeType>();
|
var mCandleTypeList = new List<CommonProperty.MCandleTimeType>();
|
||||||
mCandleTypeList.Add(CommonProperty.MCandleTimeType.M1);
|
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 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분봉 데이터 하나도 안빠져있다는 가정
|
//db 전체 데이터 불러오는 로직 -> 1분봉 데이터 하나도 안빠져있다는 가정
|
||||||
|
|
||||||
#region 개선 후
|
#region 개선 후
|
||||||
|
|
||||||
var standardStartDate = startDate;
|
var standardStartDate = startDate;
|
||||||
var standardEndDate = startDate.AddDays(7);
|
var standardEndDate = startDate.AddDays(7);
|
||||||
|
|
||||||
@@ -524,43 +548,22 @@ namespace Million
|
|||||||
}
|
}
|
||||||
|
|
||||||
//remove
|
//remove
|
||||||
if (standardData[CommonProperty.MCandleTimeType.M1].Count > 150)
|
foreach (var key in standardData.Keys) {
|
||||||
standardData[CommonProperty.MCandleTimeType.M1].RemoveAt(0);
|
if (standardData[key].Count > 150)
|
||||||
if (standardData[CommonProperty.MCandleTimeType.H1].Count > 150)
|
standardData[key].RemoveAt(0);
|
||||||
standardData[CommonProperty.MCandleTimeType.H1].RemoveAt(0);
|
}
|
||||||
|
|
||||||
//1분씩 증가하면서 1h 처리
|
//1분씩 증가하면서 나머지 처리
|
||||||
minData.RecentlyDataFlag = true;
|
minData.RecentlyDataFlag = true;
|
||||||
standardData[CommonProperty.MCandleTimeType.M1].Add(minData);
|
standardData[CommonProperty.MCandleTimeType.M1].Add(minData);
|
||||||
|
|
||||||
var compareHour = standardData[CommonProperty.MCandleTimeType.H1].LastOrDefault();
|
foreach (var key in standardData.Keys)
|
||||||
|
|
||||||
|
|
||||||
if (compareHour.DateTime.Hour != minData.DateTime.Hour)
|
|
||||||
{
|
{
|
||||||
var candle = new CandleData();
|
var compareData = standardData[key].LastOrDefault();
|
||||||
candle.CandleTimeType = (int)MCandleTimeType.H1;
|
var newFlag = false;
|
||||||
candle.StartValue = minData.StartValue;
|
var candleData = DataManager.GetRecentlyCandleData(minData, compareData, key, ref newFlag);
|
||||||
candle.HighValue = minData.HighValue;
|
if (newFlag)
|
||||||
candle.LowValue = minData.LowValue;
|
standardData[key].Add(candleData);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
standardData = DataManager.GetExecuteData(standardData, totalIndicator);
|
standardData = DataManager.GetExecuteData(standardData, totalIndicator);
|
||||||
@@ -584,11 +587,9 @@ namespace Million
|
|||||||
mDataList.CandleDataLists_Im.RemoveAt(0);
|
mDataList.CandleDataLists_Im.RemoveAt(0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var recentlyDate = recentlyData.DateTime;
|
|
||||||
recentlyDate = recentlyDate.AddMinutes(recentlyDate.Minute * -1);
|
//before 데이터 가져오는 함수 -> 사는 케이스만
|
||||||
recentlyDate = recentlyDate.AddHours( -1);
|
var beforeData = standardData[maxCandleType].LastOrDefault();
|
||||||
//before 데이터 가져오는 함수
|
|
||||||
var beforeData = standardData[MCandleTimeType.H1].FirstOrDefault(t => t.DateTime == recentlyDate);
|
|
||||||
|
|
||||||
if (!buyList.Any(t => t.ConGoodsData.CoinFullName == item))
|
if (!buyList.Any(t => t.ConGoodsData.CoinFullName == item))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -137,13 +137,23 @@ namespace Million
|
|||||||
public enum MCandleTimeType
|
public enum MCandleTimeType
|
||||||
{
|
{
|
||||||
M1 = 1,
|
M1 = 1,
|
||||||
|
M2 = 2,
|
||||||
M3 = 3,
|
M3 = 3,
|
||||||
|
M4 = 4,
|
||||||
M5 = 5,
|
M5 = 5,
|
||||||
|
M6 = 6,
|
||||||
M10 = 10,
|
M10 = 10,
|
||||||
|
M12 = 12,
|
||||||
M15 = 15,
|
M15 = 15,
|
||||||
|
M20 = 20,
|
||||||
M30 = 30,
|
M30 = 30,
|
||||||
H1 = 60,
|
H1 = 60,
|
||||||
|
H2 = 120,
|
||||||
|
H3 = 180,
|
||||||
H4 = 240,
|
H4 = 240,
|
||||||
|
H6 = 360,
|
||||||
|
H8 = 480,
|
||||||
|
H12 = 720,
|
||||||
D1 = 1000,
|
D1 = 1000,
|
||||||
W1 = 10000,
|
W1 = 10000,
|
||||||
MT1 = 100000
|
MT1 = 100000
|
||||||
|
|||||||
@@ -219,5 +219,161 @@ namespace Million.Manager
|
|||||||
result.SellCount = sellCandleData.BuyCount;
|
result.SellCount = sellCandleData.BuyCount;
|
||||||
return result;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user