diff --git a/Million Buyer/MainForm.cs b/Million Buyer/MainForm.cs index 662fa84..3a2171e 100644 --- a/Million Buyer/MainForm.cs +++ b/Million Buyer/MainForm.cs @@ -27,8 +27,13 @@ namespace Million_Buyer { public partial class MainForm : Form { - bool RealTimeMode = true; - + /* + * mode = 0 실시간 검증 모드 + * mode = 1 Buyer 모드 + * mode = 2 DB Ticker 데이터 검증 모드 + */ + int programMode = 0; + private SavedResultData _saveResultData; //결과 데이터 private List resultDataList; @@ -90,7 +95,7 @@ namespace Million_Buyer private void rd_Realtime_CheckedChanged(object sender, EventArgs e) { mode = "RealTime"; - RealTimeMode = true; + programMode = 0; SetReadOnly(true); } @@ -102,7 +107,7 @@ namespace Million_Buyer private void rd_buyer_CheckedChanged(object sender, EventArgs e) { mode = "Buyer"; - RealTimeMode = false; + programMode = 1; SetReadOnly(false); } @@ -156,7 +161,7 @@ namespace Million_Buyer CommonProperty.UpperMainIndicatorFlag = cb_UpperMainIndi.Checked; CommonProperty.DownBeforeValueFlag = cb_DownBeforeValueFlag.Checked; - if (!RealTimeMode) + if (programMode == 1) { if (cycleCount == 0 || cycleBuyMoney == 0) { @@ -173,7 +178,7 @@ namespace Million_Buyer thread.Start(); //실시간 검증에는 동작하지 않음 - if (!RealTimeMode) + if (programMode == 1) { orderThread = new Thread(OrderThreadFunction); orderThread.Start(); @@ -327,7 +332,7 @@ namespace Million_Buyer //구매 후 데이터 여러개 계속 겹치는 경우 제외하기 위한 List var overlapBuyManagementList = new Dictionary(); - int firstFlag = 0; + bool firstFlag = true; RealtimeDataSettingManager realTimeMsg = null; @@ -339,7 +344,7 @@ namespace Million_Buyer lb_StartDate.Text = standardTime.ToString("yyyy-MM-dd HH:mm:ss"); })); - if (RealTimeMode) + if (programMode == 0) InsertLog("실시간 검증 구동 중.."); else InsertLog("Buyer 구동 중.."); @@ -347,6 +352,7 @@ namespace Million_Buyer var cnt = 0; sw.Start(); #endregion + while (ThreadFlag) { try @@ -360,60 +366,24 @@ namespace Million_Buyer #region 기본 데이터 Setting - if (firstFlag == 0) + if (firstFlag) { realTimeMsg = new RealtimeDataSettingManager(null, this.payment); dataList = realTimeMsg.GetRealTimeCandleData(candleTypeList, 200); - - foreach (var item in realTimeMsg.coinFullNameList) + this.BeginInvoke(new Action(delegate () { - if (cb_IncludeClearIndicator.Checked) - overlapBuyManagementList[item] = false; - else - overlapBuyManagementList[item] = true; - } + InitManager.BuyerInit(cb_IncludeClearIndicator.Checked, overlapBuyManagementList, totalIndicatorList); + })); - foreach (var item in totalIndicatorList) - { - var dic = new Dictionary(); - foreach (var codeFullname in realTimeMsg.coinFullNameList) - { - if (cb_IncludeClearIndicator.Checked) - dic[codeFullname] = false; - else - dic[codeFullname] = true; - } - CommonProperty.subIndicatorStateManagement[item.IndexString] = dic; - } #region TODO 이미 구매되어 있는 종목에 대한 기본 데이터 Setting 필요 - if (!RealTimeMode) + if (programMode == 1) { - foreach(var item in this.accounts) - { - if(item.Currency != "KRW") - { - var buyItem = new CandleDataList(); - buyItem.Uuid = ""; - - var temp = dataList[MCandleTimeType.M1].FirstOrDefault(t => t.ConGoodsData.CoinFullName == item.UnitCurrency + "-" + item.Currency); - if (temp == null) continue; - - buyItem.ConGoodsData = temp.ConGoodsData; - var candle = new CandleData(); - candle.BuyTime = new DateTime(2000, 1, 1); - candle.BuyValue = item.AvgBuyPrice; - candle.BuyCount = item.Balance; - buyItem.CandleDataLists_Im.Add(candle); - - buyList.Add(buyItem); - } - } + buyList = InitManager.GetBuyListofAccounts(this.accounts, dataList); this.BeginInvoke(new Action(delegate () { try { - foreach (var item in buyList) { var recentlyData = item.CandleDataLists_Im[0]; @@ -432,11 +402,11 @@ namespace Million_Buyer InsertLog("이전에 사놓은 개수 입력 관련 에러" + e.Message); } })); - } #endregion - firstFlag = 1; + firstFlag = false; + InsertLog("Deafult Data Setting 완료.."); sw.Stop(); InsertLog("Default 계산 시간 : " + sw.Elapsed.ToString()); @@ -444,35 +414,21 @@ namespace Million_Buyer } else { - if (firstFlag == 1) - { - sw.Restart(); - dataList = realTimeMsg.ProcessRecentlyCandleDatas(dataList, candleTypeList); - sw.Stop(); - if (sw.Elapsed.TotalSeconds > 1) - InsertLog("Ticker 계산 시간 : " + sw.Elapsed.ToString()); - } + sw.Restart(); + dataList = realTimeMsg.ProcessRecentlyCandleDatas(dataList, candleTypeList); + sw.Stop(); + if (sw.Elapsed.TotalSeconds > 1) + InsertLog("Ticker 계산 시간 : " + sw.Elapsed.ToString()); } #endregion foreach (var item in realTimeMsg.coinFullNameList) { #region Indicator 계산 -> Code full name 으로 for문 돌면서 계산 처리 - - var dic = new Dictionary>(); - var distinctIndicator = IndicatorSetupManager.Distinct(totalIndicatorList); sw.Restart(); - foreach (var key in dataList.Keys) - { - var candleDataList = dataList[key].FirstOrDefault(t => t.ConGoodsData.CoinFullName == item); - dic[key] = candleDataList.CandleDataLists_Im; - var indicatorSetUpList = distinctIndicator.Where(t => t.MCandleTimeType == key).ToList(); - foreach (var setup in indicatorSetUpList) - { - setup.excute(dic[key], true); - } - } + var dic = DataManager.GetExecuteData(dataList, totalIndicatorList, item); + sw.Stop(); if (sw.Elapsed.TotalSeconds > 1) InsertLog("Execute 계산 시간 : " + sw.Elapsed.ToString()); @@ -488,25 +444,12 @@ namespace Million_Buyer #endregion #region 사고 파는 로직 - //최신 데이터 가져오기 - 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); + //최신 데이터 가져오기 + + var recentlyData = DataManager.GetRecentlyData(dic, MCandleTimeType.M1, true); 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에 있는지 확인 @@ -526,7 +469,7 @@ namespace Million_Buyer if (overlapBuyManagementList[item]) { InsertLog("Insert Buy Logic"); - if (!RealTimeMode) + if (programMode == 1) { LogManager.WriteLog("Buy CoinFullName : " + item + "\r\nCandleData : " + JsonConvert.SerializeObject(recentlyData), "BuySell"); InsertLog("Buy Coin Name : " + item + ", DateTime : " + recentlyData.DateTime.ToString("yyyy-MM-dd HH:mm:ss")); @@ -546,7 +489,7 @@ namespace Million_Buyer buyData.ConGoodsData = dataList[MCandleTimeType.M1].FirstOrDefault(t => t.ConGoodsData.CoinFullName == item).ConGoodsData; // 임시 -> 실시간은 1개만 삿다고 처리 - if (RealTimeMode) + if (programMode != 1) { recentlyData.BuyCount = 1; } @@ -635,7 +578,7 @@ namespace Million_Buyer result.SellCount = sellItem.BuyCount; // buycount 에서 sell count를 제외한 양이 미체결 량 - if (!RealTimeMode) + if (programMode == 1) { LogManager.WriteLog("Sell Point 진입 : " + item, item); InsertLog("Sell Point 진입 : " + item); @@ -714,17 +657,6 @@ namespace Million_Buyer } } - #region Thread 종료 후 후 처리 할 로직 - if (RealTimeMode) - { - - } - else - { - - } - #endregion - SaveData(); InsertLog("Thread Out"); } diff --git a/Million/Manager/DataManager.cs b/Million/Manager/DataManager.cs index 04bdfa7..b939e09 100644 --- a/Million/Manager/DataManager.cs +++ b/Million/Manager/DataManager.cs @@ -58,6 +58,32 @@ namespace Million.Manager return dic; } + /// + /// Recently Data관련 Data Setting 및 데이터 들고오기 + /// + /// + /// + /// + /// + public static Dictionary> GetExecuteData(Dictionary> dataList, List totalIndicatorList, string coinFullName) + { + var dic = new Dictionary>(); + var distinctIndicator = IndicatorSetupManager.Distinct(totalIndicatorList); + + foreach (var key in dataList.Keys) + { + var candleDataList = dataList[key].FirstOrDefault(t => t.ConGoodsData.CoinFullName == coinFullName); + dic[key] = candleDataList.CandleDataLists_Im; + + var indicatorSetUpList = distinctIndicator.Where(t => t.MCandleTimeType == key).ToList(); + foreach (var setup in indicatorSetUpList) + { + setup.excute(dic[key], true); + } + } + return dic; + } + /// /// Sub Indicator List String 반환 Function /// @@ -80,5 +106,43 @@ namespace Million.Manager subIndStringiList = subIndStringiList.Distinct().ToList(); return subIndStringiList; } + + /// + /// Get Recently Data + /// + /// + /// + /// + /// + public static CandleData GetRecentlyData(Dictionary> dic, MCandleTimeType timeType = MCandleTimeType.M1, bool realTimeFlag = false) + { + CandleData returnData = null; + var list = dic[timeType]; + var orderList = list.OrderByDescending(t => t.DateTime).ToList(); + if (orderList.Count > 0) + { + if (realTimeFlag) + { + var recentlyList = orderList.Where(t => t.RecentlyDataFlag).ToList(); + if (recentlyList.Count > 0) + returnData = recentlyList[0]; + } + else + { + returnData = orderList[0]; + } + } + + // 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; + } + + return returnData; + } } } diff --git a/Million/Manager/InitManager.cs b/Million/Manager/InitManager.cs index b1673b4..330ed34 100644 --- a/Million/Manager/InitManager.cs +++ b/Million/Manager/InitManager.cs @@ -1,9 +1,13 @@ -using Million.DbManagement; +using Million.Data; +using Million.Data.Upbit; +using Million.DbManagement; +using Million.IndicatorConditionSetup; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static Million.CommonProperty; namespace Million.Manager { @@ -12,9 +16,10 @@ namespace Million.Manager /// public static class InitManager { + #region Common public static void InitFunc(string marketName, CommonProperty.PaymentType payment) { - DbServiceFunctions.GetMarketTable_FromDB(marketName, payment.ToString()); + DbServiceFunctions.GetMarketTable_FromDB(marketName, Enum.GetName(typeof(PaymentType), payment)); // Result Data DB에 생성 Million.DbManagement.DBConnection.QueryUpdateExcuter @@ -63,5 +68,75 @@ namespace Million.Manager { return Enum.GetNames(enumType: typeof(Million.CommonProperty.PaymentType)); } + + #endregion + + #region Buyer + /// + /// Buyer 관련 Init + /// + /// + /// + /// + public static void BuyerInit(bool checkData, Dictionary overlapBuyManagementList, List totalIndicatorList) + { + var coinFullNameList = CommonProperty.selectedMarketOfPlaceList.Select(t => t.CoinFullName).ToList(); + + + foreach (var item in coinFullNameList) + { + if (checkData) + overlapBuyManagementList[item] = false; + else + overlapBuyManagementList[item] = true; + } + + foreach (var item in totalIndicatorList) + { + var dic = new Dictionary(); + foreach (var codeFullname in coinFullNameList) + { + if (checkData) + dic[codeFullname] = false; + else + dic[codeFullname] = true; + } + CommonProperty.subIndicatorStateManagement[item.IndexString] = dic; + } + } + + /// + /// Buyer에서 사용자가 기존에 가지고 있는 DataList 처리 + /// + /// + /// + /// + public static List GetBuyListofAccounts(List accounts, Dictionary> dataList) + { + var buyList = new List(); + foreach (var item in accounts) + { + if (item.Currency != "KRW") + { + var buyItem = new CandleDataList(); + buyItem.Uuid = ""; + + var temp = dataList[MCandleTimeType.M1].FirstOrDefault(t => t.ConGoodsData.CoinFullName == item.UnitCurrency + "-" + item.Currency); + if (temp == null) continue; + + buyItem.ConGoodsData = temp.ConGoodsData; + var candle = new CandleData(); + candle.BuyTime = new DateTime(2000, 1, 1); + candle.BuyValue = item.AvgBuyPrice; + candle.BuyCount = item.Balance; + buyItem.CandleDataLists_Im.Add(candle); + + buyList.Add(buyItem); + } + } + return buyList; + } + + #endregion } } diff --git a/Million/Manager/RealtimeDataSettingManager.cs b/Million/Manager/RealtimeDataSettingManager.cs index ffc5a1b..bba5fbb 100644 --- a/Million/Manager/RealtimeDataSettingManager.cs +++ b/Million/Manager/RealtimeDataSettingManager.cs @@ -21,9 +21,7 @@ namespace Million.Manager /// public List tickerList = new List(); private object obj = new object(); - public List coinFullNameList = null; - - public List marketList = null; + public List coinFullNameList = null; public PaymentType buyType = PaymentType.KRW; public DateTime basicDateTime { get; set; } public System.Threading.Timer timer = null; @@ -34,14 +32,13 @@ namespace Million.Manager /// public RealtimeDataSettingManager(List coinFullNameList, PaymentType buyType, string tableName = "Upbit") { - this.buyType = buyType; - marketList = DbServiceFunctions.GetMarketDatas(tableName, Enum.GetName(typeof(PaymentType), buyType)); + this.buyType = buyType; //null일경우 전체가 가져옴 if (coinFullNameList == null) { //Upbit로 임시 - this.coinFullNameList = marketList.Select(t => t.CoinFullName).ToList(); + this.coinFullNameList = CommonProperty.selectedMarketOfPlaceList.Select(t => t.CoinFullName).ToList(); } else { @@ -86,7 +83,7 @@ namespace Million.Manager foreach (var item in coinFullNameList) { var val = new CandleDataList(); - val.ConGoodsData = marketList.FirstOrDefault(t => t.CoinFullName == item); + val.ConGoodsData = CommonProperty.selectedMarketOfPlaceList.FirstOrDefault(t => t.CoinFullName == item); val.CandleDataLists_Im = CommonProperty.UpbitApi.GetCandleStics(item, timeType, basicDateTime, count).OrderBy(t => t.DateTime).ToList(); returnData.Add(val); Thread.Sleep(400);