397 lines
16 KiB
C#
397 lines
16 KiB
C#
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();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 초기 동작
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 거래소 콤보박스 아이템 변경 시 이벤트
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
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());
|
|
}
|
|
|
|
/// <summary>
|
|
/// 전체 종목(마킷)에 대한 데이터 누적
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void button_AllMarketDataAcc_Click(object sender, EventArgs e)
|
|
{
|
|
exchangedData = comboBoxEdit_ExchangePlace.SelectedItem.ToString();
|
|
var dbMarketDataList = CommonProperty.selectedMarketOfPlaceList;
|
|
SetCandleData(exchangedData, dbMarketDataList);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 선택한 종목에 대한 데이터 누적
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
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<MarketData>();
|
|
marketList.Add(CommonProperty.selectedMarketOfPlaceList.FirstOrDefault(t => t.CoinFullName == market));
|
|
|
|
SetCandleData(comboBoxEdit_ExchangePlace.SelectedItem.ToString(), marketList);
|
|
}
|
|
else
|
|
{
|
|
//Select 하세요
|
|
}
|
|
}
|
|
|
|
private void SetCandleData(string placeName, List<MarketData> marketList)
|
|
{
|
|
//Table생성
|
|
CreateTableOfMarket(placeName);
|
|
|
|
//거래소 가져오기
|
|
|
|
var type = CommonProperty.ExchangeWebReqType.UpbitCandleStick;
|
|
|
|
if (placeName.Equals("Bithumb"))
|
|
type = CommonProperty.ExchangeWebReqType.BithumbCandleTicker;
|
|
|
|
var list = new List<int>();
|
|
foreach (var item in checkedListBox1.CheckedItems)
|
|
{
|
|
var data = (CommonProperty.MCandleTimeType)Enum.Parse(typeof(CommonProperty.MCandleTimeType), item.ToString());
|
|
list.Add((int)data);
|
|
}
|
|
|
|
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);
|
|
}
|
|
MessageBox.Show("Completed Set Candle Data");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Market 별 Table 생성
|
|
/// </summary>
|
|
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);
|
|
|
|
if (!string.IsNullOrWhiteSpace(sqlQuery))
|
|
Million.DbManagement.DBConnection.QueryUpdateExecuter(CommonProperty.DbConnectionStr + placeName, sqlQuery);
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 선택한 거래소의 종목(Market) 업데이트
|
|
/// </summary>
|
|
|
|
/// <summary>
|
|
/// Delete 기능 추가
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
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("기간 삭제 완료");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ticker 시작 -> Upbit KRW 만
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void button2_Click(object sender, EventArgs e)
|
|
{
|
|
if (!flag)
|
|
{
|
|
//setting
|
|
flag = true;
|
|
tickThread = new Thread(threadFunction);
|
|
tickThread.Start();
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("Ticker Thread 진행 중");
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Ticker 쌓기 위한 Thread Function
|
|
/// </summary>
|
|
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<Dictionary<string, object>>();
|
|
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<string, object>();
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ticker 정지
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
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;
|
|
}
|
|
/// <summary>
|
|
/// Timer 함수
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
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);
|
|
}
|
|
}
|
|
}
|