using Million; using Million.Data; using Million.DbManagement; using Million.Manager; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading; using System.Windows.Forms; namespace DataSaver { public partial class MainForm : Form { // Key(임시) //public static string accessKey = "4jfMUL3lpwJ5GQSszm3rPp5M47tD8ssfIGew2dDb"; //public static string secretKey = "iAasVxQt8CyADjzXaAZiF5VZXTZPdElJOP4m97Bz"; bool flag = false; int hours = 0; Thread tickThread; System.Timers.Timer timer = null; string exchangedData = ""; public MainForm() { InitializeComponent(); //CommonProperty.UpbitApi = new Million.WebMangement.Upbit.UpbitAPI(accessKey, secretKey); InitForm(); } /// /// 초기 동작 /// private void InitForm() { // 거래소 정보 콤보박스 초기화 comboBoxEdit_ExchangePlace.Properties.Items.Clear(); // Million으로부터 거래소 정보 가져오기 comboBoxEdit_ExchangePlace.Properties.Items.AddRange(InitManager.GetMarketList()); // 종목 타입 설정 comboBoxEdit_PaymentType.Properties.Items.AddRange(InitManager.GetPaymentList()); comboBoxEdit_PaymentType.SelectedIndex = 0; /////TODO 임시로 Upbit 우선순위 설정 comboBoxEdit_ExchangePlace.SelectedIndex = 0; InitManager.InitFunc(comboBoxEdit_ExchangePlace.Text, Million.CommonProperty.PaymentType.KRW); for (int i = 0; i < checkedListBox1.Items.Count; i++) { checkedListBox1.SetItemChecked(i, true); } } /// /// 거래소 콤보박스 아이템 변경 시 이벤트 /// /// /// private void comboBoxEdit_ExchangePlace_SelectedIndexChanged(object sender, EventArgs e) { // DB 종목(Market) 정보 가져오기 Million.DbManagement.DbServiceFunctions.GetMarketTable_FromDB(comboBoxEdit_ExchangePlace.SelectedItem.ToString()); var placeType = (CommonProperty.ExchangePlace)Enum.Parse(typeof(CommonProperty.ExchangePlace), comboBoxEdit_ExchangePlace.SelectedItem.ToString()); var paymentType = (CommonProperty.PaymentType)Enum.Parse(typeof(CommonProperty.PaymentType), comboBoxEdit_PaymentType.SelectedItem.ToString()); InitManager.UpdateMarketTableOfPlace(placeType, paymentType); //초창기 생성시에 데이터가 없음으로 Update이 후 재 처리 if (CommonProperty.selectedMarketOfPlaceList == null || CommonProperty.selectedMarketOfPlaceList.Count == 0) Million.DbManagement.DbServiceFunctions.GetMarketTable_FromDB(comboBoxEdit_ExchangePlace.SelectedItem.ToString()); // 데이터 입력 var marketList = CommonProperty.selectedMarketOfPlaceList; comboBoxEdit_MarketInfo.Properties.Items.AddRange(marketList.Select(t => t.CoinName).ToList()); } /// /// 전체 종목(마킷)에 대한 데이터 누적 /// /// /// private void button_AllMarketDataAcc_Click(object sender, EventArgs e) { exchangedData = comboBoxEdit_ExchangePlace.SelectedItem.ToString(); var dbMarketDataList = CommonProperty.selectedMarketOfPlaceList; SetCandleData(exchangedData, dbMarketDataList); } /// /// 선택한 종목에 대한 데이터 누적 /// /// /// private void button_SelectedMarketDataAcc_Click(object sender, EventArgs e) { //Create if (!string.IsNullOrWhiteSpace(comboBoxEdit_PaymentType.SelectedItem?.ToString()) && !string.IsNullOrWhiteSpace(comboBoxEdit_MarketInfo.SelectedItem?.ToString()) ) { var market = comboBoxEdit_PaymentType.SelectedItem.ToString() + "-" + comboBoxEdit_MarketInfo.SelectedItem.ToString(); var marketList = new List(); marketList.Add(CommonProperty.selectedMarketOfPlaceList.FirstOrDefault(t => t.CoinFullName == market)); SetCandleData(comboBoxEdit_ExchangePlace.SelectedItem.ToString(), marketList); } else { //Select 하세요 } } private void SetCandleData(string placeName, List marketList) { //Table생성 CreateTableOfMarket(placeName); //거래소 가져오기 var type = CommonProperty.ExchangeWebReqType.UpbitCandleStick; if (placeName.Equals("Bithumb")) type = CommonProperty.ExchangeWebReqType.BithumbCandleTicker; var list = new List(); foreach (var item in checkedListBox1.CheckedItems) { var data = (CommonProperty.MCandleTimeType)Enum.Parse(typeof(CommonProperty.MCandleTimeType), item.ToString()); list.Add((int)data); } // 거래량 제외 Hunter foreach (var item in list) { var recentlyDbDataList = Million.DbManagement.DbServiceFunctions.GetOldNewDataList_FromDB (marketList, placeName, (CommonProperty.MCandleTimeType)item); Million.DbManagement.DbServiceFunctions.SetCandleData(placeName, type, recentlyDbDataList, (CommonProperty.MCandleTimeType)item); } //거래량 포함 Hunter foreach (var item in list) { var recentlyDbDataList = Million.DbManagement.DbServiceFunctions.GetOldNewDataList_FromDB_All (marketList, placeName, (CommonProperty.MCandleTimeType)item); Million.DbManagement.DbServiceFunctions.SetCandleData_All(placeName, type, recentlyDbDataList, (CommonProperty.MCandleTimeType)item); } MessageBox.Show("Completed Set Candle Data"); } /// /// Market 별 Table 생성 /// private void CreateTableOfMarket(string placeName) { var dbMarketDataList = CommonProperty.selectedMarketOfPlaceList; // table 명으로 사용할 Name List => Primary key var marketNameList = dbMarketDataList.Select(t => t.CoinFullName).ToList(); string sqlQuery = ""; // 없는 테이블 먼저 생성 foreach (var item in marketNameList) sqlQuery += Million.DbManagement.DbServiceFunctions.CreateMarketTable_ToDB(item); sqlQuery += Million.DbManagement.DbServiceFunctions.CreateMarketTable_ToDB_All(); if (!string.IsNullOrWhiteSpace(sqlQuery)) Million.DbManagement.DBConnection.QueryUpdateExecuter(CommonProperty.DbConnectionStr + placeName, sqlQuery); } /// /// 선택한 거래소의 종목(Market) 업데이트 /// /// /// Delete 기능 추가 /// /// /// private void deletebtn_Click(object sender, EventArgs e) { var placeName = comboBoxEdit_ExchangePlace.SelectedItem.ToString(); CreateTableOfMarket(placeName); Million.DbManagement.DbServiceFunctions.GetMarketTable_FromDB(placeName); var dbMarketDataList = CommonProperty.selectedMarketOfPlaceList; if (string.IsNullOrWhiteSpace(de_start.Text)) { MessageBox.Show("Start Date 입력바람"); return; } if (string.IsNullOrWhiteSpace(de_end.Text)) de_end.Text = DateTime.Now.ToString("yyyyy-MM-dd"); var startDateTime = Convert.ToDateTime(de_start.Text).ToString("yyyy-MM-dd 00:00:00"); var endDateTime = Convert.ToDateTime(de_end.Text).ToString("yyyy-MM-dd 00:00:00"); var sqlQuery = ""; var count = 0; foreach (var item in dbMarketDataList) { sqlQuery += string.Format("DELETE FROM [{0}].[dbo].[{1}] WHERE [DateTime] >= '{2}' AND [DateTime] <= '{3}';", placeName, item.CoinFullName, startDateTime, endDateTime); count++; if (count % 50 == 0) { Million.DbManagement.DBConnection.QueryUpdateExecuter(CommonProperty.DbConnectionStr + placeName, sqlQuery); sqlQuery = ""; } } if (!string.IsNullOrWhiteSpace(sqlQuery)) Million.DbManagement.DBConnection.QueryUpdateExecuter(CommonProperty.DbConnectionStr + placeName, sqlQuery); MessageBox.Show("기간 삭제 완료"); } /// /// Ticker 시작 -> Upbit KRW 만 /// /// /// private void button2_Click(object sender, EventArgs e) { if (!flag) { //setting flag = true; tickThread = new Thread(threadFunction); tickThread.Start(); } else { MessageBox.Show("Ticker Thread 진행 중"); } } /// /// Ticker 쌓기 위한 Thread Function /// private void threadFunction() { var placeName = comboBoxEdit_ExchangePlace.SelectedItem.ToString(); CreateTableOfMarket(placeName); DbServiceFunctions.GetMarketTable_FromDB("Upbit", "KRW"); // Result Data DB에 생성 Million.DbManagement.DBConnection.QueryUpdateExecuter (CommonProperty.DbConnectionResultData, DbServiceFunctions.CreateVerifyTickerDataTableQuery()); //market List var dbMarketDataList = CommonProperty.selectedMarketOfPlaceList; var coinFullNameList = dbMarketDataList.Select(t => t.CoinFullName).ToList(); //var date = DateTime.Now; //var hour = date.Hour; var list = new List>(); var saveFlag = true; while (flag) { var date = DateTime.Now; var tickerList = CommonProperty.UpbitApi.GetTickerList(coinFullNameList); var dateData = tickerList[0].DateTime; foreach (var item in coinFullNameList) { var dic = new Dictionary(); var ticker = tickerList.FirstOrDefault(t => t.CoinFullName == item); dic["CoinFullName"] = item; dic["EndValue"] = ticker.TradePrice; dic["DateTime"] = ticker.DateTime; list.Add(dic); } if (date.Minute % 10 == 0 && saveFlag) { list = list.OrderBy(t => ((DateTime)t["DateTime"])).ToList(); var beforeDate = date.AddMinutes(-10); beforeDate = beforeDate.AddSeconds(-1 * beforeDate.Second); beforeDate = beforeDate.AddMilliseconds(-1 * beforeDate.Millisecond); var recentlyDate = date.AddSeconds(-1 * date.Second); recentlyDate = recentlyDate.AddMilliseconds(-1 * date.Millisecond); var dicList = list.Where(t => ((DateTime)t["DateTime"]) >= beforeDate && ((DateTime)t["DateTime"]) < recentlyDate).ToList(); DBConnection.QueryInsertExecuter_VerifyTickerData(dicList, beforeDate); foreach (var item in dicList) { list.Remove(item); } saveFlag = false; } else if (date.Minute % 10 != 0) { saveFlag = true; } //if(hour < DateTime.Now.Hour) //{ // //var insertDateTime = date; // //insertDateTime = insertDateTime.AddMinutes(-1 * insertDateTime.Minute); // //insertDateTime = insertDateTime.AddSeconds(-1 * insertDateTime.Second); // //insertDateTime = insertDateTime.AddMilliseconds(-1 * insertDateTime.Millisecond); // //var dicList = list.Where(t => ((DateTime)t["DateTime"]).Hour == hour).ToList(); // //DBConnection.QueryInsertExecuter_VerifyTickerData(dicList, insertDateTime); // ////clear 작업 // //list = list.OrderBy(t => t["DateTime"]).ToList(); // //var index = list.FindLastIndex(t => ((DateTime)t["DateTime"]).Hour == hour); // //list.RemoveRange(0, index + 1); // //date = DateTime.Now; // //hour = date.Hour; //} Thread.Sleep(1000); } } /// /// Ticker 정지 /// /// /// private void button3_Click(object sender, EventArgs e) { //중지 역할 if (flag) flag = false; Thread.Sleep(1000); if (tickThread.IsAlive) tickThread.Abort(); MessageBox.Show("Ticker Thread Stop 성공"); } private void bt_ScheduleStart_Click(object sender, EventArgs e) { if (timer != null) return; //시작 시 button 모두 disabled button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; bt_ScheduleStart.Enabled = false; bt_ScheduleStop.Enabled = true; button_AllMarketDataAcc.Enabled = false; button_SelectedMarketDataAcc.Enabled = false; deletebtn.Enabled = false; exchangedData = comboBoxEdit_ExchangePlace.SelectedItem.ToString(); var runAt = 1; var min = 60 - DateTime.Now.Minute; var sec = 60 - DateTime.Now.Second; hours = (24 - (+1)) + runAt; var interval = ((hours * 60 * 60) + (min * 60) + sec) * 1000; timer = new System.Timers.Timer(); timer.Interval = interval; timer.Elapsed += new System.Timers.ElapsedEventHandler(ScheduleFun); timer.Start(); } private void bt_ScheduleStop_Click(object sender, EventArgs e) { //멈춤 시 button 모두 enabled button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; bt_ScheduleStart.Enabled = true; bt_ScheduleStop.Enabled = false; button_AllMarketDataAcc.Enabled = true; button_SelectedMarketDataAcc.Enabled = true; deletebtn.Enabled = true; timer.Stop(); timer.Dispose(); timer = null; } /// /// Timer 함수 /// /// /// private void ScheduleFun(object sender, System.Timers.ElapsedEventArgs e) { if (hours != 24) { hours = 24; timer.Interval = hours * 60 * 60 * 1000; } var dbMarketDataList = CommonProperty.selectedMarketOfPlaceList; SetCandleData(exchangedData, dbMarketDataList); } } }