diff --git a/Million Buyer/MainForm.cs b/Million Buyer/MainForm.cs index 514672f..12e9919 100644 --- a/Million Buyer/MainForm.cs +++ b/Million Buyer/MainForm.cs @@ -412,7 +412,7 @@ namespace Million_Buyer sw.Stop(); if (sw.Elapsed.TotalSeconds > 1) InsertLog("Execute 계산 시간 : " + sw.Elapsed.ToString()); - + var minDateTime = dic[MCandleTimeType.M1].Select(t => t.DateTime).Min(); var maxDateTime = dic[MCandleTimeType.M1].Select(t => t.DateTime).Max().AddHours(1); @@ -425,9 +425,24 @@ namespace Million_Buyer #region 사고 파는 로직 //최신 데이터 가져오기 - var recentlyData = dic[MCandleTimeType.M1][dic[MCandleTimeType.M1].Count - 1]; + var recentlyDataList = dic[MCandleTimeType.M1].Where(t=>t.RecentlyDataFlag).ToList(); + if (recentlyDataList.Count == 0) + continue; + var maxTime = recentlyDataList.Select(t => t.DateTime).Max(); + var recentlyData = recentlyDataList.FirstOrDefault(t => t.DateTime == maxTime); + if (recentlyData == null) continue; + + // Parent Recently Data는 indicator에 따라 달라질수 있으므로 전부다 처리한 후 초기화 + foreach (var data in dic) + { + var recentlyList = data.Value.Where(t => t.RecentlyDataFlag).ToList(); + + foreach (var recentlyItem in recentlyList) + recentlyItem.RecentlyDataFlag = false; + } + /* * 로직 설명 * 1. Buy List에 있는지 확인 @@ -473,6 +488,11 @@ namespace Million_Buyer { recentlyData.BuyCount = Math.Round(cycleBuyMoney / recentlyData.BuyValue, 8); buyData.Uuid = OrderBuy(buyData.ConGoodsData.CoinFullName, recentlyData.BuyCount, recentlyData.BuyValue); + if (buyData.Uuid == "") + { + InsertLog("Return Data 가 에러라서 구매 불가. Log 확인 바람"); + continue; + } buyCycleCount++; } @@ -783,6 +803,7 @@ namespace Million_Buyer InsertLog("------------------------------------"); InsertLog("Buy Return Data : " + JsonConvert.SerializeObject(returnData)); InsertLog("------------------------------------"); + if (returnData == null) return ""; return returnData.Uuid; } diff --git a/Million Prototype/Form1.cs b/Million Prototype/Form1.cs index c3cbd6e..0d2489f 100644 --- a/Million Prototype/Form1.cs +++ b/Million Prototype/Form1.cs @@ -158,9 +158,9 @@ namespace Million_Prototype //사고 파는 rex 데이터 가져오는 부분 var buyRex = savedResultData.BuyRegularExpression; var sellRex = savedResultData.SellRegularExpression; - var buyScript = new InteratorScripter(); + var buyScript = new InteratorScripter(""); buyScript.regularExpressionString = buyRex; - var sellScript = new InteratorScripter(); + var sellScript = new InteratorScripter(""); sellScript.regularExpressionString = sellRex; //save 데이터 @@ -844,7 +844,7 @@ namespace Million_Prototype ss123 = aa1.Except(aa4); - InteratorScripter ss = new InteratorScripter(); + InteratorScripter ss = new InteratorScripter(""); ss.regularExpressionString = aa; ss.DicExcuteScript(aa1); diff --git a/Million/Data/Upbit/Ticker.cs b/Million/Data/Upbit/Ticker.cs index 3e8df56..01ff48f 100644 --- a/Million/Data/Upbit/Ticker.cs +++ b/Million/Data/Upbit/Ticker.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; @@ -118,5 +120,51 @@ namespace Million.Data.Upbit /// public DateTime LowstPriceDateOf52Week { get; set; } + public object DeepClone(object obj) + { + object objResult = null; + + using (var ms = new MemoryStream()) + { + var bf = new BinaryFormatter(); + bf.Serialize(ms, obj); + + ms.Position = 0; + objResult = bf.Deserialize(ms); + } + + return objResult; + } + + public Ticker Clone() + { + var ticker = new Ticker(); + + ticker.DateTime = DateTime; + ticker.CoinFullName = CoinFullName; + ticker.TradeDateTime = TradeDateTime; + ticker.OpeningPrice = OpeningPrice; + ticker.HighPrice = HighPrice; + ticker.LowPrice = LowPrice; + ticker.TradePrice = TradePrice; + ticker.BeforeDayClosePrice = BeforeDayClosePrice; + ticker.TrendType = TrendType; + ticker.AbsoluteChangePrice = AbsoluteChangePrice; + ticker.AbsoluteChangeRate = AbsoluteChangeRate; + ticker.SignedChangePrice = SignedChangePrice; + ticker.SignedChangeRate = SignedChangeRate; + ticker.TradeVolume = TradeVolume; + ticker.AccumulateTradePrice = AccumulateTradePrice; + ticker.AccumulateTradePrice24 = AccumulateTradePrice24; + ticker.AccumulateTradeVolume = AccumulateTradeVolume; + ticker.AccumulateTradeVolume24 = AccumulateTradeVolume24; + ticker.HighstPriceOf52Week = HighstPriceOf52Week; + ticker.HighstPriceDateOf52Week = HighstPriceDateOf52Week; + ticker.LowstPriceOf52Week = LowstPriceOf52Week; + ticker.LowstPriceDateOf52Week = LowstPriceDateOf52Week; + + return ticker; + + } } } diff --git a/Million/Manager/CalculateManager.cs b/Million/Manager/CalculateManager.cs index 7fd361e..c7a4020 100644 --- a/Million/Manager/CalculateManager.cs +++ b/Million/Manager/CalculateManager.cs @@ -346,7 +346,7 @@ namespace Million.Manager //단순비교 else if (setUp.SubIndicatorSetupType == SubIndicatorSetupType.단순비교) { - SimpleComparison(setUp, parentCandleDataList, childrenCandleDataList, recentlyDataFlag); + SimpleComparison(setUp, parentCandleDataList, childrenCandleDataList, recentlyDataFlag, coinFullName); } //최초돌파 else if (setUp.SubIndicatorSetupType == SubIndicatorSetupType.최초돌파) @@ -603,6 +603,10 @@ namespace Million.Manager { var dic = parent.CalculateFlag; + var val = GetValueData(subIndi, parent, subKey); + + + //Sub 조건 만족 여부 if (subScript.DicExcuteScript(dic)) { @@ -613,6 +617,11 @@ namespace Million.Manager subFlag = false; var str = ""; + if(val < parent.EndValue) + { + + } + if (recentlyDataFlag) { if (!subManagement[coinFullName]) @@ -835,7 +844,7 @@ namespace Million.Manager /// /// /// - public static void SimpleComparison(IndicatorCoditionSetup setUp, List parentCandleDataList, List childrenCandleDataList, bool recentlyDataFlag) + public static void SimpleComparison(IndicatorCoditionSetup setUp, List parentCandleDataList, List childrenCandleDataList, bool recentlyDataFlag, string coinFullName) { //비교할 데이터 Key 설정 var key = GetKeyData(setUp); @@ -871,9 +880,10 @@ namespace Million.Manager { compareFlag = CompareSettingValueOfTranspierce(setUp.IndicatorOver, overlapData, value); } - + if (compareFlag) { + item.CalculateFlag[setUp.IndexString] = true; var childList = new List(); if (item.CandleTimeType == (int)MCandleTimeType.M1) { @@ -971,6 +981,7 @@ namespace Million.Manager if (flag) { child.CalculateFlag[setUp.IndexString] = true; + } } } @@ -1014,7 +1025,7 @@ namespace Million.Manager } } } - item.CalculateFlag[setUp.IndexString] = true; + } } } diff --git a/Million/Manager/IndicatorSetupManager.cs b/Million/Manager/IndicatorSetupManager.cs index 4c0bd29..9e6074b 100644 --- a/Million/Manager/IndicatorSetupManager.cs +++ b/Million/Manager/IndicatorSetupManager.cs @@ -97,7 +97,7 @@ namespace Million.Manager // Sub Indicator Class var subIndicator = totalIndicators.Where(t => subIndStringList.Any(u => u == t.IndexString)).ToList(); - + // 선처리 CalculateManager.GetCalculateIndicator(totalIndicators, subIndStringList, null, startDate, endDate, dic[MCandleTimeType.M1], subIndicator, dic, recentlyDataFlag, upperMainIndicatorFlag, coinFullName); @@ -110,19 +110,7 @@ namespace Million.Manager // 후처리 CalculateManager.GetCalculateIndicator(totalIndicators, totalIndi, null, startDate, - endDate, dic[MCandleTimeType.M1], subIndicator, dic, recentlyDataFlag, upperMainIndicatorFlag, coinFullName); - - - // Parent Recently Data는 indicator에 따라 달라질수 있으므로 전부다 처리한 후 초기화 - if (recentlyDataFlag) - foreach (var data in dic) - { - var recentlyList = data.Value.Where(t => t.RecentlyDataFlag).ToList(); - - foreach (var recentlyItem in recentlyList) - recentlyItem.RecentlyDataFlag = false; - } - + endDate, dic[MCandleTimeType.M1], subIndicator, dic, recentlyDataFlag, upperMainIndicatorFlag, coinFullName); return dic; } } diff --git a/Million/Manager/RealtimeDataSettingManager.cs b/Million/Manager/RealtimeDataSettingManager.cs index ccdfdda..7daa1df 100644 --- a/Million/Manager/RealtimeDataSettingManager.cs +++ b/Million/Manager/RealtimeDataSettingManager.cs @@ -108,7 +108,7 @@ namespace Million.Manager this.tc = new TimerCallback(TimerEvent); // 이벤트 발생 처리 루틴 //0.5초 마다 쌓는거 진행 -> DB데이터 가지고와서 부터 데이터 처리 - this.timer = new System.Threading.Timer(tc, null, 0, 1000); + this.timer = new System.Threading.Timer(tc, null, 0, 500); flag = true; } @@ -158,23 +158,31 @@ namespace Million.Manager var candleList = candleDatas[type]; //Parallel.ForEach(candleList, item => //{ + var tickList = new List(); + var cloneTickList = new List(); + lock (obj) + { + try + { + foreach (var item in tickerList) + { + cloneTickList.Add(item.Clone()); + } + } + catch (Exception e) + { + LogManager.WriteLog(e.Message); + } + } + foreach (var item in candleList) { if (item.CandleDataLists_Im.Count > 0) basicDateTime = item.CandleDataLists_Im.Select(t => t.DateTime).Max(); var coinFullName = item.ConGoodsData.CoinFullName; - List tickList = null; - lock (obj) - { - try - { - tickList = tickerList.Where(t => t.CoinFullName == coinFullName && basicDateTime < t.DateTime).OrderBy(t => t.DateTime).ToList(); - } - catch (Exception e) { - LogManager.WriteLog(e.Message); - } - } + + tickList = cloneTickList.Where(t => t.CoinFullName == coinFullName).ToList(); // 호출 당시 시, 분, 초 var callH = basicDateTime.Hour; diff --git a/Million/WebMangement/Upbit/UpbitAPI.cs b/Million/WebMangement/Upbit/UpbitAPI.cs index 0322c19..f69fa73 100644 --- a/Million/WebMangement/Upbit/UpbitAPI.cs +++ b/Million/WebMangement/Upbit/UpbitAPI.cs @@ -232,6 +232,9 @@ namespace Million.WebMangement.Upbit if (price != 0) namevalCollection.Add("price", price.ToString()); + var logStr = coinFullName + " 주문 금액 : " + price.ToString() + ", 주문량 : " + volume.ToString() + "\r\n"; + + LogManager.WriteLog(logStr, coinFullName); var resResult = process.CallAPI(url, HttpMethod.Post, namevalCollection); Order returnData; @@ -251,7 +254,7 @@ namespace Million.WebMangement.Upbit if (cnt == 10) { insertLog("Try Order Count 넘어감 -> CNT : " + cnt); - var logStr = coinFullName + " 주문 에러!! 주문 returnData : " + JsonConvert.SerializeObject(returnData) + "\r\n" + logStr = coinFullName + " 주문 에러!! 주문 returnData : " + JsonConvert.SerializeObject(returnData) + "\r\n" + "resResult : " + resResult; LogManager.WriteLog(logStr, coinFullName); break; diff --git a/Million/WebMangement/WebServiceFunctions.cs b/Million/WebMangement/WebServiceFunctions.cs index 33ca817..301b30c 100644 --- a/Million/WebMangement/WebServiceFunctions.cs +++ b/Million/WebMangement/WebServiceFunctions.cs @@ -279,7 +279,7 @@ namespace Million.WebServices { var returnData = new List(); var datas = JsonConvert.DeserializeObject>>(resResult.ToString()); - var dateTimeData = DateTime.Now; + foreach (var item in datas) { double.TryParse(item["opening_price"]?.ToString(), out var opening_price); @@ -301,11 +301,14 @@ namespace Million.WebServices double.TryParse(item["timestamp"]?.ToString(), out var timeStamp); var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); - dateTime = dateTime.AddSeconds(timeStamp); - + dateTime = dateTime.AddMilliseconds(timeStamp); + dateTime = dateTime.AddHours(9); var dateStr = item["trade_date"]?.ToString() + item["trade_time"]?.ToString(); - + if(!(dateTime.Day == DateTime.Now.Day && dateTime.Hour == DateTime.Now.Hour && dateTime.Minute == DateTime.Now.Minute)) + { + continue; + } var data = new Ticker(); data.CoinFullName = item["market"]?.ToString(); data.TradeDateTime = DateTime.ParseExact(dateStr, "yyyyMMddHHmmss", null);