using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Million.SaveData; using Million.FileDBManagement; using Million.Data; using DevExpress.XtraTreeList; using Million.DbManagement; using Million.IndicatorConditionSetup; using Million.Manager; using Million_Hunter.HunterSubForm; namespace Million.HunterSubForm { public partial class ResultViewerForm : DevExpress.XtraEditors.XtraForm { // 저장 또는 불러온 Result Data public SavedResultData _savedResultData; // TreeList에 옮길 가공 데이터 public List_analysisDatas; // Analysis Data 를 Load 하는 경우 저장 변수 public SavedAnalysisData _savedAnalysisData; public List _totalIndicator; public ResultViewerForm(SavedResultData savedResultData) { InitializeComponent(); _savedResultData = savedResultData; InitForm(); } private void InitForm() { // 1. 결과 데이터 TreeList에 표기 // 시간 데이터 추가 //_savedResultData.SearchResultList.ToLookup() dateEdit_StartDateTime.DateTime = _savedResultData.StartDateTime.Date; dateEdit_EndDateTime.DateTime = _savedResultData.EndDateTime.Date; dateEdit_SavedDateTime.DateTime = _savedResultData.SavedDateTime.Date; textEdit_SellRegularExpression.Text = _savedResultData.BuyRegularExpression; textEdit_BuyRegularExpression.Text = _savedResultData.SellRegularExpression; // Buy/Sell 리스트에 데이터 추가 treeList_BuySetupList.DataSource = _savedResultData.BuySetupList; treeList_SellSetupList.DataSource = _savedResultData.SellSetupList; treeList_BuySetupList.RefreshDataSource(); var buyIndicatorList = IndicatorSetupManager.InitDataSetup(_savedResultData.BuySetupList); var sellIndicatorList = IndicatorSetupManager.InitDataSetup(_savedResultData.SellSetupList); _totalIndicator = new List(); _totalIndicator.AddRange(buyIndicatorList); _totalIndicator.AddRange(sellIndicatorList); if (_analysisDatas != null) { // 메모리 헤제 _analysisDatas.Clear(); _analysisDatas = null; } _analysisDatas = new List(); // 평균 승률 계산하기 double winRate = 0; // 평균 수익률 계산하기 double profitRate = 0; // 데이터 가공하기 (List _analysisDatas) foreach (var searchResult in _savedResultData.SearchResultList) { var analysisData = AnalysisData.GetAnalysisData(true, searchResult.MarketData.ExchangePlace, searchResult.MarketData.CoinFullName, searchResult.MarketData.KorName, searchResult.BuyValueList.Count, searchResult.StartDate, searchResult.BuyValueList.First(), searchResult.EndDate, searchResult.SellValue, searchResult.FirstEarningRate, searchResult.FirstWinFlag, "", searchResult); // 승률 계산하기 if (searchResult.FirstWinFlag) winRate++; // 수익률 계산하기 profitRate += searchResult.FirstEarningRate; _analysisDatas.Add(analysisData); } winRate = winRate * 100 / _analysisDatas.Count(); labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2}", double.Parse(winRate.ToString()), double.Parse(profitRate.ToString()), _analysisDatas.Count()); treeList_ResultData.DataSource = _analysisDatas; treeList_ResultData.RefreshDataSource(); } // 분석 결과 저장 버튼 클릭 이벤트 private void simpleButton_SavaAnalysisData_Click(object sender, EventArgs e) { // 결과 반영 체크 && Filter 된 노드만 리스트로 모음 //var nodeList = treeList_ResultData.FindNodes(item => item.Visible == true && Convert.ToBoolean(item["Inclusion"]) == true); var nodeList = treeList_ResultData.FindNodes(item => item.Visible == true); // 저장할 데이터 리스트 var saveDataList = new List(); // 평균 승률 계산하기 double winRate = 0; // 평균 수익률 계산하기 double profitRate = 0; // 값이 있으면 저장 if (nodeList != null && nodeList.Count() > 0) { foreach (var node in nodeList) { var data = (AnalysisData)treeList_ResultData.GetDataRecordByNode(node); // 승률 계산하기 if (data.WinFlag) winRate++; // 수익률 계산하기 profitRate += data.EarningRate; saveDataList.Add(data); // 비고 저장 //data.Description = } winRate = winRate * 100 / nodeList.Count(); } // 저장 데이터 클래스 만들기 SavedAnalysisData savedAnalysisData = new SavedAnalysisData() { AnalysisDataList = saveDataList, TreeListFilterString = treeList_ResultData.ActiveFilterString.Replace("'", ""), Description = textEdit_Description.Text, FirstWinRate = winRate, FirstProfitRate = profitRate, ResultDataCount = saveDataList.Count, SavedTime = DateTime.Now }; // 저장 하기 if (DBConnection.QueryInsertExecuter_SavedAnalysisData(savedAnalysisData, _savedResultData)) { MessageBox.Show("데이터 저장 성공"); textEdit_Description.Text = ""; } else MessageBox.Show("데이터 저장 실패"); } // 결과 분석 데이터 불러오기 버튼 클릭 이벤트 private void simpleButton_LoadAnalysisResultData_Click(object sender, EventArgs e) { var loadAnalysisResultDataForm = new LoadAnalysisResultDataForm(this); loadAnalysisResultDataForm.StartPosition = FormStartPosition.CenterParent; if(loadAnalysisResultDataForm.ShowDialog(this) == DialogResult.OK) { // 정상으로 데이터를 로드 하면 if(_savedAnalysisData != null) { treeList_ResultData.Nodes.Clear(); treeList_ResultData.DataSource = _savedAnalysisData.AnalysisDataList; treeList_ResultData.RefreshDataSource(); labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2}", double.Parse(_savedAnalysisData.FirstWinRate.ToString()), double.Parse(_savedAnalysisData.FirstProfitRate.ToString()), _savedAnalysisData.AnalysisDataList.Count); } } } private void simpleButton_resetData_Click(object sender, EventArgs e) { // 데이터 초기화 InitForm(); } // Analysis 데이터 더블 클릭 private void treeList_ResultData_MouseDoubleClick(object sender, MouseEventArgs e) { var treeList = sender as TreeList; if (treeList == null) return; var hitInfo = treeList.CalcHitInfo(e.Location); if (hitInfo.HitInfoType != HitInfoType.Cell) return; var selectedAnalysisData = (AnalysisData)treeList.GetDataRecordByNode(hitInfo.Node); Million.SubForm.ChartViewerForm chartViewerForm = new Million.SubForm.ChartViewerForm(selectedAnalysisData, _totalIndicator); chartViewerForm.Visible = true; } // 승률(수익률 계산) private void simpleButton_WinRateProfitRate_Click(object sender, EventArgs e) { CalcurateProfitAndWinRate(); } /// /// 승률 및 수익률 계산 함수 /// public void CalcurateProfitAndWinRate() { // 승률 수익률 계산하기 // 결과 반영 체크 && Filter 된 노드만 리스트로 모음 var nodeList = treeList_ResultData.FindNodes(item => item.Visible == true && Convert.ToBoolean(item["Inclusion"]) == true); // 평균 승률 계산하기 double winRate = 0; // 평균 수익률 계산하기 double profitRate = 0; // 값이 있으면 저장 if (nodeList != null && nodeList.Count() > 0) { foreach (var node in nodeList) { var data = (AnalysisData)treeList_ResultData.GetDataRecordByNode(node); // 승률 계산하기 if (data.WinFlag) winRate++; // 수익률 계산하기 profitRate += data.EarningRate; } winRate = winRate * 100 / nodeList.Count(); } labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2}", double.Parse(winRate.ToString()), double.Parse(profitRate.ToString()), nodeList.Count()); } private void treeList_ResultData_KeyUp(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Space: var selections = treeList_ResultData.Selection; foreach (var item in selections) { item["Inclusion"] = !Convert.ToBoolean(item["Inclusion"]); } break; } } /// /// 테스트보드 창 열기 /// /// /// private void simpleButton_TestBoard_Click(object sender, EventArgs e) { // 테스트 보드 창 만들기 TestBoardForm testBoard = new TestBoardForm(this); testBoard.Show(); } } }